Annotation of embedtools/src/wdog.c, revision 1.1.2.2

1.1.2.1   misho       1: /*************************************************************************
                      2:  * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
                      3:  *  by Michael Pounov <misho@aitbg.com>
                      4:  *
                      5:  * $Author: misho $
1.1.2.2 ! misho       6:  * $Id: wdog.c,v 1.1.2.1 2010/10/16 03:30:51 misho Exp $
1.1.2.1   misho       7:  *
                      8:  *************************************************************************/
                      9: #include "global.h"
                     10: 
                     11: 
1.1.2.2 ! misho      12: int Verbose, Kill;
1.1.2.1   misho      13: extern char compiled[], compiledby[], compilehost[];
                     14: 
                     15: 
                     16: static void
                     17: Usage()
                     18: {
                     19: 
                     20:        printf( "WatchDog tool for risk process managment\n"
                     21:                "=== %s === %s@%s ===\n\n"
                     22:                "  Syntax: wdog [options] [exec_file]\n\n"
                     23:                "\t-v\t\tVerbose ...\n"
1.1.2.2 ! misho      24:                "\t-c <dir>\tBefore execute chroot to dir [default=/]\n"
1.1.2.1   misho      25:                "\n", compiled, compiledby, compilehost);
                     26: }
                     27: 
1.1.2.2 ! misho      28: static void
        !            29: sigHand(int sig)
        !            30: {
        !            31:        int stat;
        !            32: 
        !            33:        switch (sig) {
        !            34:                case SIGTERM:
        !            35:                        Kill++;
        !            36:                        break;
        !            37:                case SIGCHLD:
        !            38:                        while (waitpid(-1, &stat, WNOHANG) > 0);
        !            39:                        break;
        !            40:        }
        !            41: }
        !            42: 
1.1.2.1   misho      43: 
                     44: int
                     45: main(int argc, char **argv)
                     46: {
1.1.2.2 ! misho      47:        char ch, szRun[MAXPATHLEN], szChroot[MAXPATHLEN] = "/";
        !            48:        int status, ret = 1;
        !            49:        struct sigaction sa;
        !            50: 
        !            51:        while ((ch = getopt(argc, argv, "vhc:")) != -1)
        !            52:                switch (ch) {
        !            53:                        case 'v':
        !            54:                                Verbose++;
        !            55:                                break;
        !            56:                        case 'c':
        !            57:                                if (access(optarg, R_OK)) {
        !            58:                                        printf("Error:: can`t chroot to %s #%d - %s\n", optarg, 
        !            59:                                                        errno, strerror(errno));
        !            60:                                        goto end;
        !            61:                                } else
        !            62:                                        strlcpy(szChroot, optarg, MAXPATHLEN);
        !            63:                                break;
        !            64:                        case 'h':
        !            65:                        default:
        !            66:                                Usage();
        !            67:                                goto end;
        !            68:                }
        !            69:        argc -= optind;
        !            70:        argv += optind;
        !            71:        if (!argc || !argv || !*argv) {
        !            72:                Usage();
        !            73:                goto end;
        !            74:        } else
        !            75:                strlcpy(szRun, *argv, MAXPATHLEN);
        !            76:        VERB(2) printf("Info:: Chroot=%s Run=%s\n", szChroot, szRun);
        !            77: 
        !            78:        memset(&sa, 0, sizeof sa);
        !            79:        sa.sa_handler = sigHand;
        !            80:        sigemptyset(&sa.sa_mask);
        !            81:        sigaction(SIGTERM, &sa, NULL);
        !            82:        sigaction(SIGCHLD, &sa, NULL);
        !            83:        sa.sa_handler = SIG_IGN;
        !            84:        sigaction(SIGHUP, &sa, NULL);
        !            85:        sigaction(SIGINT, &sa, NULL);
        !            86:        sigaction(SIGQUIT, &sa, NULL);
        !            87:        sigaction(SIGPIPE, &sa, NULL);
        !            88:        sigaction(SIGTSTP, &sa, NULL);
        !            89:        sigaction(SIGSTOP, &sa, NULL);
        !            90:        VERB(5) printf("Info:: Catched signals ...\n");
        !            91: 
        !            92:        if ((ret = chroot(szChroot)) == -1) {
        !            93:                printf("Error:: error in chroot to %s #%d - %s\n", szChroot, errno, strerror(errno));
        !            94:                ret = 3;
        !            95:                goto end;
        !            96:        } else
        !            97:                VERB(1) printf("Info:: chrooted to %s\n", szChroot);
        !            98: 
        !            99:        while (!Kill)
        !           100:                switch ((ret = fork())) {
        !           101:                        case -1:
        !           102:                                printf("Error:: error in fork #%d - %s\n", errno, strerror(errno));
        !           103:                                ret = 4;
        !           104:                                goto end;
        !           105:                        case 0:
        !           106:                                break;
        !           107:                        default:
        !           108:                                waitpid(ret, &status, 0);
        !           109:                }
        !           110: 
        !           111:        ret = 0;
        !           112: end:
        !           113:        return ret;
1.1.2.1   misho     114: }

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