--- embedtools/src/wdog.c 2010/10/18 11:13:50 1.1.2.5 +++ embedtools/src/wdog.c 2010/10/18 15:06:10 1.1.2.8 @@ -3,13 +3,13 @@ * by Michael Pounov * * $Author: misho $ - * $Id: wdog.c,v 1.1.2.5 2010/10/18 11:13:50 misho Exp $ + * $Id: wdog.c,v 1.1.2.8 2010/10/18 15:06:10 misho Exp $ * *************************************************************************/ #include "global.h" -int Verbose, Kill; +int Verbose, Kill, Log; extern char compiled[], compiledby[], compilehost[]; @@ -23,6 +23,8 @@ Usage() "\t-v\t\tVerbose ...\n" "\t-c \tBefore execute chroot to dir [default=/]\n" "\t-u \tBefore execute change user\n" + "\t-P\t\tInfinit loop, bypass penalty timeout\n" + "\t-S\t\tDisable send log events to syslog\n" "\n", compiled, compiledby, compilehost); } @@ -41,22 +43,41 @@ sigHand(int sig) } } +static void +logmsg(int prio, const char *fmt, ...) +{ + va_list lst; + va_start(lst, fmt); + if (!Log) + vsyslog(prio, fmt, lst); + else + vprintf(fmt, lst); + va_end(lst); +} + + int main(int argc, char **argv) { - char ch, szChroot[MAXPATHLEN] = "/"; + char ch, bypass = 0, szChroot[MAXPATHLEN] = DEFAULT_CHROOT; int status = 0, ret = 1; struct sigaction sa; struct passwd *pass = NULL; - uid_t uid = getuid(); u_int penalty = 1; + uid_t uid = getuid(); - while ((ch = getopt(argc, argv, "vhc:u:")) != -1) + while ((ch = getopt(argc, argv, "vhSPc:u:")) != -1) switch (ch) { case 'v': Verbose++; break; + case 'P': + bypass = 1; + break; + case 'S': + Log = 1; + break; case 'c': if (uid) { printf("Error:: can`t chroot, please run as root!\n"); @@ -94,9 +115,13 @@ main(int argc, char **argv) if (!argc || !argv || !*argv) { Usage(); goto end; - } else - VERB(2) printf("Info:: Chroot=%s Run=%s\n", szChroot, *argv); + } + if (!Log) + openlog("wdog", LOG_PID, LOG_USER); + + VERB(2) logmsg(LOG_NOTICE, "Info:: Chroot=%s Run=%s\n", szChroot, *argv); + memset(&sa, 0, sizeof sa); sa.sa_handler = sigHand; sigemptyset(&sa.sa_mask); @@ -109,33 +134,33 @@ main(int argc, char **argv) sigaction(SIGPIPE, &sa, NULL); sigaction(SIGTSTP, &sa, NULL); sigaction(SIGSTOP, &sa, NULL); - VERB(5) printf("Info:: Catched signals ...\n"); + VERB(5) logmsg(LOG_NOTICE, "Info:: Catched signals ...\n"); if (status & 1 && (ret = chroot(szChroot)) == -1) { printf("Error:: error in chroot to %s #%d - %s\n", szChroot, errno, strerror(errno)); ret = 3; goto end; } else - VERB(1) printf("Info:: chrooted to %s\n", szChroot); + VERB(1) logmsg(LOG_NOTICE, "Info:: chrooted to %s\n", szChroot); if (status & 2 && setuid(uid) == -1) { printf("Error:: error in setuid to %u #%d - %s\n", uid, errno, strerror(errno)); ret = 4; goto end; } else - VERB(1) printf("Info:: setuid to %u\n", uid); + VERB(1) logmsg(LOG_NOTICE, "Info:: setuid to %u\n", uid); status ^= status; while (!Kill && penalty) { switch ((ret = fork())) { case -1: - printf("Error:: error in fork #%d - %s\n", errno, strerror(errno)); + logmsg(LOG_ERR, "Error:: error in fork #%d - %s\n", errno, strerror(errno)); ret = 5; goto end; case 0: - VERB(3) printf("Info:: I`m child of shadows ...\n"); + VERB(3) logmsg(LOG_NOTICE, "Info:: I`m child of shadows ...\n"); if (execvp(*argv, argv) == -1) { - printf("Error:: error in exec %s #%d - %s\n", + logmsg(LOG_ERR, "Error:: error in exec %s #%d - %s\n", *argv, errno, strerror(errno)); ret = 6; goto end; @@ -149,11 +174,15 @@ main(int argc, char **argv) } /* penalty timeout retry */ usleep(penalty); - penalty <<= 1; - VERB(2) printf("Info:: penalty timeout %u microseconds\n", penalty); + if (!bypass) { + penalty <<= 1; + VERB(2) logmsg(LOG_NOTICE, "Info:: penalty timeout %u microseconds\n", penalty); + } } if (!penalty) ret = 9; end: + if (!Log) + closelog(); return ret; }