#include #include #include #include #include int check (char * pw, char * encrypted) { char * newencrypted = crypt (pw, encrypted); if (strcmp (newencrypted, encrypted) == 0) return 1; return 0; } void checkall (char * encrypted) { char pw[10]; int i; printf ("Checking %s\n", encrypted); for (i=0; i<10000; ++i) { sprintf (pw, "%d", i); if (check (pw, encrypted)) { printf ("encrypted = %s, real = %s\n", encrypted, pw); break; } } } #define MAXPROCS 4 int main (int argc, char ** argv) { int nrprocs = 0; int pid; FILE * input = stdin; char line[100], encrypted[100]; if (argc > 1) input = fopen (argv[1], "r"); if (!input) { perror ("fopen"); return 1; } while (1) { fgets (line, 100, input); sscanf (line, "%s", encrypted); if (feof (input)) break; while (nrprocs >= MAXPROCS) { if (wait (NULL) > 0) nrprocs --; } fflush (NULL); pid = fork (); if (pid < 0) { /* Error */ perror ("fork"); break; } if (!pid) { /* Child */ checkall (encrypted); return 0; } /* Parent: Continue with while loop. */ nrprocs++; } while (nrprocs) if (wait (NULL) > 0) nrprocs --; return 0; }