Diff for /embedtools/src/wdog.c between versions 1.1.2.2 and 1.1.2.8

version 1.1.2.2, 2010/10/18 08:32:39 version 1.1.2.8, 2010/10/18 15:06:10
Line 9 Line 9
 #include "global.h"  #include "global.h"
   
   
int Verbose, Kill;int Verbose, Kill, Log;
 extern char compiled[], compiledby[], compilehost[];  extern char compiled[], compiledby[], compilehost[];
   
   
Line 22  Usage() Line 22  Usage()
                 "  Syntax: wdog [options] [exec_file]\n\n"                  "  Syntax: wdog [options] [exec_file]\n\n"
                 "\t-v\t\tVerbose ...\n"                  "\t-v\t\tVerbose ...\n"
                 "\t-c <dir>\tBefore execute chroot to dir [default=/]\n"                  "\t-c <dir>\tBefore execute chroot to dir [default=/]\n"
                   "\t-u <user>\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);                  "\n", compiled, compiledby, compilehost);
 }  }
   
Line 40  sigHand(int sig) Line 43  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  int
 main(int argc, char **argv)  main(int argc, char **argv)
 {  {
        char ch, szRun[MAXPATHLEN], szChroot[MAXPATHLEN] = "/";        char ch, bypass = 0, szChroot[MAXPATHLEN] = DEFAULT_CHROOT;
        int status, ret = 1;        int status = 0, ret = 1;
         struct sigaction sa;          struct sigaction sa;
           struct passwd *pass = NULL;
           u_int penalty = 1;
           uid_t uid = getuid();
   
        while ((ch = getopt(argc, argv, "vhc:")) != -1)        while ((ch = getopt(argc, argv, "vhSPc:u:")) != -1)
                 switch (ch) {                  switch (ch) {
                         case 'v':                          case 'v':
                                 Verbose++;                                  Verbose++;
                                 break;                                  break;
                           case 'P':
                                   bypass = 1;
                                   break;
                           case 'S':
                                   Log = 1;
                                   break;
                         case 'c':                          case 'c':
                                   if (uid) {
                                           printf("Error:: can`t chroot, please run as root!\n");
                                           goto end;
                                   }
                                 if (access(optarg, R_OK)) {                                  if (access(optarg, R_OK)) {
                                         printf("Error:: can`t chroot to %s #%d - %s\n", optarg,                                           printf("Error:: can`t chroot to %s #%d - %s\n", optarg, 
                                                         errno, strerror(errno));                                                          errno, strerror(errno));
                                         goto end;                                          goto end;
                                 } else                                  } else
                                         strlcpy(szChroot, optarg, MAXPATHLEN);                                          strlcpy(szChroot, optarg, MAXPATHLEN);
                                   status |= 1;
                                 break;                                  break;
                           case 'u':
                                   if (uid) {
                                           printf("Error:: can`t setuid, please run as root!\n");
                                           goto end;
                                   }
                                   pass = getpwnam(optarg);
                                   if (!pass) {
                                           printf("Error:: can`t find user %s\n", optarg);
                                           goto end;
                                   } else
                                           uid = pass->pw_uid;
                                   endpwent();
                                   status |= 2;
                                   break;
                         case 'h':                          case 'h':
                         default:                          default:
                                 Usage();                                  Usage();
Line 71  main(int argc, char **argv) Line 115  main(int argc, char **argv)
         if (!argc || !argv || !*argv) {          if (!argc || !argv || !*argv) {
                 Usage();                  Usage();
                 goto end;                  goto end;
        } else        }
                strlcpy(szRun, *argv, MAXPATHLEN); 
        VERB(2) printf("Info:: Chroot=%s Run=%s\n", szChroot, szRun); 
   
           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);          memset(&sa, 0, sizeof sa);
         sa.sa_handler = sigHand;          sa.sa_handler = sigHand;
         sigemptyset(&sa.sa_mask);          sigemptyset(&sa.sa_mask);
Line 87  main(int argc, char **argv) Line 134  main(int argc, char **argv)
         sigaction(SIGPIPE, &sa, NULL);          sigaction(SIGPIPE, &sa, NULL);
         sigaction(SIGTSTP, &sa, NULL);          sigaction(SIGTSTP, &sa, NULL);
         sigaction(SIGSTOP, &sa, NULL);          sigaction(SIGSTOP, &sa, NULL);
        VERB(5) printf("Info:: Catched signals ...\n");        VERB(5) logmsg(LOG_NOTICE, "Info:: Catched signals ...\n");
   
        if ((ret = chroot(szChroot)) == -1) {        if (status & 1 && (ret = chroot(szChroot)) == -1) {
                 printf("Error:: error in chroot to %s #%d - %s\n", szChroot, errno, strerror(errno));                  printf("Error:: error in chroot to %s #%d - %s\n", szChroot, errno, strerror(errno));
                 ret = 3;                  ret = 3;
                 goto end;                  goto end;
         } else          } else
                VERB(1) printf("Info:: chrooted to %s\n", szChroot);                VERB(1) logmsg(LOG_NOTICE, "Info:: chrooted to %s\n", szChroot);
   
        while (!Kill)        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) logmsg(LOG_NOTICE, "Info:: setuid to %u\n", uid);
 
         status ^= status;
         while (!Kill && penalty) {
                 switch ((ret = fork())) {                  switch ((ret = fork())) {
                         case -1:                          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 = 4;                                ret = 5;
                                 goto end;                                  goto end;
                         case 0:                          case 0:
                                   VERB(3) logmsg(LOG_NOTICE, "Info:: I`m child of shadows ...\n");
                                   if (execvp(*argv, argv) == -1) {
                                           logmsg(LOG_ERR, "Error:: error in exec %s #%d - %s\n", 
                                                           *argv, errno, strerror(errno));
                                           ret = 6;
                                           goto end;
                                   }
                                   /* never reached !!! */
                                 break;                                  break;
                         default:                          default:
                                waitpid(ret, &status, 0);                                wait(&status);
                                 kill(ret, SIGTERM);
                                 ret = status;
                 }                  }
                /* penalty timeout retry */
        ret = 0;                usleep(penalty);
                 if (!bypass) {
                         penalty <<= 1;
                         VERB(2) logmsg(LOG_NOTICE, "Info:: penalty timeout %u microseconds\n", penalty);
                 }
         }
         if (!penalty)
                 ret = 9;
 end:  end:
           if (!Log)
                   closelog();
         return ret;          return ret;
 }  }

Removed from v.1.1.2.2  
changed lines
  Added in v.1.1.2.8


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>