+ return true;
+}
+
+static bool no_input(int fd)
+{
+ fd_set set;
+ struct timeval t = { 0, 0 };
+
+ FD_ZERO(&set);
+ FD_SET(fd, &set);
+ return (select(fd+1, &set, NULL, NULL, &t) == 0);
+}
+
+int main(int argc, char *argv[])
+{
+ int readyfd[2], exitfd[2];
+ union {
+ struct sockaddr addr;
+ struct sockaddr_in in;
+ } u;
+ int sfd1, sfd2;
+ char c;
+
+ /* This is how many tests you plan to run */
+ plan_tests(15);
+
+ pipe(readyfd);
+ pipe(exitfd);
+ if (fork() == 0) {
+ close(exitfd[1]);
+ close(readyfd[0]);
+ run_server(readyfd[1], exitfd[0]);
+ err(1, "Event loop failed");
+ }
+ close(exitfd[0]);
+ close(readyfd[1]);
+
+ sfd1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ sfd2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+ u.in.sin_family = AF_INET;
+ u.in.sin_port = htons(OSERVER_PORT);
+ u.in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+
+ /* Wait until child is ready... */
+ if (read(readyfd[0], &c, 1) != 1)
+ errx(1, "Child problems");
+
+ /* Go! */
+ ok1(connect(sfd1, &u.addr, sizeof(u.in)) == 0);
+ ok1(connect(sfd2, &u.addr, sizeof(u.in)) == 0);
+
+ ok1(input_is(sfd1, "Welcome. Please ask your question.\n"));
+ ok1(input_is(sfd2, "Welcome. Please ask your question.\n"));
+
+ ok1(write_sall(sfd1, "question"));
+ ok1(write_sall(sfd2, "question"));
+ /* It shouldn't say anything until we've finished! */
+ ok1(no_input(sfd1));
+ ok1(no_input(sfd2));
+
+ ok1(write_sall(sfd1, " 1\n"));
+ ok1(write_sall(sfd2, " 2\n"));
+
+ ok1(input_is(sfd1, "Our answer is:\nQUESTION 1\n"));
+ ok1(input_is(sfd2, "Our answer is:\nQUESTION 2\n"));
+
+ /* Sockets should be dead now. */
+ ok1(read(sfd1, &c, 1) == 0);
+ ok1(read(sfd2, &c, 1) == 0);
+
+ /* Shut down server. */
+ write(exitfd[1], "", 1);
+
+ /* This will close once it's shut down, and return. */
+ ok1(read(readyfd[0], &c, 1) == 0);