add extra state for waiting on close ack with timeout
[profile/ivi/libwebsockets.git] / lib / libwebsockets.c
1 /*
2  * libwebsockets - small server side websockets and web server implementation
3  *
4  * Copyright (C) 2010 Andy Green <andy@warmcat.com>
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public
8  *  License as published by the Free Software Foundation:
9  *  version 2.1 of the License.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  *  MA  02110-1301  USA
20  */
21
22 #include "private-libwebsockets.h"
23
24 #ifdef WIN32
25
26 #else
27 #include <ifaddrs.h>
28 #endif
29
30 #ifdef LWS_OPENSSL_SUPPORT
31 int openssl_websocket_private_data_index;
32 #endif
33
34 /*
35  * In-place str to lower case
36  */
37
38 static void
39 strtolower(char *s)
40 {
41         while (*s) {
42                 *s = tolower(*s);
43                 s++;
44         }
45 }
46
47 /* file descriptor hash management */
48
49 struct libwebsocket *
50 wsi_from_fd(struct libwebsocket_context *context, int fd)
51 {
52         int h = LWS_FD_HASH(fd);
53         int n = 0;
54
55         for (n = 0; n < context->fd_hashtable[h].length; n++)
56                 if (context->fd_hashtable[h].wsi[n]->sock == fd)
57                         return context->fd_hashtable[h].wsi[n];
58
59         return NULL;
60 }
61
62 int
63 insert_wsi(struct libwebsocket_context *context, struct libwebsocket *wsi)
64 {
65         int h = LWS_FD_HASH(wsi->sock);
66
67         if (context->fd_hashtable[h].length == MAX_CLIENTS - 1) {
68                 fprintf(stderr, "hash table overflow\n");
69                 return 1;
70         }
71
72         context->fd_hashtable[h].wsi[context->fd_hashtable[h].length++] = wsi;
73
74         return 0;
75 }
76
77 int
78 delete_from_fd(struct libwebsocket_context *context, int fd)
79 {
80         int h = LWS_FD_HASH(fd);
81         int n = 0;
82
83         for (n = 0; n < context->fd_hashtable[h].length; n++)
84                 if (context->fd_hashtable[h].wsi[n]->sock == fd) {
85                         while (n < context->fd_hashtable[h].length) {
86                                 context->fd_hashtable[h].wsi[n] =
87                                             context->fd_hashtable[h].wsi[n + 1];
88                                 n++;
89                         }
90                         context->fd_hashtable[h].length--;
91
92                         return 0;
93                 }
94
95         fprintf(stderr, "Failed to find fd %d requested for "
96                                                    "delete in hashtable\n", fd);
97         return 1;
98 }
99
100 #ifdef LWS_OPENSSL_SUPPORT
101 static void
102 libwebsockets_decode_ssl_error(void)
103 {
104         char buf[256];
105         u_long err;
106
107         while ((err = ERR_get_error()) != 0) {
108                 ERR_error_string_n(err, buf, sizeof(buf));
109                 fprintf(stderr, "*** %s\n", buf);
110         }
111 }
112 #endif
113
114
115 static int
116 interface_to_sa(const char* ifname, struct sockaddr_in *addr, size_t addrlen)
117 {
118         int rc = -1;
119 #ifdef WIN32
120         // TODO
121 #else
122         struct ifaddrs *ifr;
123         struct ifaddrs *ifc;
124         struct sockaddr_in *sin;
125
126         getifaddrs(&ifr);
127         for (ifc = ifr; ifc != NULL; ifc = ifc->ifa_next) {
128                 if (strcmp(ifc->ifa_name, ifname))
129                         continue;
130                 if (ifc->ifa_addr == NULL)
131                         continue;
132                 sin = (struct sockaddr_in *)ifc->ifa_addr;
133                 if (sin->sin_family != AF_INET)
134                         continue;
135                 memcpy(addr, sin, addrlen);
136                 rc = 0; 
137         }
138
139         freeifaddrs(ifr);
140 #endif
141         return rc;
142 }
143
144 void
145 libwebsocket_close_and_free_session(struct libwebsocket_context *context,
146                          struct libwebsocket *wsi, enum lws_close_status reason)
147 {
148         int n;
149         int old_state;
150         unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 2 +
151                                                   LWS_SEND_BUFFER_POST_PADDING];
152
153         if (!wsi)
154                 return;
155
156         old_state = wsi->state;
157
158         if (old_state == WSI_STATE_DEAD_SOCKET)
159                 return;
160
161         wsi->close_reason = reason;
162
163         /*
164          * signal we are closing, libsocket_write will
165          * add any necessary version-specific stuff.  If the write fails,
166          * no worries we are closing anyway.  If we didn't initiate this
167          * close, then our state has been changed to
168          * WSI_STATE_RETURNED_CLOSE_ALREADY and we will skip this.
169          *
170          * Likewise if it's a second call to close this connection after we
171          * sent the close indication to the peer already, we are in state
172          * WSI_STATE_AWAITING_CLOSE_ACK and will skip doing this a second time.
173          */
174
175         if (old_state == WSI_STATE_ESTABLISHED &&
176                                           reason != LWS_CLOSE_STATUS_NOSTATUS) {
177                 n = libwebsocket_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING],
178                                                             0, LWS_WRITE_CLOSE);
179                 if (!n) {
180                         /*
181                          * we have sent a nice protocol level indication we
182                          * now wish to close, we should not send anything more
183                          */
184
185                         wsi->state = WSI_STATE_AWAITING_CLOSE_ACK;
186
187                         /* and we should wait for a reply for a bit */
188
189                         libwebsocket_set_timeout(wsi,
190                                                   PENDING_TIMEOUT_CLOSE_ACK, 5);
191
192                         fprintf(stderr, "sent close indication, awaiting ack\n");
193
194                         return;
195                 }
196
197                 /* else, the send failed and we should just hang up */
198         }
199
200         /*
201          * we won't be servicing or receiving anything further from this guy
202          * remove this fd from wsi mapping hashtable
203          */
204
205         delete_from_fd(context, wsi->sock);
206
207         /* delete it from the internal poll list if still present */
208
209         for (n = 0; n < context->fds_count; n++) {
210                 if (context->fds[n].fd != wsi->sock)
211                         continue;
212                 while (n < context->fds_count - 1) {
213                         context->fds[n] = context->fds[n + 1];
214                         n++;
215                 }
216                 context->fds_count--;
217                 /* we only have to deal with one */
218                 n = context->fds_count;
219         }
220
221         /* remove also from external POLL support via protocol 0 */
222
223         context->protocols[0].callback(context, wsi,
224                     LWS_CALLBACK_DEL_POLL_FD, (void *)(long)wsi->sock, NULL, 0);
225
226         wsi->state = WSI_STATE_DEAD_SOCKET;
227
228         /* tell the user it's all over for this guy */
229
230         if (wsi->protocol && wsi->protocol->callback &&
231                                              old_state == WSI_STATE_ESTABLISHED)
232                 wsi->protocol->callback(context, wsi, LWS_CALLBACK_CLOSED,
233                                                       wsi->user_space, NULL, 0);
234
235         /* deallocate any active extension contexts */
236
237         for (n = 0; n < wsi->count_active_extensions; n++) {
238                 if (!wsi->active_extensions[n]->callback)
239                         continue;
240
241                 wsi->active_extensions[n]->callback(context, wsi,
242                         LWS_EXT_CALLBACK_DESTROY,
243                         wsi->active_extensions_user[n], NULL, 0);
244
245                 free(wsi->active_extensions_user[n]);
246         }
247
248         /* free up his parsing allocations */
249
250         for (n = 0; n < WSI_TOKEN_COUNT; n++)
251                 if (wsi->utf8_token[n].token)
252                         free(wsi->utf8_token[n].token);
253
254 /*      fprintf(stderr, "closing fd=%d\n", wsi->sock); */
255
256 #ifdef LWS_OPENSSL_SUPPORT
257         if (wsi->ssl) {
258                 n = SSL_get_fd(wsi->ssl);
259                 SSL_shutdown(wsi->ssl);
260 #ifdef WIN32
261                 closesocket(n);
262 #else
263                 close(n);
264 #endif
265                 SSL_free(wsi->ssl);
266         } else {
267 #endif
268                 shutdown(wsi->sock, SHUT_RDWR);
269 #ifdef WIN32
270                 closesocket(wsi->sock);
271 #else
272                 close(wsi->sock);
273 #endif
274 #ifdef LWS_OPENSSL_SUPPORT
275         }
276 #endif
277         if (wsi->user_space)
278                 free(wsi->user_space);
279
280         free(wsi);
281 }
282
283 /**
284  * libwebsockets_hangup_on_client() - Server calls to terminate client
285  *                                      connection
286  * @context:    libwebsockets context
287  * @fd:         Connection socket descriptor
288  */
289
290 void
291 libwebsockets_hangup_on_client(struct libwebsocket_context *context, int fd)
292 {
293         struct libwebsocket *wsi = wsi_from_fd(context, fd);
294
295         if (wsi == NULL)
296                 return;
297
298         libwebsocket_close_and_free_session(context, wsi,
299                                                      LWS_CLOSE_STATUS_NOSTATUS);
300 }
301
302
303 /**
304  * libwebsockets_get_peer_addresses() - Get client address information
305  * @fd:         Connection socket descriptor
306  * @name:       Buffer to take client address name
307  * @name_len:   Length of client address name buffer
308  * @rip:        Buffer to take client address IP qotted quad
309  * @rip_len:    Length of client address IP buffer
310  *
311  *      This function fills in @name and @rip with the name and IP of
312  *      the client connected with socket descriptor @fd.  Names may be
313  *      truncated if there is not enough room.  If either cannot be
314  *      determined, they will be returned as valid zero-length strings.
315  */
316
317 void
318 libwebsockets_get_peer_addresses(int fd, char *name, int name_len,
319                                         char *rip, int rip_len)
320 {
321         unsigned int len;
322         struct sockaddr_in sin;
323         struct hostent *host;
324         struct hostent *host1;
325         char ip[128];
326         char *p;
327         int n;
328
329         rip[0] = '\0';
330         name[0] = '\0';
331
332         len = sizeof sin;
333         if (getpeername(fd, (struct sockaddr *) &sin, &len) < 0) {
334                 perror("getpeername");
335                 return;
336         }
337                 
338         host = gethostbyaddr((char *) &sin.sin_addr, sizeof sin.sin_addr,
339                                                                        AF_INET);
340         if (host == NULL) {
341                 perror("gethostbyaddr");
342                 return;
343         }
344
345         strncpy(name, host->h_name, name_len);
346         name[name_len - 1] = '\0';
347
348         host1 = gethostbyname(host->h_name);
349         if (host1 == NULL)
350                 return;
351         p = (char *)host1;
352         n = 0;
353         while (p != NULL) {
354                 p = host1->h_addr_list[n++];
355                 if (p == NULL)
356                         continue;
357                 if (host1->h_addrtype != AF_INET)
358                         continue;
359
360                 sprintf(ip, "%d.%d.%d.%d",
361                                 p[0], p[1], p[2], p[3]);
362                 p = NULL;
363                 strncpy(rip, ip, rip_len);
364                 rip[rip_len - 1] = '\0';
365         }
366 }
367
368 int libwebsockets_get_random(struct libwebsocket_context *context,
369                                                              void *buf, int len)
370 {
371         int n;
372         char *p = buf;
373
374 #ifdef WIN32
375         for (n = 0; n < len; n++)
376                 p[n] = (unsigned char)rand();
377 #else
378         n = read(context->fd_random, p, len);
379 #endif
380
381         return n;
382 }
383
384 void libwebsockets_00_spaceout(char *key, int spaces, int seed)
385 {
386         char *p;
387         
388         key++;
389         while (spaces--) {
390                 if (*key && (seed & 1))
391                         key++;
392                 seed >>= 1;
393                 
394                 p = key + strlen(key);
395                 while (p >= key) {
396                         p[1] = p[0];
397                         p--;
398                 }
399                 *key++ = ' ';
400         }
401 }
402
403 void libwebsockets_00_spam(char *key, int count, int seed)
404 {
405         char *p;
406
407         key++;
408         while (count--) {
409                 
410                 if (*key && (seed & 1))
411                         key++;
412                 seed >>= 1;
413
414                 p = key + strlen(key);
415                 while (p >= key) {
416                         p[1] = p[0];
417                         p--;
418                 }
419                 *key++ = 0x21 + ((seed & 0xffff) % 15);
420                 /* 4 would use it up too fast.. not like it matters */
421                 seed >>= 1;
422         }
423 }
424
425 int lws_send_pipe_choked(struct libwebsocket *wsi)
426 {
427         struct pollfd fds;
428
429         fds.fd = wsi->sock;
430         fds.events = POLLOUT;
431         fds.revents = 0;
432
433         if (poll(&fds, 1, 0) != 1)
434                 return 1;
435
436         if ((fds.revents & POLLOUT) == 0)
437                 return 1;
438
439         /* okay to send another packet without blocking */
440
441         return 0;
442 }
443
444 static int
445 lws_handle_POLLOUT_event(struct libwebsocket_context *context,
446                                 struct libwebsocket *wsi, struct pollfd *pollfd)
447 {
448         struct lws_tokens eff_buf;
449         int n;
450         int ret;
451         int m;
452
453         if (!wsi->extension_data_pending)
454                 goto user_service;
455
456         /*
457          * check in on the active extensions, see if they
458          * had pending stuff to spill... they need to get the
459          * first look-in otherwise sequence will be disordered
460          *
461          * NULL, zero-length eff_buf means just spill pending
462          */
463
464         ret = 1;
465         while (ret == 1) {
466
467                 /* default to nobody has more to spill */
468
469                 ret = 0;
470                 eff_buf.token = NULL;
471                 eff_buf.token_len = 0;
472
473                 /* give every extension a chance to spill */
474
475                 for (n = 0; n < wsi->count_active_extensions; n++) {
476                         m = wsi->active_extensions[n]->callback(
477                                 wsi->protocol->owning_server, wsi,
478                                         LWS_EXT_CALLBACK_PACKET_TX_PRESEND,
479                                    wsi->active_extensions_user[n], &eff_buf, 0);
480                         if (m < 0) {
481                                 fprintf(stderr, "extension reports fatal error\n");
482                                 return -1;
483                         }
484                         if (m)
485                                 /*
486                                  * at least one extension told us he has more
487                                  * to spill, so we will go around again after
488                                  */
489                                 ret = 1;
490                 }
491
492                 /* assuming they gave us something to send, send it */
493
494                 if (eff_buf.token_len) {
495                         if (lws_issue_raw(wsi, (unsigned char *)eff_buf.token,
496                                                              eff_buf.token_len))
497                                 return -1;
498                 } else
499                         continue;
500
501                 /* no extension has more to spill */
502
503                 if (!ret)
504                         continue;
505
506                 /*
507                  * There's more to spill from an extension, but we just sent
508                  * something... did that leave the pipe choked?
509                  */
510
511                 if (!lws_send_pipe_choked(wsi))
512                         /* no we could add more */
513                         continue;
514
515                 fprintf(stderr, "choked in POLLOUT service\n");
516
517                 /*
518                  * Yes, he's choked.  Leave the POLLOUT masked on so we will
519                  * come back here when he is unchoked.  Don't call the user
520                  * callback to enforce ordering of spilling, he'll get called
521                  * when we come back here and there's nothing more to spill.
522                  */
523
524                 return 0;
525         }
526
527         wsi->extension_data_pending = 0;
528
529 user_service:
530         /* one shot */
531
532         pollfd->events &= ~POLLOUT;
533
534         /* external POLL support via protocol 0 */
535         context->protocols[0].callback(context, wsi,
536                 LWS_CALLBACK_CLEAR_MODE_POLL_FD,
537                 (void *)(long)wsi->sock, NULL, POLLOUT);
538
539         wsi->protocol->callback(context, wsi,
540                 LWS_CALLBACK_CLIENT_WRITEABLE,
541                 wsi->user_space,
542                 NULL, 0);
543
544         return 0;
545 }
546
547
548
549 /**
550  * libwebsocket_service_fd() - Service polled socket with something waiting
551  * @context:    Websocket context
552  * @pollfd:     The pollfd entry describing the socket fd and which events
553  *              happened.
554  *
555  *      This function closes any active connections and then frees the
556  *      context.  After calling this, any further use of the context is
557  *      undefined.
558  */
559
560 int
561 libwebsocket_service_fd(struct libwebsocket_context *context,
562                                                           struct pollfd *pollfd)
563 {
564         unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 1 + MAX_BROADCAST_PAYLOAD +
565                                                   LWS_SEND_BUFFER_POST_PADDING];
566         struct libwebsocket *wsi;
567         struct libwebsocket *new_wsi;
568         int n;
569         int m;
570         size_t len;
571         int accept_fd;
572         unsigned int clilen;
573         struct sockaddr_in cli_addr;
574         struct timeval tv;
575         static const char magic_websocket_guid[] =
576                                          "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
577         static const char magic_websocket_04_masking_guid[] =
578                                          "61AC5F19-FBBA-4540-B96F-6561F1AB40A8";
579         char hash[20];
580         char pkt[1024];
581         char *p = &pkt[0];
582         const char *pc;
583         const char *c;
584         int more = 1;
585         int okay = 0;
586         char ext_name[128];
587         struct lws_tokens eff_buf;
588         int ext_count = 0;
589         struct libwebsocket_extension *ext;
590
591 #ifdef LWS_OPENSSL_SUPPORT
592         char ssl_err_buf[512];
593 #endif
594         /*
595          * you can call us with pollfd = NULL to just allow the once-per-second
596          * global timeout checks; if less than a second since the last check
597          * it returns immediately then.
598          */
599
600         gettimeofday(&tv, NULL);
601
602         if (context->last_timeout_check_s != tv.tv_sec) {
603                 context->last_timeout_check_s = tv.tv_sec;
604
605                 /* global timeout check once per second */
606
607                 for (n = 0; n < context->fds_count; n++) {
608                         wsi = wsi_from_fd(context, context->fds[n].fd);
609                         if (!wsi->pending_timeout)
610                                 continue;
611
612                         /*
613                          * if we went beyond the allowed time, kill the
614                          * connection
615                          */
616
617                         if (tv.tv_sec > wsi->pending_timeout_limit) {
618                                 fprintf(stderr, "TIMEDOUT WAITING\n");
619                                 libwebsocket_close_and_free_session(context,
620                                                 wsi, LWS_CLOSE_STATUS_NOSTATUS);
621                         }
622                 }
623         }
624
625         /* just here for timeout management? */
626
627         if (pollfd == NULL)
628                 return 0;
629
630         /* no, here to service a socket descriptor */
631
632         wsi = wsi_from_fd(context, pollfd->fd);
633
634         if (wsi == NULL)
635                 return 1;
636
637         switch (wsi->mode) {
638         case LWS_CONNMODE_SERVER_LISTENER:
639
640                 /* pollin means a client has connected to us then */
641
642                 if (!pollfd->revents & POLLIN)
643                         break;
644
645                 /* listen socket got an unencrypted connection... */
646
647                 clilen = sizeof(cli_addr);
648                 accept_fd  = accept(pollfd->fd, (struct sockaddr *)&cli_addr,
649                                                                        &clilen);
650                 if (accept_fd < 0) {
651                         fprintf(stderr, "ERROR on accept");
652                         break;
653                 }
654
655                 if (context->fds_count >= MAX_CLIENTS) {
656                         fprintf(stderr, "too busy to accept new client\n");
657 #ifdef WIN32
658                         closesocket(accept_fd);
659 #else
660                         close(accept_fd);
661 #endif
662                         break;
663                 }
664
665                 /*
666                  * look at who we connected to and give user code a chance
667                  * to reject based on client IP.  There's no protocol selected
668                  * yet so we issue this to protocols[0]
669                  */
670
671                 if ((context->protocols[0].callback)(context, wsi,
672                                 LWS_CALLBACK_FILTER_NETWORK_CONNECTION,
673                                              (void*)(long)accept_fd, NULL, 0)) {
674                         fprintf(stderr, "Callback denied network connection\n");
675 #ifdef WIN32
676                         closesocket(accept_fd);
677 #else
678                         close(accept_fd);
679 #endif
680                         break;
681                 }
682
683                 /* accepting connection to main listener */
684
685                 new_wsi = malloc(sizeof(struct libwebsocket));
686                 if (new_wsi == NULL) {
687                         fprintf(stderr, "Out of memory for new connection\n");
688                         break;
689                 }
690
691                 memset(new_wsi, 0, sizeof (struct libwebsocket));
692                 new_wsi->sock = accept_fd;
693                 new_wsi->count_active_extensions = 0;
694                 new_wsi->pending_timeout = NO_PENDING_TIMEOUT;
695
696 #ifdef LWS_OPENSSL_SUPPORT
697                 new_wsi->ssl = NULL;
698
699                 if (context->use_ssl) {
700
701                         new_wsi->ssl = SSL_new(context->ssl_ctx);
702                         if (new_wsi->ssl == NULL) {
703                                 fprintf(stderr, "SSL_new failed: %s\n",
704                                     ERR_error_string(SSL_get_error(
705                                     new_wsi->ssl, 0), NULL));
706                                     libwebsockets_decode_ssl_error();
707                                 free(new_wsi);
708                                 break;
709                         }
710
711                         SSL_set_fd(new_wsi->ssl, accept_fd);
712
713                         n = SSL_accept(new_wsi->ssl);
714                         if (n != 1) {
715                                 /*
716                                  * browsers seem to probe with various
717                                  * ssl params which fail then retry
718                                  * and succeed
719                                  */
720                                 debug("SSL_accept failed skt %u: %s\n",
721                                       pollfd->fd,
722                                       ERR_error_string(SSL_get_error(
723                                       new_wsi->ssl, n), NULL));
724                                 SSL_free(
725                                        new_wsi->ssl);
726                                 free(new_wsi);
727                                 break;
728                         }
729                         
730                         debug("accepted new SSL conn  "
731                               "port %u on fd=%d SSL ver %s\n",
732                                 ntohs(cli_addr.sin_port), accept_fd,
733                                   SSL_get_version(new_wsi->ssl));
734
735                 } else
736 #endif
737                         debug("accepted new conn  port %u on fd=%d\n",
738                                           ntohs(cli_addr.sin_port), accept_fd);
739
740                 /* intialize the instance struct */
741
742                 new_wsi->state = WSI_STATE_HTTP;
743                 new_wsi->name_buffer_pos = 0;
744                 new_wsi->mode = LWS_CONNMODE_WS_SERVING;
745
746                 for (n = 0; n < WSI_TOKEN_COUNT; n++) {
747                         new_wsi->utf8_token[n].token = NULL;
748                         new_wsi->utf8_token[n].token_len = 0;
749                 }
750
751                 /*
752                  * these can only be set once the protocol is known
753                  * we set an unestablished connection's protocol pointer
754                  * to the start of the supported list, so it can look
755                  * for matching ones during the handshake
756                  */
757                 new_wsi->protocol = context->protocols;
758                 new_wsi->user_space = NULL;
759
760                 /*
761                  * Default protocol is 76 / 00
762                  * After 76, there's a header specified to inform which
763                  * draft the client wants, when that's seen we modify
764                  * the individual connection's spec revision accordingly
765                  */
766                 new_wsi->ietf_spec_revision = 0;
767
768                 insert_wsi(context, new_wsi);
769
770                 /*
771                  * make sure NO events are seen yet on this new socket
772                  * (otherwise we inherit old fds[client].revents from
773                  * previous socket there and die mysteriously! )
774                  */
775                 context->fds[context->fds_count].revents = 0;
776
777                 context->fds[context->fds_count].events = POLLIN;
778                 context->fds[context->fds_count++].fd = accept_fd;
779
780                 /* external POLL support via protocol 0 */
781                 context->protocols[0].callback(context, new_wsi,
782                         LWS_CALLBACK_ADD_POLL_FD,
783                         (void *)(long)accept_fd, NULL, POLLIN);
784
785                 break;
786
787         case LWS_CONNMODE_BROADCAST_PROXY_LISTENER:
788
789                 /* as we are listening, POLLIN means accept() is needed */
790         
791                 if (!pollfd->revents & POLLIN)
792                         break;
793
794                 /* listen socket got an unencrypted connection... */
795
796                 clilen = sizeof(cli_addr);
797                 accept_fd  = accept(pollfd->fd, (struct sockaddr *)&cli_addr,
798                                                                        &clilen);
799                 if (accept_fd < 0) {
800                         fprintf(stderr, "ERROR on accept");
801                         break;
802                 }
803
804                 if (context->fds_count >= MAX_CLIENTS) {
805                         fprintf(stderr, "too busy to accept new broadcast "
806                                                               "proxy client\n");
807 #ifdef WIN32
808                         closesocket(accept_fd);
809 #else
810                         close(accept_fd);
811 #endif
812                         break;
813                 }
814
815                 /* create a dummy wsi for the connection and add it */
816
817                 new_wsi = malloc(sizeof(struct libwebsocket));
818                 memset(new_wsi, 0, sizeof (struct libwebsocket));
819                 new_wsi->sock = accept_fd;
820                 new_wsi->mode = LWS_CONNMODE_BROADCAST_PROXY;
821                 new_wsi->state = WSI_STATE_ESTABLISHED;
822                 new_wsi->count_active_extensions = 0;
823                 /* note which protocol we are proxying */
824                 new_wsi->protocol_index_for_broadcast_proxy =
825                                         wsi->protocol_index_for_broadcast_proxy;
826                 insert_wsi(context, new_wsi);
827
828                 /* add connected socket to internal poll array */
829
830                 context->fds[context->fds_count].revents = 0;
831                 context->fds[context->fds_count].events = POLLIN;
832                 context->fds[context->fds_count++].fd = accept_fd;
833
834                 /* external POLL support via protocol 0 */
835                 context->protocols[0].callback(context, new_wsi,
836                         LWS_CALLBACK_ADD_POLL_FD,
837                         (void *)(long)accept_fd, NULL, POLLIN);
838
839                 break;
840
841         case LWS_CONNMODE_BROADCAST_PROXY:
842
843                 /* handle session socket closed */
844
845                 if (pollfd->revents & (POLLERR | POLLHUP)) {
846
847                         debug("Session Socket %p (fd=%d) dead\n",
848                                 (void *)wsi, pollfd->fd);
849
850                         libwebsocket_close_and_free_session(context, wsi,
851                                                        LWS_CLOSE_STATUS_NORMAL);
852                         return 1;
853                 }
854
855                 /*
856                  * either extension code with stuff to spill, or the user code,
857                  * requested a callback when it was OK to write
858                  */
859
860                 if (pollfd->revents & POLLOUT)
861                         if (lws_handle_POLLOUT_event(context, wsi, pollfd) < 0) {
862                                 libwebsocket_close_and_free_session(context, wsi,
863                                                        LWS_CLOSE_STATUS_NORMAL);
864                                 return 1;
865                         }
866
867                 /* any incoming data ready? */
868
869                 if (!(pollfd->revents & POLLIN))
870                         break;
871
872                 /* get the issued broadcast payload from the socket */
873
874                 len = read(pollfd->fd, buf + LWS_SEND_BUFFER_PRE_PADDING,
875                                                          MAX_BROADCAST_PAYLOAD);
876                 if (len < 0) {
877                         fprintf(stderr, "Error reading broadcast payload\n");
878                         break;
879                 }
880
881                 /* broadcast it to all guys with this protocol index */
882
883                 for (n = 0; n < FD_HASHTABLE_MODULUS; n++) {
884
885                         for (m = 0; m < context->fd_hashtable[n].length; m++) {
886
887                                 new_wsi = context->fd_hashtable[n].wsi[m];
888
889                                 /* only to clients we are serving to */
890
891                                 if (new_wsi->mode != LWS_CONNMODE_WS_SERVING)
892                                         continue;
893
894                                 /*
895                                  * never broadcast to non-established
896                                  * connection
897                                  */
898
899                                 if (new_wsi->state != WSI_STATE_ESTABLISHED)
900                                         continue;
901
902                                 /*
903                                  * only broadcast to connections using
904                                  * the requested protocol
905                                  */
906
907                                 if (new_wsi->protocol->protocol_index !=
908                                         wsi->protocol_index_for_broadcast_proxy)
909                                         continue;
910
911                                 /* broadcast it to this connection */
912
913                                 new_wsi->protocol->callback(context, new_wsi,
914                                         LWS_CALLBACK_BROADCAST,
915                                         new_wsi->user_space,
916                                         buf + LWS_SEND_BUFFER_PRE_PADDING, len);
917                         }
918                 }
919                 break;
920
921         case LWS_CONNMODE_WS_CLIENT_WAITING_PROXY_REPLY:
922
923                 /* handle proxy hung up on us */
924
925                 if (pollfd->revents & (POLLERR | POLLHUP)) {
926
927                         fprintf(stderr, "Proxy connection %p (fd=%d) dead\n",
928                                 (void *)wsi, pollfd->fd);
929
930                         libwebsocket_close_and_free_session(context, wsi,
931                                                      LWS_CLOSE_STATUS_NOSTATUS);
932                         return 1;
933                 }
934
935                 n = recv(wsi->sock, pkt, sizeof pkt, 0);
936                 if (n < 0) {
937                         libwebsocket_close_and_free_session(context, wsi,
938                                                      LWS_CLOSE_STATUS_NOSTATUS);
939                         fprintf(stderr, "ERROR reading from proxy socket\n");
940                         return 1;
941                 }
942
943                 pkt[13] = '\0';
944                 if (strcmp(pkt, "HTTP/1.0 200 ") != 0) {
945                         libwebsocket_close_and_free_session(context, wsi,
946                                                      LWS_CLOSE_STATUS_NOSTATUS);
947                         fprintf(stderr, "ERROR from proxy: %s\n", pkt);
948                         return 1;
949                 }
950
951                 /* clear his proxy connection timeout */
952
953                 libwebsocket_set_timeout(wsi, NO_PENDING_TIMEOUT, 0);
954
955                 /* fallthru */
956
957         case LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE:
958
959         #ifdef LWS_OPENSSL_SUPPORT
960                 if (wsi->use_ssl) {
961
962                         wsi->ssl = SSL_new(context->ssl_client_ctx);
963                         wsi->client_bio = BIO_new_socket(wsi->sock,
964                                                                    BIO_NOCLOSE);
965                         SSL_set_bio(wsi->ssl, wsi->client_bio, wsi->client_bio);
966
967                         SSL_set_ex_data(wsi->ssl,
968                                         openssl_websocket_private_data_index,
969                                                                        context);
970
971                         if (SSL_connect(wsi->ssl) <= 0) {
972                                 fprintf(stderr, "SSL connect error %s\n",
973                                         ERR_error_string(ERR_get_error(),
974                                                                   ssl_err_buf));
975                                 libwebsocket_close_and_free_session(context, wsi,
976                                                      LWS_CLOSE_STATUS_NOSTATUS);
977                                 return 1;
978                         }
979
980                         n = SSL_get_verify_result(wsi->ssl);
981                         if ((n != X509_V_OK) && (
982                                 n != X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT ||
983                                                            wsi->use_ssl != 2)) {
984
985                                 fprintf(stderr, "server's cert didn't "
986                                                            "look good %d\n", n);
987                                 libwebsocket_close_and_free_session(context,
988                                                 wsi, LWS_CLOSE_STATUS_NOSTATUS);
989                                 return 1;
990                         }
991                 } else {
992                         wsi->ssl = NULL;
993         #endif
994
995
996         #ifdef LWS_OPENSSL_SUPPORT
997                 }
998         #endif
999
1000                 /*
1001                  * create the random key
1002                  */
1003
1004                 n = libwebsockets_get_random(context, hash, 16);
1005                 if (n != 16) {
1006                         fprintf(stderr, "Unable to read from random dev %s\n",
1007                                                         SYSTEM_RANDOM_FILEPATH);
1008                         free(wsi->c_path);
1009                         free(wsi->c_host);
1010                         if (wsi->c_origin)
1011                                 free(wsi->c_origin);
1012                         if (wsi->c_protocol)
1013                                 free(wsi->c_protocol);
1014                         libwebsocket_close_and_free_session(context, wsi,
1015                                                      LWS_CLOSE_STATUS_NOSTATUS);
1016                         return 1;
1017                 }
1018
1019                 lws_b64_encode_string(hash, 16, wsi->key_b64,
1020                                                            sizeof wsi->key_b64);
1021
1022                 /*
1023                  * 00 example client handshake
1024                  *
1025                  * GET /socket.io/websocket HTTP/1.1
1026                  * Upgrade: WebSocket
1027                  * Connection: Upgrade
1028                  * Host: 127.0.0.1:9999
1029                  * Origin: http://127.0.0.1
1030                  * Sec-WebSocket-Key1: 1 0 2#0W 9 89 7  92 ^
1031                  * Sec-WebSocket-Key2: 7 7Y 4328 B2v[8(z1
1032                  * Cookie: socketio=websocket
1033                  * 
1034                  * (Á®Ä0¶†≥
1035                  * 
1036                  * 04 example client handshake
1037                  *
1038                  * GET /chat HTTP/1.1
1039                  * Host: server.example.com
1040                  * Upgrade: websocket
1041                  * Connection: Upgrade
1042                  * Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
1043                  * Sec-WebSocket-Origin: http://example.com
1044                  * Sec-WebSocket-Protocol: chat, superchat
1045                  * Sec-WebSocket-Version: 4
1046                  */
1047
1048                 p += sprintf(p, "GET %s HTTP/1.1\x0d\x0a", wsi->c_path);
1049
1050                 if (wsi->ietf_spec_revision == 0) {
1051                         unsigned char spaces_1, spaces_2;
1052                         unsigned int max_1, max_2;
1053                         unsigned int num_1, num_2;
1054                         unsigned long product_1, product_2;
1055                         char key_1[40];
1056                         char key_2[40];
1057                         unsigned int seed;
1058                         unsigned int count;
1059                         char challenge[16];
1060
1061                         libwebsockets_get_random(context, &spaces_1,
1062                                                                   sizeof(char));
1063                         libwebsockets_get_random(context, &spaces_2,
1064                                                                   sizeof(char));
1065                         
1066                         spaces_1 = (spaces_1 % 12) + 1;
1067                         spaces_2 = (spaces_2 % 12) + 1;
1068                         
1069                         max_1 = 4294967295 / spaces_1;
1070                         max_2 = 4294967295 / spaces_2;
1071
1072                         libwebsockets_get_random(context, &num_1, sizeof(int));
1073                         libwebsockets_get_random(context, &num_2, sizeof(int));
1074                         
1075                         num_1 = (num_1 % max_1);
1076                         num_2 = (num_2 % max_2);
1077                         
1078                         challenge[0] = num_1 >> 24;
1079                         challenge[1] = num_1 >> 16;
1080                         challenge[2] = num_1 >> 8;
1081                         challenge[3] = num_1;
1082                         challenge[4] = num_2 >> 24;
1083                         challenge[5] = num_2 >> 16;
1084                         challenge[6] = num_2 >> 8;
1085                         challenge[7] = num_2;
1086                         
1087                         product_1 = num_1 * spaces_1;
1088                         product_2 = num_2 * spaces_2;
1089                         
1090                         sprintf(key_1, "%lu", product_1);
1091                         sprintf(key_2, "%lu", product_2);
1092
1093                         libwebsockets_get_random(context, &seed, sizeof(int));
1094                         libwebsockets_get_random(context, &count, sizeof(int));
1095                         
1096                         libwebsockets_00_spam(key_1, (count % 12) + 1, seed);
1097                         
1098                         libwebsockets_get_random(context, &seed, sizeof(int));
1099                         libwebsockets_get_random(context, &count, sizeof(int));
1100                         
1101                         libwebsockets_00_spam(key_2, (count % 12) + 1, seed);
1102                         
1103                         libwebsockets_get_random(context, &seed, sizeof(int));
1104                         
1105                         libwebsockets_00_spaceout(key_1, spaces_1, seed);
1106                         libwebsockets_00_spaceout(key_2, spaces_2, seed >> 16);
1107                         
1108                         p += sprintf(p, "Upgrade: websocket\x0d\x0a"
1109                                 "Connection: Upgrade\x0d\x0aHost: %s\x0d\x0a",
1110                                 wsi->c_host);
1111                         if (wsi->c_origin)
1112                                 p += sprintf(p, "Origin: %s\x0d\x0a",
1113                                 wsi->c_origin);
1114                         
1115                         if (wsi->c_protocol)
1116                                 p += sprintf(p, "Sec-WebSocket-Protocol: %s"
1117                                                  "\x0d\x0a", wsi->c_protocol);
1118                         
1119                         p += sprintf(p, "Sec-WebSocket-Key1: %s\x0d\x0a",
1120                                 key_1);
1121                         p += sprintf(p, "Sec-WebSocket-Key2: %s\x0d\x0a",
1122                                 key_2);
1123
1124                         /* give userland a chance to append, eg, cookies */
1125                         
1126                         context->protocols[0].callback(context, wsi,
1127                                 LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER,
1128                                         NULL, &p, (pkt + sizeof(pkt)) - p - 12);
1129
1130                         p += sprintf(p, "\x0d\x0a");
1131                         
1132                         read(context->fd_random, p, 8);
1133                         memcpy(&challenge[8], p, 8);
1134                         p += 8;
1135                         
1136                         /* precompute what we want to see from the server */
1137                         
1138                         MD5((unsigned char *)challenge, 16,
1139                            (unsigned char *)wsi->initial_handshake_hash_base64);
1140                         
1141                         goto issue_hdr;
1142                 }
1143
1144                 p += sprintf(p, "Host: %s\x0d\x0a", wsi->c_host);
1145                 p += sprintf(p, "Upgrade: websocket\x0d\x0a");
1146                 p += sprintf(p, "Connection: Upgrade\x0d\x0a"
1147                                         "Sec-WebSocket-Key: ");
1148                 strcpy(p, wsi->key_b64);
1149                 p += strlen(wsi->key_b64);
1150                 p += sprintf(p, "\x0d\x0a");
1151                 if (wsi->c_origin)
1152                         p += sprintf(p, "Sec-WebSocket-Origin: %s\x0d\x0a",
1153                                                                  wsi->c_origin);
1154                 if (wsi->c_protocol)
1155                         p += sprintf(p, "Sec-WebSocket-Protocol: %s\x0d\x0a",
1156                                                                wsi->c_protocol);
1157
1158                 /* tell the server what extensions we could support */
1159
1160                 p += sprintf(p, "Sec-WebSocket-Extensions: ");
1161
1162                 ext =context->extensions;
1163                 while (ext && ext->callback) {
1164
1165                         n = 0;
1166                         n = context->protocols[0].callback(context, wsi,
1167                                 LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED,
1168                                         wsi->user_space, (char *)ext->name, 0);
1169
1170                         /*
1171                          * zero return from callback means
1172                          * go ahead and allow the extension,
1173                          * it's what we get if the callback is
1174                          * unhandled
1175                          */
1176
1177                         if (n) {
1178                                 ext++;
1179                                 continue;
1180                         }
1181
1182                         /* apply it */
1183                         
1184                         if (ext_count)
1185                                 *p++ = ',';
1186                         p += sprintf(p, ext->name);
1187                         ext_count++;
1188
1189                         ext++;
1190                 }
1191
1192                 p += sprintf(p, "\x0d\x0a");
1193
1194                 if (wsi->ietf_spec_revision)
1195                         p += sprintf(p, "Sec-WebSocket-Version: %d\x0d\x0a",
1196                                                        wsi->ietf_spec_revision); 
1197
1198                 /* give userland a chance to append, eg, cookies */
1199                 
1200                 context->protocols[0].callback(context, wsi,
1201                         LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER,
1202                         NULL, &p, (pkt + sizeof(pkt)) - p - 12);
1203                 
1204                 p += sprintf(p, "\x0d\x0a");
1205
1206                 /* prepare the expected server accept response */
1207
1208                 strcpy((char *)buf, wsi->key_b64);
1209                 strcpy((char *)&buf[strlen((char *)buf)], magic_websocket_guid);
1210
1211                 SHA1(buf, strlen((char *)buf), (unsigned char *)hash);
1212
1213                 lws_b64_encode_string(hash, 20,
1214                                 wsi->initial_handshake_hash_base64,
1215                                      sizeof wsi->initial_handshake_hash_base64);
1216
1217 issue_hdr:
1218                 
1219                 /* done with these now */
1220                 
1221                 free(wsi->c_path);
1222                 free(wsi->c_host);
1223                 if (wsi->c_origin)
1224                         free(wsi->c_origin);
1225
1226                 /* send our request to the server */
1227
1228         #ifdef LWS_OPENSSL_SUPPORT
1229                 if (wsi->use_ssl)
1230                         n = SSL_write(wsi->ssl, pkt, p - pkt);
1231                 else
1232         #endif
1233                         n = send(wsi->sock, pkt, p - pkt, 0);
1234
1235                 if (n < 0) {
1236                         fprintf(stderr, "ERROR writing to client socket\n");
1237                         libwebsocket_close_and_free_session(context, wsi,
1238                                                      LWS_CLOSE_STATUS_NOSTATUS);
1239                         return 1;
1240                 }
1241
1242                 wsi->parser_state = WSI_TOKEN_NAME_PART;
1243                 wsi->mode = LWS_CONNMODE_WS_CLIENT_WAITING_SERVER_REPLY;
1244                 libwebsocket_set_timeout(wsi,
1245                                 PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE, 5);
1246
1247                 break;
1248
1249         case LWS_CONNMODE_WS_CLIENT_WAITING_SERVER_REPLY:
1250
1251                 /* handle server hung up on us */
1252
1253                 if (pollfd->revents & (POLLERR | POLLHUP)) {
1254
1255                         fprintf(stderr, "Server connection %p (fd=%d) dead\n",
1256                                 (void *)wsi, pollfd->fd);
1257
1258                         goto bail3;
1259                 }
1260
1261
1262                 /* interpret the server response */
1263
1264                 /*
1265                  *  HTTP/1.1 101 Switching Protocols
1266                  *  Upgrade: websocket
1267                  *  Connection: Upgrade
1268                  *  Sec-WebSocket-Accept: me89jWimTRKTWwrS3aRrL53YZSo=
1269                  *  Sec-WebSocket-Nonce: AQIDBAUGBwgJCgsMDQ4PEC==
1270                  *  Sec-WebSocket-Protocol: chat
1271                  */
1272
1273         #ifdef LWS_OPENSSL_SUPPORT
1274                 if (wsi->use_ssl)
1275                         len = SSL_read(wsi->ssl, pkt, sizeof pkt);
1276                 else
1277         #endif
1278                         len = recv(wsi->sock, pkt, sizeof pkt, 0);
1279
1280                 if (len < 0) {
1281                         fprintf(stderr,
1282                                   "libwebsocket_client_handshake read error\n");
1283                         goto bail3;
1284                 }
1285
1286                 p = pkt;
1287                 for (n = 0; n < len; n++)
1288                         libwebsocket_parse(wsi, *p++);
1289
1290                 if (wsi->parser_state != WSI_PARSING_COMPLETE) {
1291                         fprintf(stderr, "libwebsocket_client_handshake "
1292                                         "server response failed parsing\n");
1293                         goto bail3;
1294                 }
1295
1296                 /*
1297                  * 00 / 76 -->
1298                  *
1299                  * HTTP/1.1 101 WebSocket Protocol Handshake
1300                  * Upgrade: WebSocket
1301                  * Connection: Upgrade
1302                  * Sec-WebSocket-Origin: http://127.0.0.1
1303                  * Sec-WebSocket-Location: ws://127.0.0.1:9999/socket.io/websocket
1304                  *
1305                  * xxxxxxxxxxxxxxxx
1306                  */
1307                 
1308                 if (wsi->ietf_spec_revision == 0) {
1309                         if (!wsi->utf8_token[WSI_TOKEN_HTTP].token_len ||
1310                             !wsi->utf8_token[WSI_TOKEN_UPGRADE].token_len ||
1311                             !wsi->utf8_token[WSI_TOKEN_CHALLENGE].token_len ||
1312                             !wsi->utf8_token[WSI_TOKEN_CONNECTION].token_len ||
1313                             (!wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len &&
1314                             wsi->c_protocol != NULL)) {
1315                                 fprintf(stderr, "libwebsocket_client_handshake "
1316                                                 "missing required header(s)\n");
1317                                 pkt[len] = '\0';
1318                                 fprintf(stderr, "%s", pkt);
1319                                 goto bail3;
1320                         }
1321                         
1322                         strtolower(wsi->utf8_token[WSI_TOKEN_HTTP].token);
1323                         if (strcmp(wsi->utf8_token[WSI_TOKEN_HTTP].token,
1324                                 "101 websocket protocol handshake")) {
1325                                 fprintf(stderr, "libwebsocket_client_handshake "
1326                                         "server sent bad HTTP response '%s'\n",
1327                                         wsi->utf8_token[WSI_TOKEN_HTTP].token);
1328                                 goto bail3;
1329                         }
1330                         
1331                         if (wsi->utf8_token[WSI_TOKEN_CHALLENGE].token_len <
1332                                                                            16) {
1333                                 fprintf(stderr, "libwebsocket_client_handshake "
1334                                         "challenge reply too short %d\n",
1335                                         wsi->utf8_token[
1336                                                 WSI_TOKEN_CHALLENGE].token_len);
1337                                 pkt[len] = '\0';
1338                                 fprintf(stderr, "%s", pkt);
1339                                 goto bail3;
1340                                 
1341                         }
1342                         
1343                         goto select_protocol;
1344                 }
1345                 
1346                 /*
1347                  * well, what the server sent looked reasonable for syntax.
1348                  * Now let's confirm it sent all the necessary headers
1349                  */
1350
1351                  if (!wsi->utf8_token[WSI_TOKEN_HTTP].token_len ||
1352                         !wsi->utf8_token[WSI_TOKEN_UPGRADE].token_len ||
1353                         !wsi->utf8_token[WSI_TOKEN_CONNECTION].token_len ||
1354                         !wsi->utf8_token[WSI_TOKEN_ACCEPT].token_len ||
1355                         (!wsi->utf8_token[WSI_TOKEN_NONCE].token_len &&
1356                                            wsi->ietf_spec_revision == 4) ||
1357                         (!wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len &&
1358                                                      wsi->c_protocol != NULL)) {
1359                         fprintf(stderr, "libwebsocket_client_handshake "
1360                                                 "missing required header(s)\n");
1361                         pkt[len] = '\0';
1362                         fprintf(stderr, "%s", pkt);
1363                         goto bail3;
1364                 }
1365
1366                 /*
1367                  * Everything seems to be there, now take a closer look at what
1368                  * is in each header
1369                  */
1370
1371                 strtolower(wsi->utf8_token[WSI_TOKEN_HTTP].token);
1372                 if (strcmp(wsi->utf8_token[WSI_TOKEN_HTTP].token,
1373                                                    "101 switching protocols")) {
1374                         fprintf(stderr, "libwebsocket_client_handshake "
1375                                         "server sent bad HTTP response '%s'\n",
1376                                          wsi->utf8_token[WSI_TOKEN_HTTP].token);
1377                         goto bail3;
1378                 }
1379
1380                 strtolower(wsi->utf8_token[WSI_TOKEN_UPGRADE].token);
1381                 if (strcmp(wsi->utf8_token[WSI_TOKEN_UPGRADE].token,
1382                                                                  "websocket")) {
1383                         fprintf(stderr, "libwebsocket_client_handshake server "
1384                                         "sent bad Upgrade header '%s'\n",
1385                                       wsi->utf8_token[WSI_TOKEN_UPGRADE].token);
1386                         goto bail3;
1387                 }
1388
1389                 strtolower(wsi->utf8_token[WSI_TOKEN_CONNECTION].token);
1390                 if (strcmp(wsi->utf8_token[WSI_TOKEN_CONNECTION].token,
1391                                                                    "upgrade")) {
1392                         fprintf(stderr, "libwebsocket_client_handshake server "
1393                                         "sent bad Connection hdr '%s'\n",
1394                                    wsi->utf8_token[WSI_TOKEN_CONNECTION].token);
1395                         goto bail3;
1396                 }
1397
1398 select_protocol:
1399                 pc = wsi->c_protocol;
1400
1401                 /*
1402                  * confirm the protocol the server wants to talk was in the list
1403                  * of protocols we offered
1404                  */
1405
1406                 if (!wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len) {
1407
1408                         /*
1409                          * no protocol name to work from,
1410                          * default to first protocol
1411                          */
1412                         wsi->protocol = &context->protocols[0];
1413
1414                         free(wsi->c_protocol);
1415
1416                         goto check_accept;
1417                 }
1418
1419                 while (*pc && !okay) {
1420                         if ((!strncmp(pc,
1421                                 wsi->utf8_token[WSI_TOKEN_PROTOCOL].token,
1422                            wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len)) &&
1423                  (pc[wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len] == ',' ||
1424                    pc[wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len] == '\0')) {
1425                                 okay = 1;
1426                                 continue;
1427                         }
1428                         while (*pc && *pc != ',')
1429                                 pc++;
1430                         while (*pc && *pc != ' ')
1431                                 pc++;
1432                 }
1433
1434                 /* done with him now */
1435
1436                 if (wsi->c_protocol)
1437                         free(wsi->c_protocol);
1438
1439
1440                 if (!okay) {
1441                         fprintf(stderr, "libwebsocket_client_handshake server "
1442                                                 "sent bad protocol '%s'\n",
1443                                      wsi->utf8_token[WSI_TOKEN_PROTOCOL].token);
1444                         goto bail2;
1445                 }
1446
1447                 /*
1448                  * identify the selected protocol struct and set it
1449                  */
1450                 n = 0;
1451                 wsi->protocol = NULL;
1452                 while (context->protocols[n].callback) {
1453                         if (strcmp(wsi->utf8_token[WSI_TOKEN_PROTOCOL].token,
1454                                                context->protocols[n].name) == 0)
1455                                 wsi->protocol = &context->protocols[n];
1456                         n++;
1457                 }
1458
1459                 if (wsi->protocol == NULL) {
1460                         fprintf(stderr, "libwebsocket_client_handshake server "
1461                                         "requested protocol '%s', which we "
1462                                         "said we supported but we don't!\n",
1463                                      wsi->utf8_token[WSI_TOKEN_PROTOCOL].token);
1464                         goto bail2;
1465                 }
1466
1467
1468                 /* instantiate the accepted extensions */
1469
1470                 if (!wsi->utf8_token[WSI_TOKEN_EXTENSIONS].token_len)
1471                         goto check_accept;
1472
1473                 /*
1474                  * break down the list of server accepted extensions
1475                  * and go through matching them or identifying bogons
1476                  */
1477
1478                 c = wsi->utf8_token[WSI_TOKEN_EXTENSIONS].token;
1479                 n = 0;
1480                 while (more) {
1481                         
1482                         if (*c && *c != ',') {
1483                                 ext_name[n] = *c++;
1484                                 if (n < sizeof(ext_name) - 1)
1485                                         n++;
1486                                 continue;
1487                         }
1488                         ext_name[n] = '\0';
1489                         if (!*c)
1490                                 more = 0;
1491
1492                         /* check we actually support it */
1493
1494                         n = 0;
1495                         ext = wsi->protocol->owning_server->extensions;
1496                         while (ext && ext->callback) {
1497
1498                                 if (strcmp(ext_name, ext->name)) {
1499                                         ext++;
1500                                         continue;
1501                                 }
1502
1503                                 n = 1;
1504
1505                                 /* instantiate the extension on this conn */
1506
1507                                 wsi->active_extensions_user[
1508                                         wsi->count_active_extensions] =
1509                                              malloc(ext->per_session_data_size);
1510                                 wsi->active_extensions[
1511                                           wsi->count_active_extensions] = ext;
1512
1513                                 /* allow him to construct his context */
1514
1515                                 ext->callback(wsi->protocol->owning_server,
1516                                         wsi, LWS_EXT_CALLBACK_CLIENT_CONSTRUCT,
1517                                                 wsi->active_extensions_user[
1518                                         wsi->count_active_extensions], NULL, 0);
1519
1520                                 wsi->count_active_extensions++;
1521
1522                                 ext++;
1523                         }
1524
1525                         if (n == 0) {
1526                                 fprintf(stderr, "Server said we should use"
1527                                       "an unknown extension '%s'!\n", ext_name);
1528                                 goto bail2;
1529                         }
1530
1531                         n = 0;
1532                 }
1533
1534
1535         check_accept:
1536
1537                 if (wsi->ietf_spec_revision == 0) {
1538                         
1539                         if (memcmp(wsi->initial_handshake_hash_base64,
1540                               wsi->utf8_token[WSI_TOKEN_CHALLENGE].token, 16)) {
1541                                 fprintf(stderr, "libwebsocket_client_handshake "
1542                                                "failed 00 challenge compare\n");        
1543                                         pkt[len] = '\0';
1544                                         fprintf(stderr, "%s", pkt);
1545                                         goto bail2;
1546                         }
1547                         
1548                         goto accept_ok;
1549                 }
1550
1551                 /*
1552                  * Confirm his accept token is the one we precomputed
1553                  */
1554
1555                 if (strcmp(wsi->utf8_token[WSI_TOKEN_ACCEPT].token,
1556                                           wsi->initial_handshake_hash_base64)) {
1557                         fprintf(stderr, "libwebsocket_client_handshake server "
1558                                 "sent bad ACCEPT '%s' vs computed '%s'\n",
1559                                 wsi->utf8_token[WSI_TOKEN_ACCEPT].token,
1560                                             wsi->initial_handshake_hash_base64);
1561                         goto bail2;
1562                 }
1563
1564                 if (wsi->ietf_spec_revision == 4) {
1565                         /*
1566                          * Calculate the 04 masking key to use when
1567                          * sending data to server
1568                          */
1569
1570                         strcpy((char *)buf, wsi->key_b64);
1571                         p = (char *)buf + strlen(wsi->key_b64);
1572                         strcpy(p, wsi->utf8_token[WSI_TOKEN_NONCE].token);
1573                         p += wsi->utf8_token[WSI_TOKEN_NONCE].token_len;
1574                         strcpy(p, magic_websocket_04_masking_guid);
1575                         SHA1(buf, strlen((char *)buf), wsi->masking_key_04);
1576                 }
1577 accept_ok:
1578
1579                 /* allocate the per-connection user memory (if any) */
1580
1581                 if (wsi->protocol->per_session_data_size) {
1582                         wsi->user_space = malloc(
1583                                           wsi->protocol->per_session_data_size);
1584                         if (wsi->user_space  == NULL) {
1585                                 fprintf(stderr, "Out of memory for "
1586                                                            "conn user space\n");
1587                                 goto bail2;
1588                         }
1589                 } else
1590                         wsi->user_space = NULL;
1591
1592                 /* clear his proxy connection timeout */
1593
1594                 libwebsocket_set_timeout(wsi, NO_PENDING_TIMEOUT, 0);
1595
1596                 /* mark him as being alive */
1597
1598                 wsi->state = WSI_STATE_ESTABLISHED;
1599                 wsi->mode = LWS_CONNMODE_WS_CLIENT;
1600
1601                 fprintf(stderr, "handshake OK for protocol %s\n",
1602                                                            wsi->protocol->name);
1603
1604                 /* call him back to inform him he is up */
1605
1606                 wsi->protocol->callback(context, wsi,
1607                                  LWS_CALLBACK_CLIENT_ESTABLISHED,
1608                                  wsi->user_space,
1609                                  NULL, 0);
1610
1611                 break;
1612
1613 bail3:
1614                 if (wsi->c_protocol)
1615                         free(wsi->c_protocol);
1616
1617 bail2:
1618                 libwebsocket_close_and_free_session(context, wsi,
1619                                                      LWS_CLOSE_STATUS_NOSTATUS);
1620                 return 1;
1621                 
1622
1623         case LWS_CONNMODE_WS_SERVING:
1624         case LWS_CONNMODE_WS_CLIENT:
1625
1626                 /* handle session socket closed */
1627
1628                 if (pollfd->revents & (POLLERR | POLLHUP)) {
1629
1630                         fprintf(stderr, "Session Socket %p (fd=%d) dead\n",
1631                                 (void *)wsi, pollfd->fd);
1632
1633                         libwebsocket_close_and_free_session(context, wsi,
1634                                                      LWS_CLOSE_STATUS_NOSTATUS);
1635                         return 1;
1636                 }
1637
1638                 /* the guy requested a callback when it was OK to write */
1639
1640                 if ((pollfd->revents & POLLOUT) &&
1641                                             wsi->state == WSI_STATE_ESTABLISHED)
1642                         if (lws_handle_POLLOUT_event(context, wsi,
1643                                                                   pollfd) < 0) {
1644                                 libwebsocket_close_and_free_session(
1645                                          context, wsi, LWS_CLOSE_STATUS_NORMAL);
1646                                 return 1;
1647                         }
1648
1649
1650                 /* any incoming data ready? */
1651
1652                 if (!(pollfd->revents & POLLIN))
1653                         break;
1654
1655 #ifdef LWS_OPENSSL_SUPPORT
1656                 if (wsi->ssl)
1657                         eff_buf.token_len = SSL_read(wsi->ssl, buf, sizeof buf);
1658                 else
1659 #endif
1660                         eff_buf.token_len =
1661                                            recv(pollfd->fd, buf, sizeof buf, 0);
1662
1663                 if (eff_buf.token_len < 0) {
1664                         fprintf(stderr, "Socket read returned %d\n",
1665                                                             eff_buf.token_len);
1666                         break;
1667                 }
1668                 if (!eff_buf.token_len) {
1669                         libwebsocket_close_and_free_session(context, wsi,
1670                                                      LWS_CLOSE_STATUS_NOSTATUS);
1671                         return 1;
1672                 }
1673
1674                 /*
1675                  * give any active extensions a chance to munge the buffer
1676                  * before parse.  We pass in a pointer to an lws_tokens struct
1677                  * prepared with the default buffer and content length that's in
1678                  * there.  Rather than rewrite the default buffer, extensions
1679                  * that expect to grow the buffer can adapt .token to
1680                  * point to their own per-connection buffer in the extension
1681                  * user allocation.  By default with no extensions or no
1682                  * extension callback handling, just the normal input buffer is
1683                  * used then so it is efficient.
1684                  */
1685
1686                 eff_buf.token = (char *)buf;
1687
1688                 more = 1;
1689                 while (more) {
1690
1691                         more = 0;
1692
1693                         for (n = 0; n < wsi->count_active_extensions; n++) {
1694                                 m = wsi->active_extensions[n]->callback(context, wsi,
1695                                         LWS_EXT_CALLBACK_PACKET_RX_PREPARSE,
1696                                      wsi->active_extensions_user[n], &eff_buf, 0);
1697                                 if (m < 0) {
1698                                         fprintf(stderr, "Extension reports fatal error\n");
1699                                         libwebsocket_close_and_free_session(context, wsi,
1700                                                              LWS_CLOSE_STATUS_NOSTATUS);
1701                                         return 1;
1702                                 }
1703                                 if (m)
1704                                         more = 1;
1705                         }
1706
1707                         /* service incoming data */
1708
1709                         if (eff_buf.token_len) {
1710                                 n = libwebsocket_read(context, wsi,
1711                                      (unsigned char *)eff_buf.token, eff_buf.token_len);
1712                                 if (n < 0)
1713                                         /* we closed wsi */
1714                                         return 1;
1715                         }
1716
1717                         eff_buf.token = NULL;
1718                         eff_buf.token_len = 0;
1719                 }
1720                 break;
1721         }
1722
1723         return 0;
1724 }
1725
1726
1727 /**
1728  * libwebsocket_context_destroy() - Destroy the websocket context
1729  * @context:    Websocket context
1730  *
1731  *      This function closes any active connections and then frees the
1732  *      context.  After calling this, any further use of the context is
1733  *      undefined.
1734  */
1735 void
1736 libwebsocket_context_destroy(struct libwebsocket_context *context)
1737 {
1738         int n;
1739         int m;
1740         struct libwebsocket *wsi;
1741
1742         for (n = 0; n < FD_HASHTABLE_MODULUS; n++)
1743                 for (m = 0; m < context->fd_hashtable[n].length; m++) {
1744                         wsi = context->fd_hashtable[n].wsi[m];
1745                         libwebsocket_close_and_free_session(context, wsi,
1746                                                     LWS_CLOSE_STATUS_GOINGAWAY);
1747                 }
1748
1749 #ifdef WIN32
1750 #else
1751         close(context->fd_random);
1752 #endif
1753
1754 #ifdef LWS_OPENSSL_SUPPORT
1755         if (context->ssl_ctx)
1756                 SSL_CTX_free(context->ssl_ctx);
1757         if (context->ssl_client_ctx)
1758                 SSL_CTX_free(context->ssl_client_ctx);
1759 #endif
1760
1761         free(context);
1762
1763 #ifdef WIN32
1764         WSACleanup();
1765 #endif
1766 }
1767
1768 /**
1769  * libwebsocket_service() - Service any pending websocket activity
1770  * @context:    Websocket context
1771  * @timeout_ms: Timeout for poll; 0 means return immediately if nothing needed
1772  *              service otherwise block and service immediately, returning
1773  *              after the timeout if nothing needed service.
1774  *
1775  *      This function deals with any pending websocket traffic, for three
1776  *      kinds of event.  It handles these events on both server and client
1777  *      types of connection the same.
1778  *
1779  *      1) Accept new connections to our context's server
1780  *
1781  *      2) Perform pending broadcast writes initiated from other forked
1782  *         processes (effectively serializing asynchronous broadcasts)
1783  *
1784  *      3) Call the receive callback for incoming frame data received by
1785  *          server or client connections.
1786  *
1787  *      You need to call this service function periodically to all the above
1788  *      functions to happen; if your application is single-threaded you can
1789  *      just call it in your main event loop.
1790  *
1791  *      Alternatively you can fork a new process that asynchronously handles
1792  *      calling this service in a loop.  In that case you are happy if this
1793  *      call blocks your thread until it needs to take care of something and
1794  *      would call it with a large nonzero timeout.  Your loop then takes no
1795  *      CPU while there is nothing happening.
1796  *
1797  *      If you are calling it in a single-threaded app, you don't want it to
1798  *      wait around blocking other things in your loop from happening, so you
1799  *      would call it with a timeout_ms of 0, so it returns immediately if
1800  *      nothing is pending, or as soon as it services whatever was pending.
1801  */
1802
1803
1804 int
1805 libwebsocket_service(struct libwebsocket_context *context, int timeout_ms)
1806 {
1807         int n;
1808
1809         /* stay dead once we are dead */
1810
1811         if (context == NULL)
1812                 return 1;
1813
1814         /* wait for something to need service */
1815
1816         n = poll(context->fds, context->fds_count, timeout_ms);
1817         if (n == 0) /* poll timeout */
1818                 return 0;
1819
1820         if (n < 0) {
1821                 /*
1822                 fprintf(stderr, "Listen Socket dead\n");
1823                 */
1824                 return 1;
1825         }
1826
1827         /* handle accept on listening socket? */
1828
1829         for (n = 0; n < context->fds_count; n++)
1830                 if (context->fds[n].revents)
1831                         libwebsocket_service_fd(context, &context->fds[n]);
1832
1833         return 0;
1834 }
1835
1836 /**
1837  * libwebsocket_callback_on_writable() - Request a callback when this socket
1838  *                                       becomes able to be written to without
1839  *                                       blocking
1840  *
1841  * @context:    libwebsockets context
1842  * @wsi:        Websocket connection instance to get callback for
1843  */
1844
1845 int
1846 libwebsocket_callback_on_writable(struct libwebsocket_context *context,
1847                                                        struct libwebsocket *wsi)
1848 {
1849         int n;
1850
1851         for (n = 0; n < context->fds_count; n++)
1852                 if (context->fds[n].fd == wsi->sock) {
1853                         context->fds[n].events |= POLLOUT;
1854                         n = context->fds_count;
1855                 }
1856
1857         /* external POLL support via protocol 0 */
1858         context->protocols[0].callback(context, wsi,
1859                 LWS_CALLBACK_SET_MODE_POLL_FD,
1860                 (void *)(long)wsi->sock, NULL, POLLOUT);
1861
1862         return 1;
1863 }
1864
1865 /**
1866  * libwebsocket_callback_on_writable_all_protocol() - Request a callback for
1867  *                      all connections using the given protocol when it
1868  *                      becomes possible to write to each socket without
1869  *                      blocking in turn.
1870  *
1871  * @protocol:   Protocol whose connections will get callbacks
1872  */
1873
1874 int
1875 libwebsocket_callback_on_writable_all_protocol(
1876                                   const struct libwebsocket_protocols *protocol)
1877 {
1878         struct libwebsocket_context *context = protocol->owning_server;
1879         int n;
1880         int m;
1881         struct libwebsocket *wsi;
1882
1883         for (n = 0; n < FD_HASHTABLE_MODULUS; n++) {
1884
1885                 for (m = 0; m < context->fd_hashtable[n].length; m++) {
1886
1887                         wsi = context->fd_hashtable[n].wsi[m];
1888
1889                         if (wsi->protocol == protocol)
1890                                 libwebsocket_callback_on_writable(context, wsi);
1891                 }
1892         }
1893
1894         return 0;
1895 }
1896
1897 /**
1898  * libwebsocket_set_timeout() - marks the wsi as subject to a timeout
1899  *
1900  * You will not need this unless you are doing something special
1901  *
1902  * @wsi:        Websocket connection instance
1903  * @reason:     timeout reason
1904  * @secs:       how many seconds
1905  */
1906
1907 void
1908 libwebsocket_set_timeout(struct libwebsocket *wsi,
1909                                           enum pending_timeout reason, int secs)
1910 {
1911         struct timeval tv;
1912
1913         gettimeofday(&tv, NULL);
1914
1915         wsi->pending_timeout_limit = tv.tv_sec + secs;
1916         wsi->pending_timeout = reason;
1917 }
1918
1919
1920 /**
1921  * libwebsocket_get_socket_fd() - returns the socket file descriptor
1922  *
1923  * You will not need this unless you are doing something special
1924  *
1925  * @wsi:        Websocket connection instance
1926  */
1927
1928 int
1929 libwebsocket_get_socket_fd(struct libwebsocket *wsi)
1930 {
1931         return wsi->sock;
1932 }
1933
1934 /**
1935  * libwebsocket_rx_flow_control() - Enable and disable socket servicing for
1936  *                              receieved packets.
1937  *
1938  * If the output side of a server process becomes choked, this allows flow
1939  * control for the input side.
1940  *
1941  * @wsi:        Websocket connection instance to get callback for
1942  * @enable:     0 = disable read servicing for this connection, 1 = enable
1943  */
1944
1945 int
1946 libwebsocket_rx_flow_control(struct libwebsocket *wsi, int enable)
1947 {
1948         struct libwebsocket_context *context = wsi->protocol->owning_server;
1949         int n;
1950
1951         for (n = 0; n < context->fds_count; n++)
1952                 if (context->fds[n].fd == wsi->sock) {
1953                         if (enable)
1954                                 context->fds[n].events |= POLLIN;
1955                         else
1956                                 context->fds[n].events &= ~POLLIN;
1957
1958                         return 0;
1959                 }
1960
1961         if (enable)
1962                 /* external POLL support via protocol 0 */
1963                 context->protocols[0].callback(context, wsi,
1964                         LWS_CALLBACK_SET_MODE_POLL_FD,
1965                         (void *)(long)wsi->sock, NULL, POLLIN);
1966         else
1967                 /* external POLL support via protocol 0 */
1968                 context->protocols[0].callback(context, wsi,
1969                         LWS_CALLBACK_CLEAR_MODE_POLL_FD,
1970                         (void *)(long)wsi->sock, NULL, POLLIN);
1971
1972
1973         fprintf(stderr, "libwebsocket_callback_on_writable "
1974                                                      "unable to find socket\n");
1975         return 1;
1976 }
1977
1978 /**
1979  * libwebsocket_canonical_hostname() - returns this host's hostname
1980  *
1981  * This is typically used by client code to fill in the host parameter
1982  * when making a client connection.  You can only call it after the context
1983  * has been created.
1984  *
1985  * @context:    Websocket context
1986  */
1987
1988
1989 extern const char *
1990 libwebsocket_canonical_hostname(struct libwebsocket_context *context)
1991 {
1992         return (const char *)context->canonical_hostname;
1993 }
1994
1995
1996 static void sigpipe_handler(int x)
1997 {
1998 }
1999
2000 #ifdef LWS_OPENSSL_SUPPORT
2001 static int
2002 OpenSSL_verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx)
2003 {
2004
2005         SSL *ssl;
2006         int n;
2007         struct libwebsocket_context *context;
2008
2009         ssl = X509_STORE_CTX_get_ex_data(x509_ctx,
2010                 SSL_get_ex_data_X509_STORE_CTX_idx());
2011
2012         /*
2013          * !!! nasty openssl requires the index to come as a library-scope
2014          * static
2015          */
2016         context = SSL_get_ex_data(ssl, openssl_websocket_private_data_index);
2017         
2018         n = context->protocols[0].callback(NULL, NULL,
2019                 LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION,
2020                                                    x509_ctx, ssl, preverify_ok);
2021
2022         /* convert return code from 0 = OK to 1 = OK */
2023
2024         if (!n)
2025                 n = 1;
2026         else
2027                 n = 0;
2028
2029         return n;
2030 }
2031 #endif
2032
2033
2034 /**
2035  * libwebsocket_create_context() - Create the websocket handler
2036  * @port:       Port to listen on... you can use 0 to suppress listening on
2037  *              any port, that's what you want if you are not running a
2038  *              websocket server at all but just using it as a client
2039  * @interf:  NULL to bind the listen socket to all interfaces, or the
2040  *              interface name, eg, "eth2"
2041  * @protocols:  Array of structures listing supported protocols and a protocol-
2042  *              specific callback for each one.  The list is ended with an
2043  *              entry that has a NULL callback pointer.
2044  *              It's not const because we write the owning_server member
2045  * @extensions: NULL or array of libwebsocket_extension structs listing the
2046  *              extensions this context supports
2047  * @ssl_cert_filepath:  If libwebsockets was compiled to use ssl, and you want
2048  *                      to listen using SSL, set to the filepath to fetch the
2049  *                      server cert from, otherwise NULL for unencrypted
2050  * @ssl_private_key_filepath: filepath to private key if wanting SSL mode,
2051  *                      else ignored
2052  * @gid:        group id to change to after setting listen socket, or -1.
2053  * @uid:        user id to change to after setting listen socket, or -1.
2054  * @options:    0, or LWS_SERVER_OPTION_DEFEAT_CLIENT_MASK
2055  *
2056  *      This function creates the listening socket and takes care
2057  *      of all initialization in one step.
2058  *
2059  *      After initialization, it returns a struct libwebsocket_context * that
2060  *      represents this server.  After calling, user code needs to take care
2061  *      of calling libwebsocket_service() with the context pointer to get the
2062  *      server's sockets serviced.  This can be done in the same process context
2063  *      or a forked process, or another thread,
2064  *
2065  *      The protocol callback functions are called for a handful of events
2066  *      including http requests coming in, websocket connections becoming
2067  *      established, and data arriving; it's also called periodically to allow
2068  *      async transmission.
2069  *
2070  *      HTTP requests are sent always to the FIRST protocol in @protocol, since
2071  *      at that time websocket protocol has not been negotiated.  Other
2072  *      protocols after the first one never see any HTTP callack activity.
2073  *
2074  *      The server created is a simple http server by default; part of the
2075  *      websocket standard is upgrading this http connection to a websocket one.
2076  *
2077  *      This allows the same server to provide files like scripts and favicon /
2078  *      images or whatever over http and dynamic data over websockets all in
2079  *      one place; they're all handled in the user callback.
2080  */
2081
2082 struct libwebsocket_context *
2083 libwebsocket_create_context(int port, const char *interf,
2084                                struct libwebsocket_protocols *protocols,
2085                                struct libwebsocket_extension *extensions,
2086                                const char *ssl_cert_filepath,
2087                                const char *ssl_private_key_filepath,
2088                                int gid, int uid, unsigned int options)
2089 {
2090         int n;
2091         int sockfd = 0;
2092         int fd;
2093         struct sockaddr_in serv_addr, cli_addr;
2094         int opt = 1;
2095         struct libwebsocket_context *context = NULL;
2096         unsigned int slen;
2097         char *p;
2098         char hostname[1024];
2099         struct hostent *he;
2100         struct libwebsocket *wsi;
2101
2102 #ifdef LWS_OPENSSL_SUPPORT
2103         SSL_METHOD *method;
2104         char ssl_err_buf[512];
2105 #endif
2106
2107 #ifdef _WIN32
2108         {
2109                 WORD wVersionRequested;
2110                 WSADATA wsaData;
2111                 int err;
2112
2113                 /* Use the MAKEWORD(lowbyte, highbyte) macro from Windef.h */
2114                 wVersionRequested = MAKEWORD(2, 2);
2115
2116                 err = WSAStartup(wVersionRequested, &wsaData);
2117                 if (err != 0) {
2118                         /* Tell the user that we could not find a usable */
2119                         /* Winsock DLL.                                  */
2120                         fprintf(stderr, "WSAStartup failed with error: %d\n",
2121                                                                            err);
2122                         return NULL;
2123                 }
2124         }
2125 #endif
2126
2127
2128         context = malloc(sizeof(struct libwebsocket_context));
2129         if (!context) {
2130                 fprintf(stderr, "No memory for websocket context\n");
2131                 return NULL;
2132         }
2133         context->protocols = protocols;
2134         context->listen_port = port;
2135         context->http_proxy_port = 0;
2136         context->http_proxy_address[0] = '\0';
2137         context->options = options;
2138         context->fds_count = 0;
2139         context->extensions = extensions;
2140
2141 #ifdef WIN32
2142         context->fd_random = 0;
2143 #else
2144         context->fd_random = open(SYSTEM_RANDOM_FILEPATH, O_RDONLY);
2145         if (context->fd_random < 0) {
2146                 fprintf(stderr, "Unable to open random device %s %d\n",
2147                                     SYSTEM_RANDOM_FILEPATH, context->fd_random);
2148                 return NULL;
2149         }
2150 #endif
2151
2152 #ifdef LWS_OPENSSL_SUPPORT
2153         context->use_ssl = 0;
2154         context->ssl_ctx = NULL;
2155         context->ssl_client_ctx = NULL;
2156         openssl_websocket_private_data_index = 0;
2157 #endif
2158         /* find canonical hostname */
2159
2160         hostname[(sizeof hostname) - 1] = '\0';
2161         gethostname(hostname, (sizeof hostname) - 1);
2162         he = gethostbyname(hostname);
2163         if (he) {
2164                 strncpy(context->canonical_hostname, he->h_name,
2165                                         sizeof context->canonical_hostname - 1);
2166                 context->canonical_hostname[
2167                                 sizeof context->canonical_hostname - 1] = '\0';
2168         } else
2169                 strncpy(context->canonical_hostname, hostname,
2170                                         sizeof context->canonical_hostname - 1);
2171
2172         /* split the proxy ads:port if given */
2173
2174         p = getenv("http_proxy");
2175         if (p) {
2176                 strncpy(context->http_proxy_address, p,
2177                                         sizeof context->http_proxy_address - 1);
2178                 context->http_proxy_address[
2179                                  sizeof context->http_proxy_address - 1] = '\0';
2180
2181                 p = strchr(context->http_proxy_address, ':');
2182                 if (p == NULL) {
2183                         fprintf(stderr, "http_proxy needs to be ads:port\n");
2184                         return NULL;
2185                 }
2186                 *p = '\0';
2187                 context->http_proxy_port = atoi(p + 1);
2188
2189                 fprintf(stderr, "Using proxy %s:%u\n",
2190                                 context->http_proxy_address,
2191                                                       context->http_proxy_port);
2192         }
2193
2194         if (port) {
2195
2196 #ifdef LWS_OPENSSL_SUPPORT
2197                 context->use_ssl = ssl_cert_filepath != NULL &&
2198                                                ssl_private_key_filepath != NULL;
2199                 if (context->use_ssl)
2200                         fprintf(stderr, " Compiled with SSL support, "
2201                                                                   "using it\n");
2202                 else
2203                         fprintf(stderr, " Compiled with SSL support, "
2204                                                               "not using it\n");
2205
2206 #else
2207                 if (ssl_cert_filepath != NULL &&
2208                                              ssl_private_key_filepath != NULL) {
2209                         fprintf(stderr, " Not compiled for OpenSSl support!\n");
2210                         return NULL;
2211                 }
2212                 fprintf(stderr, " Compiled without SSL support, "
2213                                                        "serving unencrypted\n");
2214 #endif
2215         }
2216
2217         /* ignore SIGPIPE */
2218 #ifdef WIN32
2219 #else
2220         signal(SIGPIPE, sigpipe_handler);
2221 #endif
2222
2223
2224 #ifdef LWS_OPENSSL_SUPPORT
2225
2226         /* basic openssl init */
2227
2228         SSL_library_init();
2229
2230         OpenSSL_add_all_algorithms();
2231         SSL_load_error_strings();
2232
2233         openssl_websocket_private_data_index =
2234                 SSL_get_ex_new_index(0, "libwebsockets", NULL, NULL, NULL);
2235
2236         /*
2237          * Firefox insists on SSLv23 not SSLv3
2238          * Konq disables SSLv2 by default now, SSLv23 works
2239          */
2240
2241         method = (SSL_METHOD *)SSLv23_server_method();
2242         if (!method) {
2243                 fprintf(stderr, "problem creating ssl method: %s\n",
2244                         ERR_error_string(ERR_get_error(), ssl_err_buf));
2245                 return NULL;
2246         }
2247         context->ssl_ctx = SSL_CTX_new(method); /* create context */
2248         if (!context->ssl_ctx) {
2249                 fprintf(stderr, "problem creating ssl context: %s\n",
2250                         ERR_error_string(ERR_get_error(), ssl_err_buf));
2251                 return NULL;
2252         }
2253
2254         /* client context */
2255         if (port == CONTEXT_PORT_NO_LISTEN)
2256         {
2257                 method = (SSL_METHOD *)SSLv23_client_method();
2258                 if (!method) {
2259                         fprintf(stderr, "problem creating ssl method: %s\n",
2260                                 ERR_error_string(ERR_get_error(), ssl_err_buf));
2261                         return NULL;
2262                 }
2263                 /* create context */
2264                 context->ssl_client_ctx = SSL_CTX_new(method);
2265                 if (!context->ssl_client_ctx) {
2266                         fprintf(stderr, "problem creating ssl context: %s\n",
2267                                 ERR_error_string(ERR_get_error(), ssl_err_buf));
2268                         return NULL;
2269                 }
2270
2271                 /* openssl init for cert verification (for client sockets) */
2272
2273                 if (!SSL_CTX_load_verify_locations(
2274                                         context->ssl_client_ctx, NULL,
2275                                                       LWS_OPENSSL_CLIENT_CERTS))
2276                         fprintf(stderr,
2277                             "Unable to load SSL Client certs from %s "
2278                             "(set by --with-client-cert-dir= in configure) -- "
2279                                 " client ssl isn't going to work",
2280                                                       LWS_OPENSSL_CLIENT_CERTS);
2281
2282                 /*
2283                  * callback allowing user code to load extra verification certs
2284                  * helping the client to verify server identity
2285                  */
2286
2287                 context->protocols[0].callback(context, NULL,
2288                         LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS,
2289                         context->ssl_client_ctx, NULL, 0);
2290         }
2291         /* as a server, are we requiring clients to identify themselves? */
2292
2293         if (options & LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT) {
2294
2295                 /* absolutely require the client cert */
2296                 
2297                 SSL_CTX_set_verify(context->ssl_ctx,
2298                        SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
2299                                                        OpenSSL_verify_callback);
2300
2301                 /*
2302                  * give user code a chance to load certs into the server
2303                  * allowing it to verify incoming client certs
2304                  */
2305
2306                 context->protocols[0].callback(context, NULL,
2307                         LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS,
2308                                                      context->ssl_ctx, NULL, 0);
2309         }
2310
2311         if (context->use_ssl) {
2312
2313                 /* openssl init for server sockets */
2314
2315                 /* set the local certificate from CertFile */
2316                 n = SSL_CTX_use_certificate_file(context->ssl_ctx,
2317                                         ssl_cert_filepath, SSL_FILETYPE_PEM);
2318                 if (n != 1) {
2319                         fprintf(stderr, "problem getting cert '%s': %s\n",
2320                                 ssl_cert_filepath,
2321                                 ERR_error_string(ERR_get_error(), ssl_err_buf));
2322                         return NULL;
2323                 }
2324                 /* set the private key from KeyFile */
2325                 if (SSL_CTX_use_PrivateKey_file(context->ssl_ctx,
2326                              ssl_private_key_filepath, SSL_FILETYPE_PEM) != 1) {
2327                         fprintf(stderr, "ssl problem getting key '%s': %s\n",
2328                                                 ssl_private_key_filepath,
2329                                 ERR_error_string(ERR_get_error(), ssl_err_buf));
2330                         return NULL;
2331                 }
2332                 /* verify private key */
2333                 if (!SSL_CTX_check_private_key(context->ssl_ctx)) {
2334                         fprintf(stderr, "Private SSL key doesn't match cert\n");
2335                         return NULL;
2336                 }
2337
2338                 /* SSL is happy and has a cert it's content with */
2339         }
2340 #endif
2341
2342         /* selftest */
2343
2344         if (lws_b64_selftest())
2345                 return NULL;
2346
2347         /* fd hashtable init */
2348
2349         for (n = 0; n < FD_HASHTABLE_MODULUS; n++)
2350                 context->fd_hashtable[n].length = 0;
2351
2352         /* set up our external listening socket we serve on */
2353
2354         if (port) {
2355
2356                 sockfd = socket(AF_INET, SOCK_STREAM, 0);
2357                 if (sockfd < 0) {
2358                         fprintf(stderr, "ERROR opening socket");
2359                         return NULL;
2360                 }
2361
2362                 /* allow us to restart even if old sockets in TIME_WAIT */
2363                 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
2364
2365                 bzero((char *) &serv_addr, sizeof(serv_addr));
2366                 serv_addr.sin_family = AF_INET;
2367                 if (interf == NULL)
2368                         serv_addr.sin_addr.s_addr = INADDR_ANY;
2369                 else
2370                         interface_to_sa(interf, &serv_addr,
2371                                                 sizeof(serv_addr));
2372                 serv_addr.sin_port = htons(port);
2373
2374                 n = bind(sockfd, (struct sockaddr *) &serv_addr,
2375                                                              sizeof(serv_addr));
2376                 if (n < 0) {
2377                         fprintf(stderr, "ERROR on binding to port %d (%d %d)\n",
2378                                                                 port, n, errno);
2379                         return NULL;
2380                 }
2381
2382                 wsi = malloc(sizeof(struct libwebsocket));
2383                 memset(wsi, 0, sizeof (struct libwebsocket));
2384                 wsi->sock = sockfd;
2385                 wsi->count_active_extensions = 0;
2386                 wsi->mode = LWS_CONNMODE_SERVER_LISTENER;
2387                 insert_wsi(context, wsi);
2388
2389                 listen(sockfd, 5);
2390                 fprintf(stderr, " Listening on port %d\n", port);
2391
2392                 /* list in the internal poll array */
2393                 
2394                 context->fds[context->fds_count].fd = sockfd;
2395                 context->fds[context->fds_count++].events = POLLIN;
2396
2397                 /* external POLL support via protocol 0 */
2398                 context->protocols[0].callback(context, wsi,
2399                         LWS_CALLBACK_ADD_POLL_FD,
2400                         (void *)(long)sockfd, NULL, POLLIN);
2401
2402         }
2403
2404         /* drop any root privs for this process */
2405 #ifdef WIN32
2406 #else
2407         if (gid != -1)
2408                 if (setgid(gid))
2409                         fprintf(stderr, "setgid: %s\n", strerror(errno));
2410         if (uid != -1)
2411                 if (setuid(uid))
2412                         fprintf(stderr, "setuid: %s\n", strerror(errno));
2413 #endif
2414
2415         /* set up our internal broadcast trigger sockets per-protocol */
2416
2417         for (context->count_protocols = 0;
2418                         protocols[context->count_protocols].callback;
2419                                                    context->count_protocols++) {
2420                 protocols[context->count_protocols].owning_server = context;
2421                 protocols[context->count_protocols].protocol_index =
2422                                                        context->count_protocols;
2423
2424                 fd = socket(AF_INET, SOCK_STREAM, 0);
2425                 if (fd < 0) {
2426                         fprintf(stderr, "ERROR opening socket");
2427                         return NULL;
2428                 }
2429
2430                 /* allow us to restart even if old sockets in TIME_WAIT */
2431                 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
2432
2433                 bzero((char *) &serv_addr, sizeof(serv_addr));
2434                 serv_addr.sin_family = AF_INET;
2435                 serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2436                 serv_addr.sin_port = 0; /* pick the port for us */
2437
2438                 n = bind(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
2439                 if (n < 0) {
2440                         fprintf(stderr, "ERROR on binding to port %d (%d %d)\n",
2441                                                                 port, n, errno);
2442                         return NULL;
2443                 }
2444
2445                 slen = sizeof cli_addr;
2446                 n = getsockname(fd, (struct sockaddr *)&cli_addr, &slen);
2447                 if (n < 0) {
2448                         fprintf(stderr, "getsockname failed\n");
2449                         return NULL;
2450                 }
2451                 protocols[context->count_protocols].broadcast_socket_port =
2452                                                        ntohs(cli_addr.sin_port);
2453                 listen(fd, 5);
2454
2455                 debug("  Protocol %s broadcast socket %d\n",
2456                                 protocols[context->count_protocols].name,
2457                                                       ntohs(cli_addr.sin_port));
2458
2459                 /* dummy wsi per broadcast proxy socket */
2460
2461                 wsi = malloc(sizeof(struct libwebsocket));
2462                 memset(wsi, 0, sizeof (struct libwebsocket));
2463                 wsi->sock = fd;
2464                 wsi->mode = LWS_CONNMODE_BROADCAST_PROXY_LISTENER;
2465                 wsi->count_active_extensions = 0;
2466                 /* note which protocol we are proxying */
2467                 wsi->protocol_index_for_broadcast_proxy =
2468                                                        context->count_protocols;
2469                 insert_wsi(context, wsi);
2470
2471                 /* list in internal poll array */
2472
2473                 context->fds[context->fds_count].fd = fd;
2474                 context->fds[context->fds_count].events = POLLIN;
2475                 context->fds[context->fds_count].revents = 0;
2476                 context->fds_count++;
2477
2478                 /* external POLL support via protocol 0 */
2479                 context->protocols[0].callback(context, wsi,
2480                         LWS_CALLBACK_ADD_POLL_FD,
2481                         (void *)(long)fd, NULL, POLLIN);
2482         }
2483
2484         return context;
2485 }
2486
2487
2488 #ifndef LWS_NO_FORK
2489
2490 /**
2491  * libwebsockets_fork_service_loop() - Optional helper function forks off
2492  *                                a process for the websocket server loop.
2493  *                              You don't have to use this but if not, you
2494  *                              have to make sure you are calling
2495  *                              libwebsocket_service periodically to service
2496  *                              the websocket traffic
2497  * @context:    server context returned by creation function
2498  */
2499
2500 int
2501 libwebsockets_fork_service_loop(struct libwebsocket_context *context)
2502 {
2503         int fd;
2504         struct sockaddr_in cli_addr;
2505         int n;
2506         int p;
2507
2508         n = fork();
2509         if (n < 0)
2510                 return n;
2511
2512         if (!n) {
2513
2514                 /* main process context */
2515
2516                 /*
2517                  * set up the proxy sockets to allow broadcast from
2518                  * service process context
2519                  */
2520
2521                 for (p = 0; p < context->count_protocols; p++) {
2522                         fd = socket(AF_INET, SOCK_STREAM, 0);
2523                         if (fd < 0) {
2524                                 fprintf(stderr, "Unable to create socket\n");
2525                                 return -1;
2526                         }
2527                         cli_addr.sin_family = AF_INET;
2528                         cli_addr.sin_port = htons(
2529                              context->protocols[p].broadcast_socket_port);
2530                         cli_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2531                         n = connect(fd, (struct sockaddr *)&cli_addr,
2532                                                                sizeof cli_addr);
2533                         if (n < 0) {
2534                                 fprintf(stderr, "Unable to connect to "
2535                                                 "broadcast socket %d, %s\n",
2536                                                 n, strerror(errno));
2537                                 return -1;
2538                         }
2539
2540                         context->protocols[p].broadcast_socket_user_fd = fd;
2541                 }
2542
2543                 return 0;
2544         }
2545
2546         /* we want a SIGHUP when our parent goes down */
2547         prctl(PR_SET_PDEATHSIG, SIGHUP);
2548
2549         /* in this forked process, sit and service websocket connections */
2550
2551         while (1)
2552                 if (libwebsocket_service(context, 1000))
2553                         return -1;
2554
2555         return 0;
2556 }
2557
2558 #endif
2559
2560 /**
2561  * libwebsockets_get_protocol() - Returns a protocol pointer from a websocket
2562  *                                connection.
2563  * @wsi:        pointer to struct websocket you want to know the protocol of
2564  *
2565  *
2566  *      This is useful to get the protocol to broadcast back to from inside
2567  * the callback.
2568  */
2569
2570 const struct libwebsocket_protocols *
2571 libwebsockets_get_protocol(struct libwebsocket *wsi)
2572 {
2573         return wsi->protocol;
2574 }
2575
2576 /**
2577  * libwebsockets_broadcast() - Sends a buffer to the callback for all active
2578  *                                connections of the given protocol.
2579  * @protocol:   pointer to the protocol you will broadcast to all members of
2580  * @buf:  buffer containing the data to be broadcase.  NOTE: this has to be
2581  *              allocated with LWS_SEND_BUFFER_PRE_PADDING valid bytes before
2582  *              the pointer and LWS_SEND_BUFFER_POST_PADDING afterwards in the
2583  *              case you are calling this function from callback context.
2584  * @len:        length of payload data in buf, starting from buf.
2585  *
2586  *      This function allows bulk sending of a packet to every connection using
2587  * the given protocol.  It does not send the data directly; instead it calls
2588  * the callback with a reason type of LWS_CALLBACK_BROADCAST.  If the callback
2589  * wants to actually send the data for that connection, the callback itself
2590  * should call libwebsocket_write().
2591  *
2592  * libwebsockets_broadcast() can be called from another fork context without
2593  * having to take any care about data visibility between the processes, it'll
2594  * "just work".
2595  */
2596
2597
2598 int
2599 libwebsockets_broadcast(const struct libwebsocket_protocols *protocol,
2600                                                  unsigned char *buf, size_t len)
2601 {
2602         struct libwebsocket_context *context = protocol->owning_server;
2603         int n;
2604         int m;
2605         struct libwebsocket * wsi;
2606
2607         if (!protocol->broadcast_socket_user_fd) {
2608                 /*
2609                  * We are either running unforked / flat, or we are being
2610                  * called from poll thread context
2611                  * eg, from a callback.  In that case don't use sockets for
2612                  * broadcast IPC (since we can't open a socket connection to
2613                  * a socket listening on our own thread) but directly do the
2614                  * send action.
2615                  *
2616                  * Locking is not needed because we are by definition being
2617                  * called in the poll thread context and are serialized.
2618                  */
2619
2620                 for (n = 0; n < FD_HASHTABLE_MODULUS; n++) {
2621
2622                         for (m = 0; m < context->fd_hashtable[n].length; m++) {
2623
2624                                 wsi = context->fd_hashtable[n].wsi[m];
2625
2626                                 if (wsi->mode != LWS_CONNMODE_WS_SERVING)
2627                                         continue;
2628
2629                                 /*
2630                                  * never broadcast to
2631                                  * non-established connections
2632                                  */
2633                                 if (wsi->state != WSI_STATE_ESTABLISHED)
2634                                         continue;
2635
2636                                 /* only broadcast to guys using
2637                                  * requested protocol
2638                                  */
2639                                 if (wsi->protocol != protocol)
2640                                         continue;
2641
2642                                 wsi->protocol->callback(context, wsi,
2643                                          LWS_CALLBACK_BROADCAST,
2644                                          wsi->user_space,
2645                                          buf, len);
2646                         }
2647                 }
2648
2649                 return 0;
2650         }
2651
2652         /*
2653          * We're being called from a different process context than the server
2654          * loop.  Instead of broadcasting directly, we send our
2655          * payload on a socket to do the IPC; the server process will serialize
2656          * the broadcast action in its main poll() loop.
2657          *
2658          * There's one broadcast socket listening for each protocol supported
2659          * set up when the websocket server initializes
2660          */
2661
2662         n = send(protocol->broadcast_socket_user_fd, buf, len, MSG_NOSIGNAL);
2663
2664         return n;
2665 }