3 Copyright 1996, 1997, 1998, 1999, 2000 Red Hat, Inc.
5 Written by Christopher Faylor of Cygnus Solutions
8 This file is part of Cygwin.
10 This software is a copyrighted work licensed under the terms of the
11 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
15 * The following line means that the BSD socket
16 * definitions for fd_set, FD_ISSET etc. are used in this
20 #define __INSIDE_CYGWIN_NET__
25 #include <sys/socket.h>
41 #include "perthread.h"
45 * All these defines below should be in sys/types.h
46 * but because of the includes above, they may not have
47 * been included. We create special UNIX_xxxx versions here.
51 #define NBBY 8 /* number of bits in a byte */
55 * Select uses bit masks of file descriptors in longs.
56 * These macros manipulate such bit fields (the filesystem macros use chars).
57 * FD_SETSIZE may be defined by the user, but the default here
58 * should be >= NOFILE (param.h).
62 #define UNIX_NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */
64 #define unix_howmany(x,y) (((x)+((y)-1))/(y))
67 #define unix_fd_set fd_set
69 #define NULL_fd_set ((fd_set *)NULL)
70 #define sizeof_fd_set(n) \
71 ((unsigned) (NULL_fd_set->fds_bits + unix_howmany((n), UNIX_NFDBITS)))
72 #define UNIX_FD_SET(n, p) \
73 ((p)->fds_bits[(n)/UNIX_NFDBITS] |= (1L << ((n) % UNIX_NFDBITS)))
74 #define UNIX_FD_CLR(n, p) \
75 ((p)->fds_bits[(n)/UNIX_NFDBITS] &= ~(1L << ((n) % UNIX_NFDBITS)))
76 #define UNIX_FD_ISSET(n, p) \
77 ((p)->fds_bits[(n)/UNIX_NFDBITS] & (1L << ((n) % UNIX_NFDBITS)))
78 #define UNIX_FD_ZERO(p, n) \
79 bzero ((caddr_t)(p), sizeof_fd_set ((n)))
81 #define allocfd_set(n) ((fd_set *) memset (alloca (sizeof_fd_set (n)), 0, sizeof_fd_set (n)))
82 #define copyfd_set(to, from, n) memcpy (to, from, sizeof_fd_set (n));
84 /* Make a fhandler_foo::ready_for_ready method.
85 Assumption: The "ready_for_read" methods are called with one level of
87 #define MAKEready(what) \
89 fhandler_##what::ready_for_read (int fd, DWORD howlong, int ignra) \
91 select_record me (this); \
93 (void) select_read (&me); \
94 while (!peek_##what (&me, ignra) && howlong == INFINITE) \
95 if (fd >= 0 && fdtab.not_open (fd)) \
97 else if (WaitForSingleObject (signal_arrived, 10) == WAIT_OBJECT_0) \
99 return me.read_ready; \
102 #define set_handle_or_return_if_not_open(h, s) \
103 h = (s)->fh->get_handle (); \
104 if (fdtab.not_open ((s)->fd)) \
106 (s)->saw_error = TRUE; \
111 /* The main select code.
115 cygwin_select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
119 fd_set *dummy_readfds = allocfd_set (maxfds);
120 fd_set *dummy_writefds = allocfd_set (maxfds);
121 fd_set *dummy_exceptfds = allocfd_set (maxfds);
122 sigframe thisframe (mainthread);
132 select_printf ("%d, %p, %p, %p, %p", maxfds, readfds, writefds, exceptfds, to);
135 readfds = dummy_readfds;
137 writefds = dummy_writefds;
139 exceptfds = dummy_exceptfds;
141 for (int i = 0; i < maxfds; i++)
142 if (!sel.test_and_set (i, readfds, writefds, exceptfds))
144 select_printf ("aborting due to test_and_set error");
145 return -1; /* Invalid fd, maybe? */
148 /* Convert to milliseconds or INFINITE if to == NULL */
149 DWORD ms = to ? (to->tv_sec * 1000) + (to->tv_usec / 1000) : INFINITE;
150 if (ms == 0 && to->tv_usec)
151 ms = 1; /* At least 1 ms granularity */
154 select_printf ("to->tv_sec %d, to->tv_usec %d, ms %d", to->tv_sec, to->tv_usec, ms);
156 select_printf ("to NULL, ms %x", ms);
158 select_printf ("sel.always_ready %d", sel.always_ready);
160 /* Degenerate case. No fds to wait for. Just wait. */
161 if (sel.start.next == NULL)
163 if (WaitForSingleObject (signal_arrived, ms) == WAIT_OBJECT_0)
165 select_printf ("signal received");
166 set_sig_errno (EINTR);
172 /* Allocate some fd_set structures using the number of fds as a guide. */
173 fd_set *r = allocfd_set (maxfds);
174 fd_set *w = allocfd_set (maxfds);
175 fd_set *e = allocfd_set (maxfds);
177 if (sel.always_ready || ms == 0)
178 /* Don't bother waiting. */;
179 else if (sel.wait (r, w, e, ms))
180 return -1; /* some kind of error */
182 copyfd_set (readfds, r, maxfds);
183 copyfd_set (writefds, w, maxfds);
184 copyfd_set (exceptfds, e, maxfds);
185 return sel.poll (readfds, writefds, exceptfds);
189 select_stuff::~select_stuff ()
191 select_record *s = &start;
193 select_printf ("calling cleanup routines");
194 while ((s = s->next))
196 s->cleanup (s, this);
198 select_record *snext = start.next;
200 select_printf ("deleting select records");
208 /* Add a record to the select chain */
210 select_stuff::test_and_set (int i, fd_set *readfds, fd_set *writefds,
213 select_record *s = NULL;
214 if (UNIX_FD_ISSET (i, readfds) && (s = fdtab.select_read (i, s)) == NULL)
215 return 0; /* error */
216 if (UNIX_FD_ISSET (i, writefds) && (s = fdtab.select_write (i, s)) == NULL)
217 return 0; /* error */
218 if (UNIX_FD_ISSET (i, exceptfds) && (s = fdtab.select_except (i, s)) == NULL)
219 return 0; /* error */
221 return 1; /* nothing to do */
223 if (s->read_ready || s->write_ready || s->except_ready)
226 if (s->windows_handle || s->windows_handle || s->windows_handle)
229 s->next = start.next;
234 /* Poll every fd in the select chain. Set appropriate fd in mask. */
236 select_stuff::poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds)
239 select_record *s = &start;
240 while ((s = s->next))
241 n += s->poll (s, readfds, writefds, exceptfds);
242 select_printf ("returning %d", n);
246 /* The heart of select. Waits for an fd to do something interesting. */
248 select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
252 HANDLE w4[MAXIMUM_WAIT_OBJECTS];
253 select_record *s = &start;
256 w4[m++] = signal_arrived; /* Always wait for the arrival of a signal. */
257 /* Loop through the select chain, starting up anything appropriate and
258 counting the number of active fds. */
259 while ((s = s->next))
261 if (m > MAXIMUM_WAIT_OBJECTS)
266 if (!s->startup (s, this))
273 for (int i = 1; i < m; i++)
281 DWORD start_time = GetTickCount (); /* Record the current time for later use. */
283 debug_printf ("m %d, ms %u", m, ms);
287 wait_ret = WaitForMultipleObjects (m, w4, FALSE, ms);
289 wait_ret = MsgWaitForMultipleObjects (m, w4, FALSE, ms, QS_ALLINPUT);
294 select_printf ("signal received");
295 set_sig_errno (EINTR);
298 select_printf ("WaitForMultipleObjects failed");
302 select_printf ("timed out");
306 select_printf ("woke up. wait_ret %d. verifying", wait_ret);
309 while ((s = s->next))
311 return -1; /* Somebody detected an error */
312 else if ((((wait_ret >= m && s->windows_handle) || s->h == w4[wait_ret])) &&
313 s->verify (s, readfds, writefds, exceptfds))
316 select_printf ("gotone %d", gotone);
322 select_printf ("looping");
325 select_printf ("recalculating ms");
327 DWORD now = GetTickCount ();
328 if (now > (start_time + ms))
330 select_printf ("timed out after verification");
333 ms -= (now - start_time);
335 select_printf ("ms now %u", ms);
339 select_printf ("returning 0");
344 set_bits (select_record *me, fd_set *readfds, fd_set *writefds,
348 select_printf ("me %p, testing fd %d (%s)", me, me->fd, me->fh->get_name ());
349 if (me->read_selected && me->read_ready)
351 UNIX_FD_SET (me->fd, readfds);
354 if (me->write_selected && me->write_ready)
356 UNIX_FD_SET (me->fd, writefds);
359 if (me->except_ready && me->except_ready)
361 UNIX_FD_SET (me->fd, exceptfds);
364 select_printf ("ready %d", ready);
369 verify_true (select_record *, fd_set *, fd_set *, fd_set *)
375 verify_ok (select_record *me, fd_set *readfds, fd_set *writefds,
378 return set_bits (me, readfds, writefds, exceptfds);
382 no_startup (select_record *, select_stuff *)
388 no_verify (select_record *, fd_set *, fd_set *, fd_set *)
394 peek_pipe (select_record *s, int ignra)
398 fhandler_base *fh = s->fh;
401 set_handle_or_return_if_not_open (h, s);
403 /* Don't perform complicated tests if we don't need to. */
404 if (!s->read_selected && !s->except_selected)
407 if (s->read_selected)
411 select_printf ("already ready");
415 if (fh->bg_check (SIGTTIN) <= 0)
417 gotone = s->read_ready = 1;
421 switch (fh->get_device ())
425 if (((fhandler_pty_master *)fh)->need_nl)
427 gotone = s->read_ready = 1;
432 if (!ignra && fh->get_readahead_valid ())
434 select_printf ("readahead");
435 gotone = s->read_ready = 1;
441 if (fh->get_device() != FH_PIPEW &&
442 !PeekNamedPipe (h, NULL, 0, NULL, (DWORD *) &n, NULL))
444 select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ());
450 select_printf ("%s, n %d", fh->get_name (), n);
451 if (s->except_selected)
452 gotone += s->except_ready = TRUE;
453 if (s->read_selected)
454 gotone += s->read_ready = TRUE;
456 if (n > 0 && s->read_selected)
458 select_printf ("%s, ready for read", fh->get_name ());
459 gotone += s->read_ready = TRUE;
461 if (!gotone && s->fh->hit_eof ())
463 select_printf ("%s, saw EOF", fh->get_name ());
464 if (s->except_selected)
465 gotone = s->except_ready = TRUE;
466 if (s->read_selected)
467 gotone += s->read_ready = TRUE;
468 select_printf ("saw eof on '%s'", fh->get_name ());
472 return gotone || s->write_ready;
476 poll_pipe (select_record *me, fd_set *readfds, fd_set *writefds,
479 return peek_pipe (me, 0) ?
480 set_bits (me, readfds, writefds, exceptfds) :
486 static int start_thread_pipe (select_record *me, select_stuff *stuff);
491 BOOL stop_thread_pipe;
492 select_record *start;
496 thread_pipe (void *arg)
498 pipeinf *pi = (pipeinf *)arg;
503 select_record *s = pi->start;
504 while ((s = s->next))
505 if (s->startup == start_thread_pipe)
507 if (peek_pipe (s, 0))
509 if (pi->stop_thread_pipe)
511 select_printf ("stopping");
516 if (pi->stop_thread_pipe)
518 select_printf ("stopping from outer loop");
530 start_thread_pipe (select_record *me, select_stuff *stuff)
532 if (stuff->device_specific[FHDEVN(FH_PIPE)])
534 me->h = ((pipeinf *) stuff->device_specific[FHDEVN(FH_PIPE)])->thread;
537 pipeinf *pi = new pipeinf;
538 pi->start = &stuff->start;
539 pi->stop_thread_pipe = FALSE;
540 pi->thread = me->h = makethread (thread_pipe, (LPVOID)pi, 0, "select_pipe");
543 stuff->device_specific[FHDEVN(FH_PIPE)] = (void *)pi;
548 pipe_cleanup (select_record *, select_stuff *stuff)
550 pipeinf *pi = (pipeinf *)stuff->device_specific[FHDEVN(FH_PIPE)];
551 if (pi && pi->thread)
553 pi->stop_thread_pipe = TRUE;
554 WaitForSingleObject (pi->thread, INFINITE);
555 CloseHandle (pi->thread);
557 stuff->device_specific[FHDEVN(FH_PIPE)] = NULL;
562 fhandler_pipe::select_read (select_record *s)
565 s = new select_record;
566 s->startup = start_thread_pipe;
568 s->verify = verify_ok;
569 s->read_selected = TRUE;
570 s->cleanup = pipe_cleanup;
575 fhandler_pipe::select_write (select_record *s)
579 s = new select_record;
580 s->startup = no_startup;
582 s->verify = no_verify;
584 s->write_selected = TRUE;
585 s->write_ready = TRUE;
590 fhandler_pipe::select_except (select_record *s)
593 s = new select_record;
594 s->startup = start_thread_pipe;
596 s->verify = verify_ok;
597 s->cleanup = pipe_cleanup;
598 s->except_selected = TRUE;
603 peek_console (select_record *me, int ignra)
605 extern const char * get_nonascii_key (INPUT_RECORD& input_rec, char *);
606 fhandler_console *fh = (fhandler_console *)me->fh;
608 if (!me->read_selected)
609 return me->write_ready;
611 if (!ignra && fh->get_readahead_valid ())
613 select_printf ("readahead");
614 return me->read_ready = 1;
619 select_printf ("already ready");
627 set_handle_or_return_if_not_open (h, me);
630 if (fh->bg_check (SIGTTIN) <= 0)
631 return me->read_ready = 1;
632 else if (!PeekConsoleInput (h, &irec, 1, &events_read) || !events_read)
636 if (irec.EventType == WINDOW_BUFFER_SIZE_EVENT)
637 kill_pgrp (fh->tc->getpgid (), SIGWINCH);
638 else if (irec.EventType == KEY_EVENT && irec.Event.KeyEvent.bKeyDown == TRUE &&
639 (irec.Event.KeyEvent.uChar.AsciiChar || get_nonascii_key (irec, tmpbuf)))
640 return me->read_ready = 1;
642 /* Read and discard the event */
643 ReadConsoleInput (h, &irec, 1, &events_read);
646 return me->write_ready;
650 poll_console (select_record *me, fd_set *readfds, fd_set *writefds,
653 return peek_console (me, 0) ?
654 set_bits (me, readfds, writefds, exceptfds) :
661 fhandler_console::select_read (select_record *s)
665 s = new select_record;
666 s->startup = no_startup;
667 s->poll = poll_console;
668 s->verify = poll_console;
672 s->h = get_handle ();
673 s->read_selected = TRUE;
678 fhandler_console::select_write (select_record *s)
682 s = new select_record;
683 s->startup = no_startup;
684 s->poll = poll_console;
685 s->verify = no_verify;
689 s->write_selected = TRUE;
690 s->write_ready = TRUE;
695 fhandler_console::select_except (select_record *s)
699 s = new select_record;
700 s->startup = no_startup;
701 s->poll = poll_console;
702 s->verify = no_verify;
706 s->except_selected = TRUE;
711 fhandler_tty_common::ready_for_read (int fd, DWORD howlong, int ignra)
714 if (myself->pgid && get_ttyp ()->getpgid () != myself->pgid &&
715 myself->ctty == ttynum) // background process?
716 return 1; // Yes. Let read return an error
718 return ((fhandler_pipe*)this)->fhandler_pipe::ready_for_read (fd, howlong, ignra);
722 fhandler_tty_common::select_read (select_record *s)
724 return ((fhandler_pipe*)this)->fhandler_pipe::select_read (s);
728 fhandler_tty_common::select_write (select_record *s)
730 return ((fhandler_pipe *)this)->fhandler_pipe::select_write (s);
734 fhandler_tty_common::select_except (select_record *s)
736 return ((fhandler_pipe *)this)->fhandler_pipe::select_except (s);
740 fhandler_dev_null::select_read (select_record *s)
744 s = new select_record;
745 s->startup = no_startup;
747 s->verify = no_verify;
749 s->h = get_handle ();
750 s->read_selected = TRUE;
755 fhandler_dev_null::select_write (select_record *s)
759 s = new select_record;
760 s->startup = no_startup;
762 s->verify = no_verify;
764 s->h = get_handle ();
765 s->write_selected = TRUE;
770 fhandler_dev_null::select_except (select_record *s)
774 s = new select_record;
775 s->startup = no_startup;
777 s->verify = no_verify;
779 s->h = get_handle ();
780 s->except_selected = TRUE;
781 s->except_ready = TRUE;
785 static int start_thread_serial (select_record *me, select_stuff *stuff);
790 BOOL stop_thread_serial;
791 select_record *start;
795 peek_serial (select_record *s, int)
800 fhandler_serial *fh = (fhandler_serial *)s->fh;
802 if (fh->get_readahead_valid () || fh->overlapped_armed < 0)
803 return s->read_ready = 1;
805 select_printf ("fh->overlapped_armed %d", fh->overlapped_armed);
808 set_handle_or_return_if_not_open (h, s);
811 if (s->read_selected && s->read_ready || (s->write_selected && s->write_ready))
813 select_printf ("already ready");
818 (void) SetCommMask (h, EV_RXCHAR);
820 if (!fh->overlapped_armed)
825 ResetEvent (fh->io_status.hEvent);
827 if (!ClearCommError (h, &ev, &st))
829 debug_printf ("ClearCommError");
833 return s->read_ready = 1;
834 else if (WaitCommEvent (h, &ev, &fh->io_status))
835 return s->read_ready = 1;
836 else if (GetLastError () == ERROR_IO_PENDING)
837 fh->overlapped_armed = 1;
840 debug_printf ("WaitCommEvent");
848 w4[0] = fh->io_status.hEvent;
849 w4[1] = signal_arrived;
852 switch (WaitForMultipleObjects (2, w4, FALSE, to))
855 if (!ClearCommError (h, &ev, &st))
857 debug_printf ("ClearCommError");
860 else if (!st.cbInQue)
864 return s->read_ready = 1;
865 select_printf ("got something");
867 PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
869 case WAIT_OBJECT_0 + 1:
870 PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
871 select_printf ("interrupt");
872 set_sig_errno (EINTR);
876 PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
879 PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
880 debug_printf ("WaitForMultipleObjects");
888 if (GetLastError () == ERROR_OPERATION_ABORTED)
890 select_printf ("operation aborted");
896 select_printf ("error %E");
901 thread_serial (void *arg)
903 serialinf *si = (serialinf *)arg;
908 select_record *s = si->start;
909 while ((s = s->next))
910 if (s->startup == start_thread_serial)
912 if (peek_serial (s, 0))
915 if (si->stop_thread_serial)
917 select_printf ("stopping");
924 select_printf ("exiting");
929 start_thread_serial (select_record *me, select_stuff *stuff)
931 if (stuff->device_specific[FHDEVN(FH_SERIAL)])
933 me->h = ((pipeinf *) stuff->device_specific[FHDEVN(FH_SERIAL)])->thread;
936 serialinf *si = new serialinf;
937 si->start = &stuff->start;
938 si->stop_thread_serial = FALSE;
939 si->thread = me->h = makethread (thread_serial, (LPVOID)si, 0, "select_serial");
942 stuff->device_specific[FHDEVN(FH_SERIAL)] = (void *)si;
947 serial_cleanup (select_record *, select_stuff *stuff)
949 serialinf *si = (serialinf *)stuff->device_specific[FHDEVN(FH_SERIAL)];
950 if (si && si->thread)
952 si->stop_thread_serial = TRUE;
953 WaitForSingleObject (si->thread, INFINITE);
954 CloseHandle (si->thread);
956 stuff->device_specific[FHDEVN(FH_SERIAL)] = NULL;
961 poll_serial (select_record *me, fd_set *readfds, fd_set *writefds,
965 return peek_serial (me, 0) ?
966 set_bits (me, readfds, writefds, exceptfds) :
973 fhandler_serial::select_read (select_record *s)
977 s = new select_record;
978 s->startup = start_thread_serial;
979 s->poll = poll_serial;
980 s->verify = verify_ok;
981 s->cleanup = serial_cleanup;
983 s->read_selected = TRUE;
988 fhandler_serial::select_write (select_record *s)
992 s = new select_record;
993 s->startup = no_startup;
995 s->verify = verify_ok;
997 s->h = get_handle ();
998 s->write_selected = TRUE;
999 s->write_ready = TRUE;
1004 fhandler_serial::select_except (select_record *s)
1008 s = new select_record;
1009 s->startup = no_startup;
1011 s->verify = verify_ok;
1014 s->except_selected = FALSE; // Can't do this
1019 fhandler_base::ready_for_read (int, DWORD, int)
1025 fhandler_base::select_read (select_record *s)
1029 s = new select_record;
1030 s->startup = no_startup;
1032 s->verify = verify_ok;
1034 s->h = get_handle ();
1035 s->read_selected = TRUE;
1036 s->read_ready = TRUE;
1041 fhandler_base::select_write (select_record *s)
1045 s = new select_record;
1046 s->startup = no_startup;
1048 s->verify = verify_ok;
1050 s->h = get_handle ();
1051 s->write_selected = TRUE;
1052 s->write_ready = TRUE;
1057 fhandler_base::select_except (select_record *s)
1061 s = new select_record;
1062 s->startup = no_startup;
1064 s->verify = verify_ok;
1067 s->write_selected = TRUE;
1074 winsock_fd_set readfds, writefds, exceptfds;
1076 struct sockaddr_in sin;
1077 select_record *start;
1081 peek_socket (select_record *me, int)
1083 winsock_fd_set ws_readfds, ws_writefds, ws_exceptfds;
1084 struct timeval tv = {0, 0};
1085 WINSOCK_FD_ZERO (&ws_readfds);
1086 WINSOCK_FD_ZERO (&ws_writefds);
1087 WINSOCK_FD_ZERO (&ws_exceptfds);
1091 set_handle_or_return_if_not_open (h, me);
1092 select_printf ("considering handle %p", h);
1094 if (me->read_selected)
1096 select_printf ("adding read fd_set %s, fd %d", me->fh->get_name (),
1098 WINSOCK_FD_SET (h, &ws_readfds);
1100 if (me->write_selected)
1102 select_printf ("adding write fd_set %s, fd %d", me->fh->get_name (),
1104 WINSOCK_FD_SET (h, &ws_writefds);
1106 if (me->except_selected)
1108 select_printf ("adding except fd_set %s, fd %d", me->fh->get_name (),
1110 WINSOCK_FD_SET (h, &ws_exceptfds);
1112 int r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv);
1113 select_printf ("WINSOCK_SELECT returned %d", r);
1116 select_printf ("error %d", WSAGetLastError ());
1120 if (WINSOCK_FD_ISSET (h, &ws_readfds) || (me->read_selected && me->read_ready))
1121 gotone = me->read_ready = TRUE;
1122 if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready))
1123 gotone = me->write_ready = TRUE;
1124 if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || (me->except_selected && me->except_ready))
1125 gotone = me->except_ready = TRUE;
1130 poll_socket (select_record *me, fd_set *readfds, fd_set *writefds,
1133 return peek_socket (me, 0) ?
1134 set_bits (me, readfds, writefds, exceptfds) :
1140 static int start_thread_socket (select_record *, select_stuff *);
1143 thread_socket (void *arg)
1145 socketinf *si = (socketinf *)arg;
1147 select_printf ("stuff_start %p", &si->start);
1148 int r = WINSOCK_SELECT (0, &si->readfds, &si->writefds, &si->exceptfds, NULL);
1149 select_printf ("Win32 select returned %d", r);
1151 select_printf ("error %d", WSAGetLastError ());
1152 select_record *s = si->start;
1153 while ((s = s->next))
1154 if (s->startup == start_thread_socket)
1156 HANDLE h = s->fh->get_handle ();
1157 select_printf ("s %p, testing fd %d (%s)", s, s->fd, s->fh->get_name ());
1158 if (WINSOCK_FD_ISSET (h, &si->readfds))
1160 select_printf ("read_ready");
1161 s->read_ready = TRUE;
1163 if (WINSOCK_FD_ISSET (h, &si->writefds))
1165 select_printf ("write_ready");
1166 s->write_ready = TRUE;
1168 if (WINSOCK_FD_ISSET (h, &si->exceptfds))
1170 select_printf ("except_ready");
1171 s->except_ready = TRUE;
1175 if (WINSOCK_FD_ISSET (si->exitsock, &si->readfds))
1176 select_printf ("saw exitsock read");
1181 extern "C" unsigned long htonl (unsigned long);
1184 start_thread_socket (select_record *me, select_stuff *stuff)
1188 if ((si = (socketinf *)stuff->device_specific[FHDEVN(FH_SOCKET)]))
1195 WINSOCK_FD_ZERO (&si->readfds);
1196 WINSOCK_FD_ZERO (&si->writefds);
1197 WINSOCK_FD_ZERO (&si->exceptfds);
1198 select_record *s = &stuff->start;
1199 while ((s = s->next))
1200 if (s->startup == start_thread_socket)
1202 HANDLE h = s->fh->get_handle ();
1203 select_printf ("Handle %p", h);
1204 if (s->read_selected)
1206 WINSOCK_FD_SET (h, &si->readfds);
1207 select_printf ("Added to readfds");
1209 if (s->write_selected)
1211 WINSOCK_FD_SET (h, &si->writefds);
1212 select_printf ("Added to writefds");
1214 if (s->except_selected)
1216 WINSOCK_FD_SET (h, &si->exceptfds);
1217 select_printf ("Added to exceptfds");
1221 if ((si->exitsock = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
1223 set_winsock_errno ();
1224 select_printf ("cannot create socket, %E");
1227 /* Allow rapid reuse of the port. */
1229 (void) setsockopt (si->exitsock, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
1231 int sin_len = sizeof(si->sin);
1232 memset (&si->sin, 0, sizeof (si->sin));
1233 si->sin.sin_family = AF_INET;
1234 si->sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
1235 if (bind (si->exitsock, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
1237 select_printf ("cannot bind socket, %E");
1241 if (getsockname (si->exitsock, (struct sockaddr *) &si->sin, &sin_len) < 0)
1243 select_printf ("getsockname error");
1247 if (listen (si->exitsock, 1))
1249 select_printf ("listen failed, %E");
1253 select_printf ("exitsock %p", si->exitsock);
1254 WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->readfds);
1255 WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->exceptfds);
1256 stuff->device_specific[FHDEVN(FH_SOCKET)] = (void *) si;
1257 si->start = &stuff->start;
1258 select_printf ("stuff_start %p", &stuff->start);
1259 si->thread = me->h = makethread (thread_socket, (LPVOID)si, 0,
1264 set_winsock_errno ();
1265 closesocket (si->exitsock);
1270 socket_cleanup (select_record *, select_stuff *stuff)
1272 socketinf *si = (socketinf *)stuff->device_specific[FHDEVN(FH_SOCKET)];
1273 select_printf ("si %p si->thread %p", si, si ? si->thread : NULL);
1274 if (si && si->thread)
1276 select_printf ("connection to si->exitsock %p", si->exitsock);
1277 SOCKET s = socket (AF_INET, SOCK_STREAM, 0);
1278 /* Connecting to si->exitsock will cause any executing select to wake
1279 up. When this happens then the exitsock condition will cause the
1280 thread to terminate. */
1281 if (connect (s, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
1283 set_winsock_errno ();
1284 select_printf ("connect failed");
1285 /* FIXME: now what? */
1290 /* Wait for thread to go away */
1291 WaitForSingleObject (si->thread, INFINITE);
1292 shutdown (si->exitsock, 2);
1293 closesocket (si->exitsock);
1294 CloseHandle (si->thread);
1295 stuff->device_specific[FHDEVN(FH_SOCKET)] = NULL;
1298 select_printf ("returning");
1302 fhandler_socket::select_read (select_record *s)
1306 s = new select_record;
1307 s->startup = start_thread_socket;
1308 s->poll = poll_socket;
1309 s->verify = verify_true;
1310 s->cleanup = socket_cleanup;
1312 s->read_selected = TRUE;
1317 fhandler_socket::select_write (select_record *s)
1321 s = new select_record;
1322 s->startup = start_thread_socket;
1323 s->poll = poll_socket;
1324 s->verify = verify_true;
1325 s->cleanup = socket_cleanup;
1327 s->write_selected = TRUE;
1332 fhandler_socket::select_except (select_record *s)
1336 s = new select_record;
1337 s->startup = start_thread_socket;
1338 s->poll = poll_socket;
1339 s->verify = verify_true;
1340 s->cleanup = socket_cleanup;
1342 s->except_selected = TRUE;
1347 peek_windows (select_record *me, int)
1351 set_handle_or_return_if_not_open (h, me);
1353 if (me->read_selected && me->read_ready)
1356 if (PeekMessage (&m, (HWND) h, 0, 0, PM_NOREMOVE))
1358 me->read_ready = TRUE;
1359 select_printf ("window %d(%p) ready", me->fd, me->fh->get_handle ());
1363 select_printf ("window %d(%p) not ready", me->fd, me->fh->get_handle ());
1364 return me->write_ready;
1368 poll_windows (select_record *me, fd_set *readfds, fd_set *writefds,
1372 return peek_windows (me, 0) ?
1373 set_bits (me, readfds, writefds, exceptfds) :
1380 fhandler_windows::select_read (select_record *s)
1384 s = new select_record;
1385 s->startup = no_startup;
1386 s->poll = poll_windows;
1387 s->verify = poll_windows;
1389 s->h = get_handle ();
1390 s->read_selected = TRUE;
1391 s->h = get_handle ();
1392 s->windows_handle = TRUE;
1397 fhandler_windows::select_write (select_record *s)
1401 s = new select_record;
1402 s->startup = no_startup;
1404 s->verify = verify_ok;
1406 s->h = get_handle ();
1407 s->write_selected = TRUE;
1408 s->write_ready = TRUE;
1409 s->windows_handle = TRUE;
1414 fhandler_windows::select_except (select_record *s)
1418 s = new select_record;
1419 s->startup = no_startup;
1421 s->verify = verify_ok;
1423 s->h = get_handle ();
1424 s->except_selected = TRUE;
1425 s->except_ready = TRUE;
1426 s->windows_handle = TRUE;