1: /* $Header$ */ 2: 3: /* 4: * Author: Peter J. Nicklin 5: */ 6: #include <stdio.h> 7: #include "macro.h" 8: #include "null.h" 9: #include "path.h" 10: #include "pdb.h" 11: #include "pdlist.h" 12: #include "pld.h" 13: #include "slslist.h" 14: #include "spms.h" 15: #include "yesno.h" 16: 17: /* 18: * execlist() executes a project directory list. Returns non-zero error 19: * status if error. 20: */ 21: execlist(pdlist) 22: PDLIST *pdlist; /* project directory list */ 23: { 24: extern int ERRSTATUS; /* pexec error status */ 25: extern int EXECUTE; /* execute command? */ 26: extern int PRINT_HEADING; /* print headings for project dirs */ 27: int ch_dir(); /* change current working directory */ 28: int execcmd(); /* execute command in directory */ 29: int status = 0; /* return status */ 30: PDBLK *pdblk; /* project directory list block */ 31: void print_title(); /* print project directory title */ 32: 33: for (pdblk = pdlist->head; pdblk != NULL; pdblk = pdblk->next) 34: { 35: if (PRINT_HEADING == YES) 36: print_title(pdblk->ppath); 37: if (ch_dir(pdblk->rpath) == NO) 38: status = ERRSTATUS; 39: else if (EXECUTE == YES) 40: status |= execcmd(pdblk->project); 41: } 42: return(status); 43: } 44: 45: 46: 47: /* 48: * execproject() builds a project directory list and executes commands 49: * within directories on that list. 50: */ 51: execproject(ppathname, pathname) 52: char *ppathname; /* project root dir project pathname */ 53: char *pathname; /* regular project root dir pathname */ 54: { 55: extern int ERRSTATUS; /* pexec error status */ 56: char ppathbuf[PPATHSIZE]; /* project pathname buffer */ 57: char *pdprepend(); /* prepend project directory */ 58: char *ppathcat(); /* project pathname concatenation */ 59: char *slsprepend(); /* prepend key+string */ 60: int closepdb(); /* close database */ 61: int errpdb(); /* print database error message */ 62: int execlist(); /* execute project directory list */ 63: int slssort(); /* sort list */ 64: int status = 0; /* return status */ 65: int strcmp(); /* string comparison */ 66: PATH *pd; /* pathname struct pointer */ 67: PATH *readpld(); /* read project link directory entry */ 68: PDB *openpdb(); /* open database */ 69: PDB *pldp; /* project link directory stream */ 70: PDLIST *pdinit(); /* initialize project directory list */ 71: PDLIST *pdlist; /* project directory list */ 72: SLSBLK *pblk; /* project list block */ 73: SLSLIST *plist; /* project list */ 74: SLSLIST *slsinit(); /* initialize list */ 75: void pdrm(); /* remove project directory list */ 76: void pdsort(); /* sort project directory list */ 77: void slsrm(); /* remove list item */ 78: 79: pdlist = pdinit(); 80: plist = slsinit(); 81: 82: /* read PLDNAME project link directory */ 83: if ((pldp = openpdb(PLDNAME, pathname, "r")) == NULL) 84: return(errpdb((PDB *) NULL)); 85: while ((pd = readpld(pldp)) != NULL) 86: { 87: if (EQUAL(pd->p_alias, PARENTPROJECT)) 88: continue; 89: 90: if (EQUAL(pd->p_alias, CURPROJECT)) 91: { 92: pdprepend(ppathname, pd->p_path, pathname, pdlist); 93: } 94: else if (pd->p_mode == P_IFPROOT) 95: { 96: if (slsprepend(pd->p_alias, pd->p_path, plist) == NULL) 97: pxexit(); 98: } 99: else { 100: ppathcat(ppathbuf, ppathname, pd->p_alias); 101: pdprepend(ppathbuf, pd->p_path, pathname, pdlist); 102: } 103: } 104: if (closepdb(pldp) != 0) 105: status = ERRSTATUS; 106: 107: /* sort and execute project directories */ 108: pdsort(strcmp, pdlist); 109: status |= execlist(pdlist); 110: pdrm(pdlist); 111: 112: /* execute subprojects */ 113: if (slssort(strcmp, plist) == NO) 114: pxexit(); 115: for (pblk = plist->head; pblk != NULL; pblk = pblk->next) 116: { 117: ppathcat(ppathbuf, ppathname, pblk->key); 118: status |= execproject(ppathbuf, pblk->string); 119: } 120: slsrm(CNULL, plist); 121: 122: return(status); 123: }