Index: wesside-ng.c =================================================================== --- wesside-ng.c (revision 834) +++ wesside-ng.c (working copy) @@ -270,6 +270,7 @@ } static void cleanup(int x); +static void sigchild(int x); static void time_print(char* fmt, ...) { @@ -1623,6 +1624,16 @@ return 0; } +static void sigchild(int x) +{ + struct wstate *ws; + + if (x) {} /* XXX unused */ + + ws = get_ws(); + ws->ws_crack_pid = 0; /* crack done */ +} + static void try_crack(struct wstate *ws) { if (ws->ws_crack_pid) { @@ -1908,6 +1919,10 @@ perror("signal()"); exit(1); } + if (signal (SIGCHLD, &sigchild) == SIG_ERR) { + perror("signal()"); + exit(1); + } time_print("Looking for a victim...\n"); @@ -1950,10 +1965,17 @@ FD_SET(wifd, &rfd); tv.tv_sec = 0; tv.tv_usec = 1000*10; + rd = select(largest+1, &rfd, NULL, NULL, &tv); if (rd == -1) { - perror("select()"); - exit(1); + switch (errno != EINTR) { + case EINTR: /* handle SIGCHLD */ + break; + default: + perror("select()"); + exit(1); + break; + } } // read