--- embedtools/src/wdog.c 2010/10/18 10:47:06 1.1.2.4 +++ embedtools/src/wdog.c 2010/10/18 11:13:50 1.1.2.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ - * $Id: wdog.c,v 1.1.2.4 2010/10/18 10:47:06 misho Exp $ + * $Id: wdog.c,v 1.1.2.5 2010/10/18 11:13:50 misho Exp $ * *************************************************************************/ #include "global.h" @@ -50,6 +50,7 @@ main(int argc, char **argv) struct sigaction sa; struct passwd *pass = NULL; uid_t uid = getuid(); + u_int penalty = 1; while ((ch = getopt(argc, argv, "vhc:u:")) != -1) switch (ch) { @@ -125,7 +126,7 @@ main(int argc, char **argv) VERB(1) printf("Info:: setuid to %u\n", uid); status ^= status; - while (!Kill) + while (!Kill && penalty) { switch ((ret = fork())) { case -1: printf("Error:: error in fork #%d - %s\n", errno, strerror(errno)); @@ -139,13 +140,20 @@ main(int argc, char **argv) ret = 6; goto end; } - /* never reached */ + /* never reached !!! */ break; default: wait(&status); kill(ret, SIGTERM); ret = status; } + /* penalty timeout retry */ + usleep(penalty); + penalty <<= 1; + VERB(2) printf("Info:: penalty timeout %u microseconds\n", penalty); + } + if (!penalty) + ret = 9; end: return ret; }