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>
38 * All these defines below should be in sys/types.h
39 * but because of the includes above, they may not have
40 * been included. We create special UNIX_xxxx versions here.
44 #define NBBY 8 /* number of bits in a byte */
48 * Select uses bit masks of file descriptors in longs.
49 * These macros manipulate such bit fields (the filesystem macros use chars).
50 * FD_SETSIZE may be defined by the user, but the default here
51 * should be >= NOFILE (param.h).
55 #define UNIX_NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */
57 #define unix_howmany(x,y) (((x)+((y)-1))/(y))
60 #define unix_fd_set fd_set
62 #define NULL_fd_set ((fd_set *)NULL)
63 #define sizeof_fd_set(n) \
64 ((unsigned) (NULL_fd_set->fds_bits + unix_howmany((n), UNIX_NFDBITS)))
65 #define UNIX_FD_SET(n, p) \
66 ((p)->fds_bits[(n)/UNIX_NFDBITS] |= (1L << ((n) % UNIX_NFDBITS)))
67 #define UNIX_FD_CLR(n, p) \
68 ((p)->fds_bits[(n)/UNIX_NFDBITS] &= ~(1L << ((n) % UNIX_NFDBITS)))
69 #define UNIX_FD_ISSET(n, p) \
70 ((p)->fds_bits[(n)/UNIX_NFDBITS] & (1L << ((n) % UNIX_NFDBITS)))
71 #define UNIX_FD_ZERO(p, n) \
72 bzero ((caddr_t)(p), sizeof_fd_set ((n)))
74 #define allocfd_set(n) ((fd_set *) memset (alloca (sizeof_fd_set (n)), 0, sizeof_fd_set (n)))
75 #define copyfd_set(to, from, n) memcpy (to, from, sizeof_fd_set (n));
77 /* Make a fhandler_foo::ready_for_ready method.
78 Assumption: The "ready_for_read" methods are called with one level of
80 #define MAKEready(what) \
82 fhandler_##what::ready_for_read (int fd, DWORD howlong, int ignra) \
84 select_record me (this); \
86 (void) select_read (&me); \
87 while (!peek_##what (&me, ignra) && howlong == INFINITE) \
88 if (fd >= 0 && dtable.not_open (fd)) \
90 else if (WaitForSingleObject (signal_arrived, 10) == WAIT_OBJECT_0) \
92 return me.read_ready; \
95 #define set_handle_or_return_if_not_open(h, s) \
96 h = (s)->fh->get_handle (); \
97 if (dtable.not_open ((s)->fd)) \
99 (s)->saw_error = TRUE; \
104 /* The main select code.
108 cygwin_select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
112 fd_set *dummy_readfds = allocfd_set (maxfds);
113 fd_set *dummy_writefds = allocfd_set (maxfds);
114 fd_set *dummy_exceptfds = allocfd_set (maxfds);
115 sigframe thisframe (mainthread, 0);
125 select_printf ("%d, %p, %p, %p, %p", maxfds, readfds, writefds, exceptfds, to);
128 readfds = dummy_readfds;
130 writefds = dummy_writefds;
132 exceptfds = dummy_exceptfds;
134 for (int i = 0; i < maxfds; i++)
135 if (!sel.test_and_set (i, readfds, writefds, exceptfds))
137 select_printf ("aborting due to test_and_set error");
138 return -1; /* Invalid fd, maybe? */
141 /* Convert to milliseconds or INFINITE if to == NULL */
142 DWORD ms = to ? (to->tv_sec * 1000) + (to->tv_usec / 1000) : INFINITE;
143 if (ms == 0 && to->tv_usec)
144 ms = 1; /* At least 1 ms granularity */
147 select_printf ("to->tv_sec %d, to->tv_usec %d, ms %d", to->tv_sec, to->tv_usec, ms);
149 select_printf ("to NULL, ms %x", ms);
151 select_printf ("sel.always_ready %d", sel.always_ready);
153 /* Degenerate case. No fds to wait for. Just wait. */
154 if (sel.start.next == NULL)
156 if (WaitForSingleObject (signal_arrived, ms) == WAIT_OBJECT_0)
158 select_printf ("signal received");
159 set_sig_errno (EINTR);
165 /* Allocate some fd_set structures using the number of fds as a guide. */
166 fd_set *r = allocfd_set (maxfds);
167 fd_set *w = allocfd_set (maxfds);
168 fd_set *e = allocfd_set (maxfds);
170 /* Don't bother waiting if one of the selected fds is "always ready". */
171 if ((!sel.always_ready || ms != 0) && sel.wait (r, w, e, ms))
172 return -1; /* some kind of error */
174 copyfd_set (readfds, r, maxfds);
175 copyfd_set (writefds, w, maxfds);
176 copyfd_set (exceptfds, e, maxfds);
177 return sel.poll (readfds, writefds, exceptfds);
181 select_stuff::~select_stuff ()
183 select_record *s = &start;
185 select_printf ("calling cleanup routines");
186 while ((s = s->next))
188 s->cleanup (s, this);
190 select_record *snext = start.next;
192 select_printf ("deleting select records");
200 /* Add a record to the select chain */
202 select_stuff::test_and_set (int i, fd_set *readfds, fd_set *writefds,
205 select_record *s = NULL;
206 if (UNIX_FD_ISSET (i, readfds) && (s = dtable.select_read (i, s)) == NULL)
207 return 0; /* error */
208 if (UNIX_FD_ISSET (i, writefds) && (s = dtable.select_write (i, s)) == NULL)
209 return 0; /* error */
210 if (UNIX_FD_ISSET (i, exceptfds) && (s = dtable.select_except (i, s)) == NULL)
211 return 0; /* error */
213 return 1; /* nothing to do */
215 if (s->read_ready || s->write_ready || s->except_ready)
218 if (s->windows_handle || s->windows_handle || s->windows_handle)
221 s->next = start.next;
226 /* Poll every fd in the select chain. Set appropriate fd in mask. */
228 select_stuff::poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds)
231 select_record *s = &start;
232 while ((s = s->next))
233 n += s->poll (s, readfds, writefds, exceptfds);
234 select_printf ("returning %d", n);
238 /* The heart of select. Waits for an fd to do something interesting. */
240 select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
244 HANDLE w4[MAXIMUM_WAIT_OBJECTS];
245 select_record *s = &start;
248 w4[m++] = signal_arrived; /* Always wait for the arrival of a signal. */
249 /* Loop through the select chain, starting up anything appropriate and
250 counting the number of active fds. */
251 while ((s = s->next))
253 if (!s->startup (s, this))
260 for (int i = 1; i < m; i++)
268 DWORD start_time = GetTickCount (); /* Record the current time for later use. */
270 debug_printf ("m %d, ms %u", m, ms);
274 wait_ret = WaitForMultipleObjects (m, w4, FALSE, ms);
276 wait_ret = MsgWaitForMultipleObjects (m, w4, FALSE, ms, QS_ALLINPUT);
281 select_printf ("signal received");
282 set_sig_errno (EINTR);
285 select_printf ("WaitForMultipleObjects failed");
289 select_printf ("timed out");
293 select_printf ("woke up. wait_ret %d. verifying", wait_ret);
296 while ((s = s->next))
298 return -1; /* Somebody detected an error */
299 else if ((((wait_ret >= m && s->windows_handle) || s->h == w4[wait_ret])) &&
300 s->verify (s, readfds, writefds, exceptfds))
303 select_printf ("gotone %d", gotone);
309 select_printf ("looping");
312 select_printf ("recalculating ms");
314 DWORD now = GetTickCount ();
315 if (now > (start_time + ms))
317 select_printf ("timed out after verification");
320 ms -= (now - start_time);
322 select_printf ("ms now %u", ms);
326 select_printf ("returning 0");
331 set_bits (select_record *me, fd_set *readfds, fd_set *writefds,
335 select_printf ("me %p, testing fd %d (%s)", me, me->fd, me->fh->get_name ());
336 if (me->read_selected && me->read_ready)
338 UNIX_FD_SET (me->fd, readfds);
341 if (me->write_selected && me->write_ready)
343 UNIX_FD_SET (me->fd, writefds);
346 if (me->except_ready && me->except_ready)
348 UNIX_FD_SET (me->fd, exceptfds);
351 select_printf ("ready %d", ready);
356 verify_true (select_record *, fd_set *, fd_set *, fd_set *)
362 verify_ok (select_record *me, fd_set *readfds, fd_set *writefds,
365 return set_bits (me, readfds, writefds, exceptfds);
369 no_startup (select_record *, select_stuff *)
375 no_verify (select_record *, fd_set *, fd_set *, fd_set *)
381 peek_pipe (select_record *s, int ignra)
385 fhandler_base *fh = s->fh;
388 set_handle_or_return_if_not_open (h, s);
390 /* Don't perform complicated tests if we don't need to. */
391 if (!s->read_selected && !s->except_selected)
394 if (s->read_selected)
398 select_printf ("already ready");
402 if (fh->bg_check (SIGTTIN) <= 0)
404 gotone = s->read_ready = 1;
408 if (!ignra && fh->get_device () != FH_PTYM && fh->get_device () != FH_TTYM &&
409 fh->get_readahead_valid ())
411 select_printf ("readahead");
412 gotone = s->read_ready = 1;
417 if (fh->get_device() != FH_PIPEW &&
418 !PeekNamedPipe (h, NULL, 0, NULL, (DWORD *) &n, NULL))
420 select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ());
426 select_printf ("%s, n %d", fh->get_name (), n);
427 if (s->except_selected)
428 gotone += s->except_ready = TRUE;
429 if (s->read_selected)
430 gotone += s->read_ready = TRUE;
432 if (n > 0 && s->read_selected)
434 select_printf ("%s, ready for read", fh->get_name ());
435 gotone += s->read_ready = TRUE;
437 if (!gotone && s->fh->hit_eof ())
439 select_printf ("%s, saw EOF", fh->get_name ());
440 if (s->except_selected)
441 gotone = s->except_ready = TRUE;
442 if (s->read_selected)
443 gotone += s->read_ready = TRUE;
444 select_printf ("saw eof on '%s'", fh->get_name ());
448 return gotone || s->write_ready;
452 poll_pipe (select_record *me, fd_set *readfds, fd_set *writefds,
455 return peek_pipe (me, 0) ?
456 set_bits (me, readfds, writefds, exceptfds) :
462 static int start_thread_pipe (select_record *me, select_stuff *stuff);
467 BOOL stop_thread_pipe;
468 select_record *start;
472 thread_pipe (void *arg)
474 pipeinf *pi = (pipeinf *)arg;
479 select_record *s = pi->start;
480 while ((s = s->next))
481 if (s->startup == start_thread_pipe)
483 if (peek_pipe (s, 0))
485 if (pi->stop_thread_pipe)
487 select_printf ("stopping");
492 if (pi->stop_thread_pipe)
494 select_printf ("stopping from outer loop");
506 start_thread_pipe (select_record *me, select_stuff *stuff)
508 if (stuff->device_specific[FHDEVN(FH_PIPE)])
510 me->h = ((pipeinf *) stuff->device_specific[FHDEVN(FH_PIPE)])->thread;
513 pipeinf *pi = new pipeinf;
514 pi->start = &stuff->start;
515 pi->stop_thread_pipe = FALSE;
516 pi->thread = me->h = makethread (thread_pipe, (LPVOID)pi, 0, "select_pipe");
519 stuff->device_specific[FHDEVN(FH_PIPE)] = (void *)pi;
524 pipe_cleanup (select_record *, select_stuff *stuff)
526 pipeinf *pi = (pipeinf *)stuff->device_specific[FHDEVN(FH_PIPE)];
527 if (pi && pi->thread)
529 pi->stop_thread_pipe = TRUE;
530 WaitForSingleObject (pi->thread, INFINITE);
531 CloseHandle (pi->thread);
533 stuff->device_specific[FHDEVN(FH_PIPE)] = NULL;
538 fhandler_pipe::select_read (select_record *s)
541 s = new select_record;
542 s->startup = start_thread_pipe;
544 s->verify = verify_ok;
545 s->read_selected = TRUE;
546 s->cleanup = pipe_cleanup;
551 fhandler_pipe::select_write (select_record *s)
555 s = new select_record;
556 s->startup = no_startup;
558 s->verify = no_verify;
560 s->write_selected = TRUE;
561 s->write_ready = TRUE;
566 fhandler_pipe::select_except (select_record *s)
569 s = new select_record;
570 s->startup = start_thread_pipe;
572 s->verify = verify_ok;
573 s->cleanup = pipe_cleanup;
574 s->except_selected = TRUE;
579 peek_console (select_record *me, int ignra)
581 extern const char * get_nonascii_key (INPUT_RECORD& input_rec, char *);
582 fhandler_console *fh = (fhandler_console *)me->fh;
584 if (!me->read_selected)
585 return me->write_ready;
587 if (!ignra && fh->get_readahead_valid ())
589 select_printf ("readahead");
590 return me->read_ready = 1;
595 select_printf ("already ready");
603 set_handle_or_return_if_not_open (h, me);
606 if (fh->bg_check (SIGTTIN) <= 0)
607 return me->read_ready = 1;
608 else if (!PeekConsoleInput (h, &irec, 1, &events_read) || !events_read)
612 if (irec.EventType == WINDOW_BUFFER_SIZE_EVENT)
613 kill_pgrp (fh->tc->getpgid (), SIGWINCH);
614 else if (irec.EventType == KEY_EVENT && irec.Event.KeyEvent.bKeyDown == TRUE &&
615 (irec.Event.KeyEvent.uChar.AsciiChar || get_nonascii_key (irec, tmpbuf)))
616 return me->read_ready = 1;
618 /* Read and discard the event */
619 ReadConsoleInput (h, &irec, 1, &events_read);
622 return me->write_ready;
626 poll_console (select_record *me, fd_set *readfds, fd_set *writefds,
629 return peek_console (me, 0) ?
630 set_bits (me, readfds, writefds, exceptfds) :
637 fhandler_console::select_read (select_record *s)
641 s = new select_record;
642 s->startup = no_startup;
643 s->poll = poll_console;
644 s->verify = poll_console;
648 s->h = get_handle ();
649 s->read_selected = TRUE;
654 fhandler_console::select_write (select_record *s)
658 s = new select_record;
659 s->startup = no_startup;
660 s->poll = poll_console;
661 s->verify = no_verify;
665 s->write_selected = TRUE;
666 s->write_ready = TRUE;
671 fhandler_console::select_except (select_record *s)
675 s = new select_record;
676 s->startup = no_startup;
677 s->poll = poll_console;
678 s->verify = no_verify;
682 s->except_selected = TRUE;
687 fhandler_tty_common::ready_for_read (int fd, DWORD howlong, int ignra)
690 if (myself->pgid && get_ttyp ()->getpgid () != myself->pgid &&
691 myself->ctty == ttynum) // background process?
692 return 1; // Yes. Let read return an error
694 return ((fhandler_pipe*)this)->fhandler_pipe::ready_for_read (fd, howlong, ignra);
698 fhandler_tty_common::select_read (select_record *s)
700 return ((fhandler_pipe*)this)->fhandler_pipe::select_read (s);
704 fhandler_tty_common::select_write (select_record *s)
706 return ((fhandler_pipe *)this)->fhandler_pipe::select_write (s);
710 fhandler_tty_common::select_except (select_record *s)
712 return ((fhandler_pipe *)this)->fhandler_pipe::select_except (s);
716 fhandler_dev_null::select_read (select_record *s)
720 s = new select_record;
721 s->startup = no_startup;
723 s->verify = no_verify;
725 s->h = get_handle ();
726 s->read_selected = TRUE;
731 fhandler_dev_null::select_write (select_record *s)
735 s = new select_record;
736 s->startup = no_startup;
738 s->verify = no_verify;
740 s->h = get_handle ();
741 s->write_selected = TRUE;
746 fhandler_dev_null::select_except (select_record *s)
750 s = new select_record;
751 s->startup = no_startup;
753 s->verify = no_verify;
755 s->h = get_handle ();
756 s->except_selected = TRUE;
757 s->except_ready = TRUE;
761 static int start_thread_serial (select_record *me, select_stuff *stuff);
766 BOOL stop_thread_serial;
767 select_record *start;
771 peek_serial (select_record *s, int)
776 fhandler_serial *fh = (fhandler_serial *)s->fh;
778 if (fh->get_readahead_valid () || fh->overlapped_armed < 0)
779 return s->read_ready = 1;
781 select_printf ("fh->overlapped_armed %d", fh->overlapped_armed);
784 set_handle_or_return_if_not_open (h, s);
787 if (s->read_selected && s->read_ready || (s->write_selected && s->write_ready))
789 select_printf ("already ready");
794 (void) SetCommMask (h, EV_RXCHAR);
796 if (!fh->overlapped_armed)
801 ResetEvent (fh->io_status.hEvent);
803 if (!ClearCommError (h, &ev, &st))
805 debug_printf ("ClearCommError");
809 return s->read_ready = 1;
810 else if (WaitCommEvent (h, &ev, &fh->io_status))
811 return s->read_ready = 1;
812 else if (GetLastError () == ERROR_IO_PENDING)
813 fh->overlapped_armed = 1;
816 debug_printf ("WaitCommEvent");
824 w4[0] = fh->io_status.hEvent;
825 w4[1] = signal_arrived;
828 switch (WaitForMultipleObjects (2, w4, FALSE, to))
831 if (!ClearCommError (h, &ev, &st))
833 debug_printf ("ClearCommError");
836 else if (!st.cbInQue)
840 return s->read_ready = 1;
841 select_printf ("got something");
843 PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
845 case WAIT_OBJECT_0 + 1:
846 PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
847 select_printf ("interrupt");
848 set_sig_errno (EINTR);
852 PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
855 PurgeComm (h, PURGE_TXABORT | PURGE_RXABORT);
856 debug_printf ("WaitForMultipleObjects");
864 if (GetLastError () == ERROR_OPERATION_ABORTED)
866 select_printf ("operation aborted");
872 select_printf ("error %E");
877 thread_serial (void *arg)
879 serialinf *si = (serialinf *)arg;
884 select_record *s = si->start;
885 while ((s = s->next))
886 if (s->startup == start_thread_serial)
888 if (peek_serial (s, 0))
891 if (si->stop_thread_serial)
893 select_printf ("stopping");
900 select_printf ("exiting");
905 start_thread_serial (select_record *me, select_stuff *stuff)
907 if (stuff->device_specific[FHDEVN(FH_SERIAL)])
909 me->h = ((pipeinf *) stuff->device_specific[FHDEVN(FH_SERIAL)])->thread;
912 serialinf *si = new serialinf;
913 si->start = &stuff->start;
914 si->stop_thread_serial = FALSE;
915 si->thread = me->h = makethread (thread_serial, (LPVOID)si, 0, "select_serial");
918 stuff->device_specific[FHDEVN(FH_SERIAL)] = (void *)si;
923 serial_cleanup (select_record *, select_stuff *stuff)
925 serialinf *si = (serialinf *)stuff->device_specific[FHDEVN(FH_SERIAL)];
926 if (si && si->thread)
928 si->stop_thread_serial = TRUE;
929 WaitForSingleObject (si->thread, INFINITE);
930 CloseHandle (si->thread);
932 stuff->device_specific[FHDEVN(FH_SERIAL)] = NULL;
937 poll_serial (select_record *me, fd_set *readfds, fd_set *writefds,
941 return peek_serial (me, 0) ?
942 set_bits (me, readfds, writefds, exceptfds) :
949 fhandler_serial::select_read (select_record *s)
953 s = new select_record;
954 s->startup = start_thread_serial;
955 s->poll = poll_serial;
956 s->verify = verify_ok;
957 s->cleanup = serial_cleanup;
959 s->read_selected = TRUE;
964 fhandler_serial::select_write (select_record *s)
968 s = new select_record;
969 s->startup = no_startup;
971 s->verify = verify_ok;
973 s->h = get_handle ();
974 s->write_selected = TRUE;
975 s->write_ready = TRUE;
980 fhandler_serial::select_except (select_record *s)
984 s = new select_record;
985 s->startup = no_startup;
987 s->verify = verify_ok;
990 s->except_selected = FALSE; // Can't do this
995 fhandler_base::ready_for_read (int, DWORD, int)
1001 fhandler_base::select_read (select_record *s)
1005 s = new select_record;
1006 s->startup = no_startup;
1008 s->verify = verify_ok;
1010 s->h = get_handle ();
1011 s->read_selected = TRUE;
1012 s->read_ready = TRUE;
1017 fhandler_base::select_write (select_record *s)
1021 s = new select_record;
1022 s->startup = no_startup;
1024 s->verify = verify_ok;
1026 s->h = get_handle ();
1027 s->write_selected = TRUE;
1028 s->write_ready = TRUE;
1033 fhandler_base::select_except (select_record *s)
1037 s = new select_record;
1038 s->startup = no_startup;
1040 s->verify = verify_ok;
1043 s->write_selected = TRUE;
1050 winsock_fd_set readfds, writefds, exceptfds;
1052 struct sockaddr_in sin;
1053 select_record *start;
1057 peek_socket (select_record *me, int)
1059 winsock_fd_set ws_readfds, ws_writefds, ws_exceptfds;
1060 struct timeval tv = {0, 0};
1061 WINSOCK_FD_ZERO (&ws_readfds);
1062 WINSOCK_FD_ZERO (&ws_writefds);
1063 WINSOCK_FD_ZERO (&ws_exceptfds);
1067 set_handle_or_return_if_not_open (h, me);
1068 select_printf ("considering handle %p", h);
1070 if (me->read_selected)
1072 select_printf ("adding read fd_set %s, fd %d", me->fh->get_name (),
1074 WINSOCK_FD_SET (h, &ws_readfds);
1076 if (me->write_selected)
1078 select_printf ("adding write fd_set %s, fd %d", me->fh->get_name (),
1080 WINSOCK_FD_SET (h, &ws_writefds);
1082 if (me->except_selected)
1084 select_printf ("adding except fd_set %s, fd %d", me->fh->get_name (),
1086 WINSOCK_FD_SET (h, &ws_exceptfds);
1088 int r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv);
1089 select_printf ("WINSOCK_SELECT returned %d", r);
1092 select_printf ("error %d", WSAGetLastError ());
1096 if (WINSOCK_FD_ISSET (h, &ws_readfds) || (me->read_selected && me->read_ready))
1097 gotone = me->read_ready = TRUE;
1098 if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready))
1099 gotone = me->write_ready = TRUE;
1100 if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || (me->except_selected && me->except_ready))
1101 gotone = me->except_ready = TRUE;
1106 poll_socket (select_record *me, fd_set *readfds, fd_set *writefds,
1109 return peek_socket (me, 0) ?
1110 set_bits (me, readfds, writefds, exceptfds) :
1116 static int start_thread_socket (select_record *, select_stuff *);
1119 thread_socket (void *arg)
1121 socketinf *si = (socketinf *)arg;
1123 select_printf ("stuff_start %p", &si->start);
1124 int r = WINSOCK_SELECT (0, &si->readfds, &si->writefds, &si->exceptfds, NULL);
1125 select_printf ("Win32 select returned %d", r);
1127 select_printf ("error %d", WSAGetLastError ());
1128 select_record *s = si->start;
1129 while ((s = s->next))
1130 if (s->startup == start_thread_socket)
1132 HANDLE h = s->fh->get_handle ();
1133 select_printf ("s %p, testing fd %d (%s)", s, s->fd, s->fh->get_name ());
1134 if (WINSOCK_FD_ISSET (h, &si->readfds))
1136 select_printf ("read_ready");
1137 s->read_ready = TRUE;
1139 if (WINSOCK_FD_ISSET (h, &si->writefds))
1141 select_printf ("write_ready");
1142 s->write_ready = TRUE;
1144 if (WINSOCK_FD_ISSET (h, &si->exceptfds))
1146 select_printf ("except_ready");
1147 s->except_ready = TRUE;
1151 if (WINSOCK_FD_ISSET (si->exitsock, &si->readfds))
1152 select_printf ("saw exitsock read");
1157 extern "C" unsigned long htonl (unsigned long);
1160 start_thread_socket (select_record *me, select_stuff *stuff)
1164 if ((si = (socketinf *)stuff->device_specific[FHDEVN(FH_SOCKET)]))
1171 WINSOCK_FD_ZERO (&si->readfds);
1172 WINSOCK_FD_ZERO (&si->writefds);
1173 WINSOCK_FD_ZERO (&si->exceptfds);
1174 select_record *s = &stuff->start;
1175 while ((s = s->next))
1176 if (s->startup == start_thread_socket)
1178 HANDLE h = s->fh->get_handle ();
1179 select_printf ("Handle %p", h);
1180 if (s->read_selected)
1182 WINSOCK_FD_SET (h, &si->readfds);
1183 select_printf ("Added to readfds");
1185 if (s->write_selected)
1187 WINSOCK_FD_SET (h, &si->writefds);
1188 select_printf ("Added to writefds");
1190 if (s->except_selected)
1192 WINSOCK_FD_SET (h, &si->exceptfds);
1193 select_printf ("Added to exceptfds");
1197 if ((si->exitsock = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
1199 set_winsock_errno ();
1200 select_printf ("cannot create socket, %E");
1203 /* Allow rapid reuse of the port. */
1205 (void) setsockopt (si->exitsock, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
1207 int sin_len = sizeof(si->sin);
1208 memset (&si->sin, 0, sizeof (si->sin));
1209 si->sin.sin_family = AF_INET;
1210 si->sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
1211 if (bind (si->exitsock, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
1213 select_printf ("cannot bind socket, %E");
1217 if (getsockname (si->exitsock, (struct sockaddr *) &si->sin, &sin_len) < 0)
1219 select_printf ("getsockname error");
1223 if (listen (si->exitsock, 1))
1225 select_printf ("listen failed, %E");
1229 select_printf ("exitsock %p", si->exitsock);
1230 WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->readfds);
1231 WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->exceptfds);
1232 stuff->device_specific[FHDEVN(FH_SOCKET)] = (void *) si;
1233 si->start = &stuff->start;
1234 select_printf ("stuff_start %p", &stuff->start);
1235 si->thread = me->h = makethread (thread_socket, (LPVOID)si, 0,
1240 set_winsock_errno ();
1241 closesocket (si->exitsock);
1246 socket_cleanup (select_record *, select_stuff *stuff)
1248 socketinf *si = (socketinf *)stuff->device_specific[FHDEVN(FH_SOCKET)];
1249 select_printf ("si %p si->thread %p", si, si ? si->thread : NULL);
1250 if (si && si->thread)
1252 select_printf ("connection to si->exitsock %p", si->exitsock);
1253 SOCKET s = socket (AF_INET, SOCK_STREAM, 0);
1254 /* Connecting to si->exitsock will cause any executing select to wake
1255 up. When this happens then the exitsock condition will cause the
1256 thread to terminate. */
1257 if (connect (s, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
1259 set_winsock_errno ();
1260 select_printf ("connect failed");
1261 /* FIXME: now what? */
1266 /* Wait for thread to go away */
1267 WaitForSingleObject (si->thread, INFINITE);
1268 shutdown (si->exitsock, 2);
1269 closesocket (si->exitsock);
1270 CloseHandle (si->thread);
1271 stuff->device_specific[FHDEVN(FH_SOCKET)] = NULL;
1274 select_printf ("returning");
1278 fhandler_socket::select_read (select_record *s)
1282 s = new select_record;
1283 s->startup = start_thread_socket;
1284 s->poll = poll_socket;
1285 s->verify = verify_true;
1286 s->cleanup = socket_cleanup;
1288 s->read_selected = TRUE;
1293 fhandler_socket::select_write (select_record *s)
1297 s = new select_record;
1298 s->startup = start_thread_socket;
1299 s->poll = poll_socket;
1300 s->verify = verify_true;
1301 s->cleanup = socket_cleanup;
1303 s->write_selected = TRUE;
1308 fhandler_socket::select_except (select_record *s)
1312 s = new select_record;
1313 s->startup = start_thread_socket;
1314 s->poll = poll_socket;
1315 s->verify = verify_true;
1316 s->cleanup = socket_cleanup;
1318 s->except_selected = TRUE;
1323 peek_windows (select_record *me, int)
1327 set_handle_or_return_if_not_open (h, me);
1329 if (me->read_selected && me->read_ready)
1332 if (PeekMessage (&m, (HWND) h, 0, 0, PM_NOREMOVE))
1334 me->read_ready = TRUE;
1335 select_printf ("window %d(%p) ready", me->fd, me->fh->get_handle ());
1339 select_printf ("window %d(%p) not ready", me->fd, me->fh->get_handle ());
1340 return me->write_ready;
1344 poll_windows (select_record *me, fd_set *readfds, fd_set *writefds,
1348 return peek_windows (me, 0) ?
1349 set_bits (me, readfds, writefds, exceptfds) :
1356 fhandler_windows::select_read (select_record *s)
1360 s = new select_record;
1361 s->startup = no_startup;
1362 s->poll = poll_windows;
1363 s->verify = poll_windows;
1365 s->h = get_handle ();
1366 s->read_selected = TRUE;
1367 s->h = get_handle ();
1368 s->windows_handle = TRUE;
1373 fhandler_windows::select_write (select_record *s)
1377 s = new select_record;
1378 s->startup = no_startup;
1380 s->verify = verify_ok;
1382 s->h = get_handle ();
1383 s->write_selected = TRUE;
1384 s->write_ready = TRUE;
1385 s->windows_handle = TRUE;
1390 fhandler_windows::select_except (select_record *s)
1394 s = new select_record;
1395 s->startup = no_startup;
1397 s->verify = verify_ok;
1399 s->h = get_handle ();
1400 s->except_selected = TRUE;
1401 s->except_ready = TRUE;
1402 s->windows_handle = TRUE;