|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.