Annotation of 43BSD/contrib/spms/src/bin/pexec/Pexec.c, revision 1.1.1.1

1.1       root        1: static char *rcsid = "$Header$";
                      2: /*
                      3:  * pexec - execute command over project hierarchy
                      4:  *
                      5:  * Author: Peter J. Nicklin
                      6:  */
                      7: #include "bin.h"
                      8: #include "macro.h"
                      9: #include "getarg.h"
                     10: #include "null.h"
                     11: #include "path.h"
                     12: #include "pdtyp.h"
                     13: #include "slist.h"
                     14: #include "spms.h"
                     15: #include "yesno.h"
                     16: 
                     17: char *COMMAND;                         /* command string to be executed */
                     18: char *PGN = "pexec";                   /* program name */
                     19: char *SHELLNAME;                       /* name of command shell */
                     20: char *SHELLPATH;                       /* pathname of command shell */
                     21: int CSHELL = 0;                                /* use csh or sh? */
                     22: int CSHRC = NO;                                /* execute .cshrc if csh shell */
                     23: int DEBUG = NO;                                /* print pexec debugging info */
                     24: int ERRSTATUS = 1;                     /* pexec error status */
                     25: int EXECUTE = YES;                     /* execute command? */
                     26: int IGNORE_BAD_EXIT = NO;              /* exit if command doesn't return 0 */
                     27: int NOQUERY;                           /* query user about quitting? */
                     28: int PRINT_HEADING = YES;               /* print headings for project dirs */
                     29: int PVINDEX;                           /* environ index for PROJECT variable */
                     30: PDTYP PDIRTYP;                         /* project directory type labels list */
                     31: SLIST *ENVLIST;                                /* project environment variable list */
                     32: 
                     33: main(argc, argv)
                     34:        int argc;
                     35:        char **argv;
                     36: {
                     37:        extern int PPDEBUG;             /* project pathname debug flag */
                     38:        char *argvtos();                /* convert cmd args to string */
                     39:        char *getcwp();                 /* get current working project */
                     40:        char *getshell();               /* get command shell pathname */
                     41:        char *pathtail();               /* remove pathname head */
                     42:        char *ppathname = CURPROJECT;   /* project pathname */
                     43:        int atoi();                     /* string to integer conversion */
                     44:        int build_pdset();              /* create set of project dirs */
                     45:        int ch_dir();                   /* change current working directory */
                     46:        int check_pdset();              /* check ordering of set of proj dirs */
                     47:        int exec_pdset();               /* execute cmds in set of proj dirs */
                     48:        int execcmd();                  /* execute command in directory */
                     49:        int getpvindex();               /* get PROJECT env. variable index */
                     50:        int pdtparse();                 /* parse boolean type label expr */
                     51:        int status = 0;                 /* exit status */
                     52:        int xppath();                   /* expand project pathname */
                     53:        PATH pathbuf;                   /* pathname struct buffer */
                     54:        SLIST *slinit();                /* initialize list */
                     55:        void debug_pdset();             /* print dirs + types after sorting */
                     56:        void init_pdset();              /* initialize set of project dirs */
                     57:        void print_title();             /* print project directory title */
                     58:        void sort_pdset();              /* sort set of project dirs */
                     59: 
                     60:        {
                     61:        register char *s;               /* option pointer */
                     62:        while (--argc > 0 && **++argv == '-')
                     63:                {
                     64:                for (s = argv[0]+1; *s != '\0'; s++)
                     65:                        switch (*s)
                     66:                                {
                     67:                                case '?':
                     68:                                        NOQUERY++;
                     69:                                        break;
                     70:                                case 'D':
                     71:                                        DEBUG = YES;
                     72:                                        PPDEBUG = YES;
                     73:                                        break;
                     74:                                case 'P':
                     75:                                        ppathname = GETARG(s);
                     76:                                        if (*ppathname == '\0')
                     77:                                                {
                     78:                                                warn("missing project name");
                     79:                                                status = 1;
                     80:                                                }
                     81:                                        goto endfor;
                     82:                                case 'T':
                     83:                                        if (pdtparse(GETARG(s), &PDIRTYP) == NO)
                     84:                                                status = 1;
                     85:                                        goto endfor;
                     86:                                case 'X':
                     87:                                        ERRSTATUS = atoi(GETARG(s));
                     88:                                        goto endfor;
                     89:                                case 'c':
                     90:                                        CSHRC = YES;
                     91:                                        break;
                     92:                                case 'i':
                     93:                                        IGNORE_BAD_EXIT = YES;
                     94:                                        break;
                     95:                                case 'q':
                     96:                                        PRINT_HEADING = NO;
                     97:                                        break;
                     98:                                case 'x':
                     99:                                        EXECUTE = NO;
                    100:                                        break;
                    101:                                default:
                    102:                                        warn("bad option -%c", *s);
                    103:                                        status = 1;
                    104:                                        goto endfor;
                    105:                                }
                    106:                endfor: continue;
                    107:                }
                    108:        }
                    109:        if (status == 1 || argc < 1)
                    110:                {
                    111:                warn("usage: pexec [-?ciqx] [-P pdirname] [-T typexpr] command");
                    112:                pxexit();
                    113:                }
                    114:        /*
                    115:         * The PROJECT environment variable must exist because
                    116:         * it has to be modified before each command execution.
                    117:         */
                    118:        if ((PVINDEX = getpvindex()) < 0)
                    119:                {
                    120:                warn("no project environment");
                    121:                pxexit();
                    122:                }
                    123: 
                    124:        if ((COMMAND = argvtos(argc, argv)) == NULL)
                    125:                pxexit();
                    126:        SHELLPATH = getshell();
                    127:        SHELLNAME = pathtail(SHELLPATH);
                    128:        if (EQUAL(SHELLNAME, pathtail(CSH)))
                    129:                CSHELL++;
                    130: 
                    131:        /* convert project pathname to regular pathname */
                    132:        if (xppath(ppathname, &pathbuf) == -1)
                    133:                {
                    134:                patherr(ppathname);
                    135:                pxexit();
                    136:                }
                    137:        else switch (pathbuf.p_mode & P_IFMT)
                    138:                {
                    139:                case P_IFNEW:
                    140:                case P_IFREG:
                    141:                        warn("%s: no such project or project directory", ppathname);
                    142:                        pxexit();
                    143:                case P_IFPDIR:
                    144:                        IGNORE_BAD_EXIT = NO;
                    145:                        if (PRINT_HEADING == YES)
                    146:                                print_title(ppathname);
                    147:                        ch_dir(pathbuf.p_path);
                    148:                        if (EXECUTE == YES)
                    149:                                status |= execcmd(pathbuf.p_project);
                    150:                        break;
                    151:                case P_IFHOME:
                    152:                case P_IFPROOT:
                    153:                        if (PDIRTYP.pfxsize == 0)
                    154:                                status |= execproject(ppathname, pathbuf.p_path);
                    155:                        else    {
                    156:                                ENVLIST = slinit();
                    157:                                init_pdset();
                    158:                                if (build_pdset(ppathname, pathbuf.p_path) != 0)
                    159:                                        pxexit();
                    160:                                sort_pdset();
                    161:                                if (DEBUG == YES)
                    162:                                        debug_pdset();
                    163:                                if (check_pdset() != 0)
                    164:                                        pxexit();
                    165:                                status |= exec_pdset();
                    166:                                }
                    167:                        break;
                    168:                }
                    169:        exit(status);
                    170: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.