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: }
Defined functions
main
defined in line
33;
never used
Defined variables
CSHRC
defined in line
22; used 1 times
DEBUG
defined in line
23; used 2 times
PGN
defined in line
18; used 1 times
rcsid
defined in line
1;
never used