int broadcast(t_stck *s, int fd, t_wait *t) { char *cmd; char *tmp; int k; int i; cmd = t->cmd + 10; i = 3; tmp = Xmalloc(strlen(cmd) + 32); while (++i <= s->max_fd) { if (s->fds[i].type != FD_IA || i == fd) continue; k = get_rep(s, &(s->fds[fd]), &(s->fds[i])); memset(tmp, 0, strlen(cmd) + 32); sprintf(tmp, "message %d,%s", k, cmd); send_one(tmp, i, s); } send_one("ok", fd, s); event_broadcast(s, fd, cmd); return (0); }
static void check_fds(bool block) { fd_set readfds, writefds; int nfound, fd; struct timeval tv, *tvp; if (NumFds == 0) { if (block) { sigset_t set; sigemptyset(&set); sigsuspend(&set); } return; } memcpy(&readfds, &Readers.fds, sizeof(readfds)); memcpy(&writefds, &Writers.fds, sizeof(writefds)); #ifdef WIN32 do { for (fd = 0; fd < NumFds; fd++) { if (FD_ISSET(fd, &Readers.fds) && input_available(fd)) { event_broadcast(Readers.events[fd]); FD_CLR(fd, &Readers.fds); block = 0; } if (FD_ISSET(fd, &Writers.fds) && output_writable(fd)) { event_broadcast(Writers.events[fd]); FD_CLR(fd, &Writers.fds); block = 0; } } } while (block); for (fd = NumFds - 1; fd >= 0; fd--) /* Adjust NumFds */ if (FD_ISSET(fd, &Readers.fds) || FD_ISSET(fd, &Writers.fds)) break; NumFds = fd+1; #else if (block) tvp = NULL; else { tv.tv_usec = 0; tv.tv_sec = 0; tvp = &tv; } nfound = select(NumFds, &readfds, &writefds, NULL, tvp); if (nfound < 0) { switch (errno) { case EBADF: /* One of the file descriptors when bad. Wake everyone up */ /* and let the individual threads figure out who is selecting */ /* on a bogus fd. */ for (fd = 0; fd < NumFds; fd++) { if (FD_ISSET(fd, &Readers.fds)) event_broadcast(Readers.events[fd]); if (FD_ISSET(fd, &Writers.fds)) event_broadcast(Writers.events[fd]); } FD_ZERO(&Readers.fds); FD_ZERO(&Writers.fds); NumFds = 0; break; case EINTR: break; case EINVAL: lose("select failed with EINVAL?"); } } else if (nfound > 0) { for (fd = 0; fd < NumFds; fd++) { if (FD_ISSET(fd, &readfds)) { event_broadcast(Readers.events[fd]); FD_CLR(fd, &Readers.fds); } if (FD_ISSET(fd, &writefds)) { event_broadcast(Writers.events[fd]); FD_CLR(fd, &Writers.fds); } } for (fd = NumFds - 1; fd >= 0; fd--) if (FD_ISSET(fd, &Readers.fds) || FD_ISSET(fd, &Writers.fds)) break; NumFds = fd+1; } #endif }