rsalz@uunet.uu.net (Rich Salz) (06/07/89)
Submitted-by: Axel Mahler <unido!coma!axel> Posting-number: Volume 19, Issue 37 Archive-name: shape/part24 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 24 (of 33)." # Contents: src/shape/files.c # Wrapped by rsalz@papaya.bbn.com on Thu Jun 1 19:27:15 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'src/shape/files.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/shape/files.c'\" else echo shar: Extracting \"'src/shape/files.c'\" \(27004 characters\) sed "s/^X//" >'src/shape/files.c' <<'END_OF_FILE' X/* X * Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst, X * and U. Pralle X * X * This software is published on an as-is basis. There is ABSOLUTELY NO X * WARRANTY for any part of this software to work correctly or as described X * in the manuals. We do not accept any liability for any kind of damage X * caused by use of this software, such as loss of data, time, money, or X * effort. X * X * Permission is granted to use, copy, modify, or distribute any part of X * this software as long as this is done without asking for charge, and X * provided that this copyright notice is retained as part of the source X * files. You may charge a distribution fee for the physical act of X * transferring a copy, and you may at your option offer warranty X * protection in exchange for a fee. X * X * Direct questions to: Tech. Univ. Berlin X * Wilfried Koch X * Sekr. FR 5-6 X * Franklinstr. 28/29 X * D-1000 Berlin 10, West Germany X * X * Tel: +49-30-314-22972 X * E-mail: shape@coma.uucp or shape@db0tui62.bitnet X */ X#ifndef lint Xstatic char *RCSid = "$Header: files.c,v 3.3 89/02/20 16:23:45 wolfgang Exp $"; X#endif X#ifndef lint Xstatic char *ConfFlg = CFFLGS; /* should be defined from within Makefile */ X#endif X/* X * $Log: files.c,v $ X * Revision 3.3 89/02/20 16:23:45 wolfgang X * NET-RELEASE X * X * Revision 3.2 89/02/13 19:35:15 wolfgang X * performance improved X * X * Revision 3.1 89/02/08 12:45:42 wolfgang X * performance improved. X * X * Revision 3.0 89/01/24 11:35:24 wolfgang X * New System Generation X * X * Revision 2.30 89/01/03 13:09:44 wolfgang X * changes done for lint X * X * Revision 2.29 88/12/21 15:02:45 wolfgang X * changes done for lint X * X * Revision 2.28 88/12/12 13:15:58 wolfgang X * bug fixed (something for sun). X * X * Revision 2.27 88/11/24 14:30:36 wolfgang X * derived object no longer inherit uda's . X * X * Revision 2.26 88/11/23 15:19:39 wolfgang X * hidden attrs are no longer part of confid. X * X * Revision 2.25 88/11/23 15:02:57 wolfgang X * bug fixed. X * X * Revision 2.24 88/11/22 17:27:33 wolfgang X * bug fixed (strncmp). X * X * Revision 2.22 88/11/21 15:51:11 wolfgang X * return code of all malloc's checked X * X * Revision 2.21 88/11/08 18:06:04 wolfgang X * bug fixed: retcode wasn't correct initialized (in exists_file()). X * X * Revision 2.20 88/11/08 11:01:23 wolfgang X * bug fixed in evtl_set_busy: selction rules are now not applied to X * derived objects. X * X * Revision 2.19 88/11/05 14:35:51 wolfgang X * bug fixed. full filenames (including path) were destroyed sometimes. X * X * Revision 2.18 88/11/03 17:28:59 wolfgang X * bug fixed in exists_file X * X * Revision 2.17 88/10/24 16:19:30 wolfgang X * bug fixed in exists_file. X * X * Revision 2.16 88/10/18 20:33:48 wolfgang X * bugs fixed. pathlist wasn't correct. set busy of name including X * full path didn't work. X * X * Revision 2.15 88/10/10 17:02:34 wolfgang X * This version is part of a release X * X * Revision 2.14 88/09/22 16:14:06 wolfgang X * changes done to set busy the same file more than once. X * X * Revision 2.13 88/09/15 18:42:14 wolfgang X * call of reset_vclass added. X * X * Revision 2.12 88/08/30 12:20:44 wolfgang X * minor bug fixed., X * X * Revision 2.11 88/08/25 16:10:55 wolfgang X * This version is part of a release X * X * Revision 2.10 88/08/25 10:29:31 wolfgang X * Now a warning is produced, if a confid contains non-frozen versions X * of a component. X * X * Revision 2.9 88/08/23 16:35:40 wolfgang X * The handling of author@host is now correct. X * X * Revision 2.8 88/08/23 15:35:45 wolfgang X * Genarating of confid's has been changed. The name of the selection X * rule starts now with '@'. X * X * Revision 2.7 88/08/23 14:06:47 wolfgang X * Minor bug fixed. The dummy predicate SMILEY was followed by ":" X * instead of ",". X * X * Revision 2.6 88/08/23 11:22:37 wolfgang X * vardump(fd) added to finish_confid. X * X * Revision 2.5 88/08/23 10:27:01 wolfgang X * ruledump() added to finish_confid; little bug fix in write_confid. X * X * Revision 2.4 88/08/22 17:13:31 wolfgang X * Two procedures added: X * init_confid: to initialize the confid X * finish_confid: dumps the macrodefinitions. X * write_confid changed; only the relevant predicates are written to the X * confid now. X * Furthermore handling of syspath & host added to evtl_set_busy(). X * X * Revision 2.3 88/08/22 11:13:41 wolfgang X * Minor bug fixed. attr(author,<name>) wasn't evaluated correctly. X * X * Revision 2.2 88/08/19 12:25:02 wolfgang X * Minor bug fixed. Pathlist contained '/' in filename. X * X * Revision 2.1 88/08/19 10:17:18 wolfgang X * This version is part of a release X * X */ X X#include "shape.h" X#include "files.h" X X#include <pwd.h> X#include <stdio.h> X#include <sys/stat.h> X#include <sys/time.h> X#include <errno.h> X Xextern int errno; X Xextern register_link(); X Xextern FILE *af_open(); X Xextern struct passwd *getpwnam(); Xextern char *mktemp(); X Xextern int af_setgkey(); Xextern int af_gattrs(); Xextern int WriteXPand(); Xextern int logerr(); Xextern int append_attrs(); Xextern int append_mtime(); Xextern Bool stopit(); Xextern Bool tunix(); Xextern struct rules *get_target(); Xextern int dump(); Xextern int ruledump(); Xextern int vardump(); Xextern int reset_vclass(); X XAf_attrs buft; Xextern char *macrostr; Xextern char cursr[]; Xchar actpath[MAXNAMLEN]; Xextern char *states[]; Xextern struct selection_rules *currule; X Xextern Bool busy_done; Xextern int depth; Xextern int pathi; Xchar *pathlist[MAXPATHLIST][2]; Xint lastpath = 0; Xchar dollarplus[MAXNAMLEN]; X Xget_date_of(anything,set,path) X char *anything; X Af_set *set; X char *path; X { X /* attrs of busy version */ XAf_attrs buf; X Xchar bname[MAXNAMLEN]; Xchar *p; Xchar *d; Xchar sysp[MAXNAMLEN]; X Xsysp[0] = '\0'; X X(void) strcpy(bname,anything); Xif ((p = rindex(bname,'.')) == NIL) X ; Xelse X { X p[0] = '\0'; X *p++; X } X Xif ((d = rindex(bname,'/')) != 0) X { X (void) strcpy(sysp, bname); X d = rindex(sysp, '/'); X d[0] = '\0'; X *d++; X (void) strcpy(bname,d); X } Xaf_initattrs(&buf); X Xbuf.af_gen = AF_BUSYVERS; Xbuf.af_rev = AF_BUSYVERS; X X(void) strcpy(buf.af_name,bname); Xif (p != NIL) X (void) strcpy(buf.af_type,p); Xelse X (void) strcpy(buf.af_type,""); X Xif(path != NIL) X (void) strcpy(buf.af_syspath, path); X X/* if ((retcode = af_bpfind(&buf,&bset)) == -1) X errexit(10,"af_bpfind"); */ X Xif (af_find(&buf,set) == -1) /* &aset */ X errexit(10,"af_find"); X X/* if ((retcode = af_union(&aset,&bset,set)) == -1 ) X errexit(10,"af_union"); */ X} X X XBool exists_file(name,mode) X char *name; X int mode; X{ X Xchar bname[MAXNAMLEN]; Xchar type[64]; Xchar *p; Xchar *d; X Xint retcode = -1; Xint retcodex; Xint retcodey; Xint i; Xint ii = 1; Xchar sysp[MAXNAMLEN]; Xchar lname[MAXNAMLEN]; Xchar *px; XAf_attrs buf; X Xsysp[0] = '\0'; Xif (name == NIL) X return (FALSE); X X(void) strcpy(lname,name); Xif((px = rindex(lname,'/')) != NIL) X { X *px = '\0'; X px++; X } Xelse X px = &lname[0]; X Xif (mode != BINARY) X { X for(i = lastpath - 1; i >= 0; i--) X /* looking in pathlist if file already exists */ X { X if(!strcmp(px,pathlist[i][0])) X { X if (!strcmp(pathlist[i][1],"&$")) X (void) strcpy(actpath,curvpath[0]); X else X { X if(pathlist[i][1][0] != '/') X { X (void) strcpy(actpath,curvpath[0]); X (void) strcat(actpath,"/"); X (void) strcat(actpath,pathlist[i][1]); X } X else X { X (void) strcpy(actpath,pathlist[i][1]); X } X if ((px = rindex(actpath,'/')) != NIL) X *px = '\0'; X } X return(TRUE); X } X } X } X X(void) strcpy(bname,name); Xif ((p = rindex(bname,'.')) == 0) X { X type[0] = '\0'; X } Xelse X { X p[0] = '\0'; X *p++; X (void) strcpy(type,p); X } Xif ((d = rindex(bname,'/')) != 0) X { X (void) strcpy(sysp, bname); X d = rindex(sysp, '/'); X d[0] = '\0'; X *d++; X (void) strcpy(bname,d); X } Xaf_initattrs(&buf); X Xbuf.af_gen = AF_NOVNUM; Xbuf.af_rev = AF_NOVNUM; X X(void) strcpy(buf.af_name,bname); X X(void) strcpy(buf.af_type,type); X Xwhile(curvpath[ii] != NIL) X ii++; X Xi = ii - 1; X Xwhile ( i >= 1 ) X { X (void) strcpy(buf.af_syspath, curvpath[i]); X X if (mode == ALL) X { X retcodex = af_access(buf.af_syspath, buf.af_name, buf.af_type, AF_SOURCE); X retcodey = af_access(buf.af_syspath, buf.af_name, buf.af_type, AF_DERIVED); X if((retcodex == 0) || (retcodey == 0)) X retcode = 0; X else X retcode = -1; X } X X if (mode == SOURCE) X retcode = af_access(buf.af_syspath, buf.af_name, buf.af_type, AF_SOURCE); X X if (mode == BINARY) X retcode = af_access(buf.af_syspath, buf.af_name, buf.af_type, AF_DERIVED); X X if ((retcode == 0)) /* && (strcmp(buf.af_syspath,curvpath[0]))) */ X { X (void) strcpy(actpath,curvpath[i]); X if ((pathlist[lastpath][0] = malloc(MAXNAMLEN)) == NIL) X errexit(10,"malloc"); X (void) strcpy(pathlist[lastpath][0],buf.af_name); X if (buf.af_type[0] != '\0') X { X (void) strcat(pathlist[lastpath][0],"."); X (void) strcat(pathlist[lastpath][0],buf.af_type); X } X if (!strcmp(buf.af_syspath,curvpath[0])) X { X if((pathlist[lastpath][1] = malloc(3)) == NIL) X errexit(10,"malloc"); X (void) strcpy(pathlist[lastpath][1],"&$"); X#ifdef DEBUG_FILES Xprintf("%d:%s:%s\n", lastpath,pathlist[lastpath][0], pathlist[lastpath][1]); X#endif DEBUG_FILES X lastpath++; X } X else X { X if((pathlist[lastpath][1] = malloc(MAXNAMLEN)) == NIL) X errexit(10,"malloc"); X (void) strcpy(pathlist[lastpath][1],buf.af_syspath); X (void) strcat(pathlist[lastpath][1],"/"); X (void) strcat(pathlist[lastpath][1],pathlist[lastpath][0]); X#ifdef DEBUG_FILES Xprintf("%d:%s:%s\n", lastpath,pathlist[lastpath][0], pathlist[lastpath][1]); X#endif DEBUG_FILES X lastpath++; X break; X } X } X i--; X } Xif (retcode == 0) X { X (void) strcpy(actpath,curvpath[i]); X return(TRUE); X } X Xif (sysp[0] != '\0') X (void) strcpy(buf.af_syspath, sysp); Xelse X (void) strcpy(buf.af_syspath, curvpath[0]); X X Xif (mode == ALL) X { X retcodex = af_access(buf.af_syspath, buf.af_name, buf.af_type, AF_SOURCE); X retcodey = af_access(buf.af_syspath, buf.af_name, buf.af_type, AF_DERIVED); X if((retcodex == 0) || (retcodey == 0)) X retcode = 0; X else X retcode = -1; X } X Xif (mode == SOURCE) X retcode = af_access(buf.af_syspath, buf.af_name, buf.af_type, AF_SOURCE); X Xif (mode == BINARY) X retcode = af_access(buf.af_syspath, buf.af_name, buf.af_type, AF_DERIVED); X Xif (retcode == 0) /* && (strcmp(buf.af_syspath,curvpath[0]))) */ X { X (void) strcpy(actpath,buf.af_syspath); X if ((pathlist[lastpath][0] = malloc(MAXNAMLEN)) == NIL) X errexit(10,"malloc"); X (void) strcpy(pathlist[lastpath][0],buf.af_name); X if (buf.af_type[0] != '\0') X { X (void) strcat(pathlist[lastpath][0],"."); X (void) strcat(pathlist[lastpath][0],buf.af_type); X } X if (!strcmp(buf.af_syspath,curvpath[0])) X { X if((pathlist[lastpath][1] = malloc(3)) == NIL) X errexit(10,"malloc"); X (void) strcpy(pathlist[lastpath][1],"&$"); X#ifdef DEBUG_FILES Xprintf("%d:%s:%s\n", lastpath,pathlist[lastpath][0], pathlist[lastpath][1]); X#endif DEBUG_FILES X lastpath++; X } X else X { X if ((pathlist[lastpath][1] = malloc(MAXNAMLEN)) == NIL) X errexit(10,"malloc"); X (void) strcpy(pathlist[lastpath][1],buf.af_syspath); X (void) strcat(pathlist[lastpath][1],"/"); X (void) strcat(pathlist[lastpath][1],pathlist[lastpath][0]); X#ifdef DEBUG_FILES Xprintf("%d:%s:%s\n", lastpath,pathlist[lastpath][0], pathlist[lastpath][1]); X#endif DEBUG_FILES X lastpath++; X return(TRUE); X } X } X Xif(retcode == 0) X { X (void) strcpy(actpath,buf.af_syspath); X return(TRUE); X } X Xif (retcode == -1) X return (FALSE); Xelse X return (TRUE); X} X X XFILE *vmfopen( filename, mode, gen,rev) X char *filename; X char *mode; X int gen; X int rev; X{ X char syspath[MAXNAMLEN]; X char *name = NIL; X char *type = NIL; X X Af_key key; X X char *ind; X char *ind2; X char *basename; X FILE *fp; X char fname[MAXNAMLEN]; X (void) strcpy(fname, filename); X X if ((ind = rindex(fname,'/')) == NIL) X { X (void) strcpy(syspath,curvpath[0]); X basename = fname; X } X else X { X ind[0] = '\0'; X ind++; X basename = ind; X (void) strcpy(syspath,fname); X } X X if ((ind2 = rindex(basename,'.')) == NIL) X { X name = basename; X } X else X { X ind2[0] = '\0'; X ind2++; X type = ind2; X name = basename; X } X if(af_getkey(syspath, name, type, gen, rev,NIL, &key) == -1) X return ((FILE *) NIL); X else X { X fp = af_open(&key, mode); X return (fp); X } X} X X Xget_set(anything,set) X char *anything; X Af_set *set; X { X XAf_attrs buf; X Xchar bname[MAXNAMLEN]; Xchar *p; Xchar *d; Xchar sysp[MAXNAMLEN]; X Xsysp[0] = '\0'; X X(void) strcpy(bname,anything); Xif ((p = rindex(bname,'.')) == NIL) X ; Xelse X { X p[0] = '\0'; X *p++; X } X Xif ((d = rindex(bname,'/')) != 0) X { X (void) strcpy(sysp, bname); X d = rindex(sysp, '/'); X d[0] = '\0'; X *d++; X (void) strcpy(bname,d); X } Xaf_initattrs(&buf); X X(void) strcpy(buf.af_name,bname); Xif (p != NIL) X (void) strcpy(buf.af_type,p); Xif(sysp[0] != '\0') X (void) strcpy(buf.af_syspath, sysp); Xelse X (void) strcpy(buf.af_syspath, curvpath[0]); Xif (af_find(&buf,set) == -1) X errexit(10,"af_find"); X} X X X XBool evtl_set_busy(dep, test) X char *dep; X Bool test; X{ X struct list *sellist; X FILE *tmp_fp; X FILE *afs_fp; X Af_attrs buf1; X Af_attrs buf2; X X Af_key key2; X Af_key keyt; X X Af_set set2; X Af_set sett; X X Bool t1; X Bool match = FALSE; X Bool full; X Bool has_attr = FALSE; X Bool busy_exist; X int ii = 0; X int tt = 0; X int uda = 0; X int pathind = 0; X char *pp; X char *ppp; X char *zzz; X char *pauth; X char dep2[MAXNAMLEN]; X char *testdep; X char testpath[MAXNAMLEN]; X char *testtype = NIL; X Af_attrs testbuf; X char *xxx; X int testi = 0; X int pathj; X Af_key testkey; X char *buf; X char tmpname[MAXNAMLEN]; X char afsname[MAXNAMLEN]; X char afslinkname[MAXNAMLEN]; X X (void) strcpy(afsname,dep); X stopflg = FALSE; X X af_initattrs(&buf1); X af_initattrs(&buf2); X (void) strcpy(dep2,dep); X X if (exists_file(dep2, 2)) X return(FALSE); X X t1 = exists_file(dep2,1); X if(t1) X { X if ((testdep = malloc(MAXNAMLEN)) == NIL) X errexit(10,"malloc"); X (void) strcpy(testdep,dep2); X if ((xxx = rindex(testdep,'/')) != NIL) X { X *xxx = '\0'; X (void) strcpy(testpath,testdep); X xxx++; X testdep = xxx; X } X else X (void) strcpy(testpath,actpath); X X if ((xxx = rindex(testdep,'.')) != NIL) X { X *xxx = '\0'; X xxx++; X testtype = xxx; X } X else X testtype = NIL; X X if(af_getkey(testpath, testdep, testtype, AF_BUSYVERS, AF_BUSYVERS, NIL, &testkey) == -1) X { X if(af_getkey(testpath, testdep, testtype, AF_LASTVERS, AF_LASTVERS, NIL, &testkey) == -1) X errexit(10,"af_getkey"); X } X if(af_gattrs(&testkey,&testbuf) == -1) X errexit(10,"af_gattrs"); X while(testbuf.af_udattrs[testi] != NIL) X { X if(!strncmp(testbuf.af_udattrs[testi],ATTRNAME,10)) X { X has_attr = TRUE; X break; X } X testi++; X } X X if((!has_attr) && (get_target(dep) == (struct rules *) NIL)) X { X append_mtime(&testbuf,depth); X if((af_dropkey(&testkey)) == -1) X errexit(10,"af_dropkey"); X free(testdep); X } X (void) strcpy(actpath, testpath); X if(has_attr) X { X if((af_dropkey(&testkey)) == -1) X errexit(10,"af_dropkey"); X free(testdep); X return(FALSE); X } X } X X if (t1) X { X /* dep name matches? */ X ii = 0; X while ((currule->predlist[ii] != (struct list *) NIL) && (match == FALSE)) X { X if((currule->predlist[ii]->selfunc(dep,currule->predlist[ii]->parv)) == TRUE) X { X match = TRUE; X if (match == FALSE) X ii++; X } X if (match == TRUE) X { X if(currule->predlist[ii]->i == SMILEY) X { X (void) tunix(NIL,NIL,(Af_set *) NIL); X } X if(currule->predlist[ii]->i == GRIMMY) X { X (void) stopit(NIL,NIL,(Af_set *) NIL); X } X X (void) strcpy(dollarplus, dep); X X if (index(dep,'/') == NIL) X { X if(strcmp(actpath,"")) X (void) strcpy(testpath,actpath); X else X (void) strcpy(testpath,curvpath[0]); X (void) strcat(testpath,"/"); X (void) strcat(testpath,dep); X get_set(testpath,&set2); X } X else X get_set(dep,&set2); X X if (set2.af_setlen == 0) X return(TRUE); X X /* generate buffer */ X af_initattrs(&buft); X /* insert unique attrs */ X X if (af_setgkey(&set2,0, &key2) == -1) X errexit(10,"af_setgkey"); X X if (af_dropset(&set2) == -1) X errexit(10,"af_dropset"); X X if (af_gattrs(&key2,&buf2) == -1) X errexit(10,"af_gattrs"); X X (void) strcpy(buft.af_name,buf2.af_name); X (void) strcpy(buft.af_type,buf2.af_type); X (void) strcpy(buft.af_syspath,buf2.af_syspath); X sellist = currule->predlist[ii]; X while (sellist != (struct list *) NIL) X { X if((sellist->i == 0) && (test)) X sellist->selfunc(sellist->parn,sellist->parv, (Af_set *) NIL); X sellist = sellist->cont; X } X sellist = currule->predlist[ii]; X while (sellist != (struct list *) NIL) X { X tt = get_attr_type(sellist->parn); X if (sellist->i == 1) X { X switch (tt) X { X case 0: X buft.af_gen = atoi(sellist->parv); X break; X case 1: X buft.af_rev = atoi(sellist->parv); X break; X case 2: X buft.af_state = (short) get_state_no(sellist->parv); X if (buft.af_state == 99) X errexit(16, sellist->parv); X break; X case 3: X (void) strcpy(buft.af_author.af_username,sellist->parv); X if ((pauth = index(buft.af_author.af_username,'@')) != NIL) X { X *pauth = '\0'; X pauth++; X (void) strcpy(buft.af_author.af_userhost, pauth); X } X break; X case 4: X errexit(10,"group id"); X break; X case 5: X if ((ppp = malloc((unsigned) (strlen(sellist->parv) + 1))) == NIL) X errexit(10,"malloc"); X (void) strcpy(ppp,sellist->parv); X if (( pp = index(ppp,'.')) == 0) X errexit(9,sellist->parv); X else X { X pp[0] = '\0'; X buft.af_gen = atoi(ppp); X pp++; X buft.af_rev = atoi(pp); X } X break; X case 6: X /* variant */ X break; /* evtl. set path & flags ???? */ X case 7: X (void) strcpy(buft.af_syspath,sellist->parv); X break; X case 8: X (void) strcpy(buft.af_host,sellist->parv); X break; X default: X if ((buft.af_udattrs[uda] = X malloc((unsigned) (strlen(sellist->parv) + 1 + strlen(sellist->parn) + 1 + 1))) == NIL) X errexit(10,"malloc"); X (void) strcpy(buft.af_udattrs[uda],sellist->parn); X (void) strcat(buft.af_udattrs[uda],"="); X (void) strcat(buft.af_udattrs[uda],sellist->parv); X uda++; X break; X } X } X/* else part by Sibylle */ X else X { X if ((sellist->i == 2) && (tt > 5)) X /* if sellist->selfunc is attrnot, attrlt, attrgt, */ X /* attrle, attrge, attrmax or attrmin and parameter */ X /* type is uda then it's more efficient to perform */ X /* af_find on said uda. Hence parn is copied to buft. */ X { X if ((buft.af_udattrs[uda] = X malloc((unsigned) (strlen(sellist->parn) + 1))) == NIL) X errexit(10,"malloc"); X (void) strcpy(buft.af_udattrs[uda],sellist->parn); X uda++; X break; X } X } X X sellist = sellist->cont; X } X /* af_find with this buffer */ X X pathj = pathi; X while(curvpath[pathj] == NIL) X pathj--; X X for(pathind = pathj; pathind >= 0; pathind--) X { X if ((zzz = rindex(dep,'/')) == NIL) X { X (void) strcpy(buft.af_syspath,curvpath[pathind]); X } X else X { X (void) strcpy(buft.af_syspath,dep); X zzz = rindex(buft.af_syspath,'/'); X *zzz = '\0'; X } X if (af_find(&buft,&sett) == -1) X errexit(10,"af_find"); X if (sett.af_nkeys != 0) X { X sellist = currule->predlist[ii]; X full = TRUE; X while((sellist != (struct list *) NIL) && (full)) X { X if (sellist->i == 2) X { X full = sellist->selfunc(sellist->parn, sellist->parv, &sett); X } X sellist = sellist->cont; X } X } X if (sett.af_nkeys == 1) X { X /* ==> successful */ X if (test == FALSE) X return(TRUE); X if (af_setgkey(&sett,0,&keyt) == -1) X errexit(10,"af_setgkey"); X if(af_gattrs(&keyt,&buft) == -1) X errexit(10,"af_gattrs"); X if(confid == TRUE) X write_confid(&buft); X X append_attrs(&buft,depth); X X if ((buft.af_state != AF_BUSY ) || (expflg)) X { X /* link, unlink, set busy */ X if ((afs_fp = af_open(&keyt,"r")) == NULL) X errexit(10,"af_open"); X X /* creation of a temporary file for the old revision */ X (void) strcpy(tmpname,mktemp("shapeXXXXXX")); X if ((tmp_fp = fopen(tmpname, "w")) == NULL) X errexit(10,"could not create tmpfile"); X X /* copy old revision into temp. file */ X if ((buf = malloc((unsigned) buft.af_size)) == NIL) X errexit(10,"malloc"); X (void) fread(buf,sizeof(char),(int) buft.af_size,afs_fp); X X if(noexpflg) X (void) fwrite(buf,sizeof(char),(int) buft.af_size,tmp_fp); X else X WriteXPand(buf,buft.af_size,tmp_fp,&keyt); X free(buf); X af_close(afs_fp); X (void) fclose(tmp_fp); X if (buft.af_syspath == NIL) X { X (void) strcpy(afsname,curvpath[0]); X (void) strcat(afsname,"/"); X } X else X { X (void) strcpy(afsname,buft.af_syspath); X (void) strcat(afsname,"/"); X } X (void) strcat(afsname,buft.af_name); X (void) strcat(afsname,"."); X (void) strcat(afsname,buft.af_type); X if(buft.af_syspath == NIL) X { X (void) strcpy(afslinkname,curvpath[0]); X (void) strcat(afslinkname,"/AFS/"); X } X else X { X (void) strcpy(afslinkname,buft.af_syspath); X (void) strcat(afslinkname,"/AFS/"); X } X (void) strcat(afslinkname,buft.af_name); X (void) strcat(afslinkname,"."); X (void) strcat(afslinkname,buft.af_type); X (void) strcat(afslinkname,"XXXXXX"); X (void) strcpy(afslinkname, mktemp(afslinkname)); X X /* save busy version into AFS directory */ X (void) link(afsname,afsname); X if (errno == EEXIST) X { X busy_exist = TRUE; X if (link(afsname,afslinkname) != 0) X errexit(20, dep); X if (unlink(afsname) != 0) X errexit(21, afsname); X } X else X busy_exist = FALSE; X if (link(tmpname,afsname) != 0) X errexit(22, afsname); X if (unlink(tmpname) != 0) X errexit(21, tmpname); X register_link(afsname,afslinkname,busy_exist); X if (buft.af_state != AF_BUSY) X busy_done = TRUE; X return (TRUE); X } X else X return(TRUE); X } X } X if ((sett.af_nkeys == 0) && (currule->predlist[ii+1] == (struct list *) NIL) && (!tunixflg)) X { X if ((get_target(dep2)) != (struct rules *) NIL) X return(TRUE); X else X errexit(17,dep2); X } X else X /* next predicate */ X { X if (stopflg) X errexit(28,dep); X if(tunixflg) X { X tunixflg = FALSE; X return(FALSE); X } X if (af_dropset(&sett) == -1) X errexit(10,"af_dropset"); X X } X } X ii++; X stopflg = FALSE; X match = FALSE; X reset_vclass(); X } /* end while */ X X/* if (buft.af_syspath != NIL) X { X (void) strcpy(afsname,buft.af_syspath); X (void) strcat(afsname,"/"); X (void) strcat(afsname,dep); X } X (void) link(afsname,afsname); X if ((buft.af_state == AF_BUSY) && (errno == EEXIST)) X return(TRUE); X*/ X if ((match == FALSE) && (currule->predlist[ii] == (struct list *) NIL)) X { X if ((get_target(dep)) != (struct rules *) NIL) X return(TRUE); X else X errexit(17,dep); X } X } X /*NOTREACHED*/ X return(FALSE); X} X X X Xint init_confid(name) X char *name; X{ X fprintf(cid,"###### CONFID for %s ######\n", name); X fprintf(cid,"\n"); X fprintf(cid,"#%% RULE-SECTION\n"); X fprintf(cid,"@%s:\n", name); X} X X X Xint write_confid(buf) X Af_attrs *buf; X{ X fprintf(cid,"\t%s.%s,\n", buf->af_name, buf->af_type); X X fprintf(cid,"\tattr(host,%s),\n", buf->af_host); X X fprintf(cid,"\tattr(syspath,%s),\n", buf->af_syspath); X X/* fprintf(cid,"\tattr(type,%s),\n", buf->af_type); */ X X if(buf->af_gen != AF_BUSYVERS) X { X fprintf(cid,"\tattr(generation,%d),\n", buf->af_gen); X X fprintf(cid,"\tattr(revision,%d),\n", buf->af_rev); X } X X if (strcmp(buf->af_variant,"")) X fprintf(cid,"\tattr(variant,%s),\n", buf->af_variant); X X if (buf->af_state != AF_FROZEN) X { X fprintf(cid,"\tmsg(warning: confid contains %s version for %s.%s),\n", X states[buf->af_state], buf->af_name, buf->af_type); X fprintf(stderr,"shape - warning: confid contains %s version for %s.%s\n", X states[buf->af_state], buf->af_name, buf->af_type); X } X X fprintf(cid,"\tattr(state,%s),\n", states[buf->af_state]); X/* fprintf(cid,"\tattr(owner,%s@%s),\n", X buf->af_owner.af_username, buf->af_owner.af_userhost); */ X X fprintf(cid,"\tattr(author,%s@%s)", X buf->af_author.af_username, buf->af_author.af_userhost); X X/* fprintf(cid,"\tattr(size,%d),\n", buf->af_size); */ X X/* fprintf(cid,"\tattr(mode,%d),\n", buf->af_mode); */ X X/* if(strcmp(buf->af_locker.af_username,"")) X fprintf(cid,"\tattr(locker,%s@%s),\n", X buf->af_locker.af_username, buf->af_locker.af_userhost); */ X X/* fprintf(cid,"\tattr(mtime,%d),\n", buf->af_mtime); */ X X/* fprintf(cid,"\tattr(atime,%d),\n", buf->af_atime); */ X X/* fprintf(cid,"\tattr(ctime,%d),\n", buf->af_ctime); */ X X/* fprintf(cid,"\tattr(stime,%d),\n", buf->af_stime); */ X X/* fprintf(cid,"\tattr(ltime,%d)", buf->af_ltime); */ X X fprintf(cid,";\n"); X X fprintf(cid,"\n"); X (void) fflush(cid); X} X Xint finish_confid() X X{ X fprintf(cid,"\t:-\) SMILEY,\n\tmsg\(\"Just to get a . to the end of the rule\"\).\n\n"); X fprintf(cid,"#%% END-RULE-SECTION\n"); X fprintf(cid,"\n"); X dump(cid); X ruledump(cid); X vardump(cid); X} X X XFILE *cmfopen( filename, mode, gen,rev) X char *filename; X char *mode; X /*ARGSUSED*/ X int gen; X int rev; X{ X char syspath[MAXNAMLEN]; X char *name = NIL; X char *type = NIL; X X Af_key key; X X char *ind; X char *ind2; X char *basename; X FILE *fp; X char fname[MAXNAMLEN]; X (void) strcpy(fname, filename); X X if ((ind = rindex(fname,'/')) == NIL) X { X (void) strcpy(syspath,curvpath[0]); X basename = fname; X } X else X { X ind[0] = '\0'; X ind++; X basename = ind; X (void) strcpy(syspath,fname); X } X X if ((ind2 = rindex(basename,'.')) == NIL) X { X name = basename; X } X else X { X ind2[0] = '\0'; X ind2++; X type = ind2; X name = basename; X } X if(af_crkey(syspath, name, type,&key) == -1) X errexit(10,"af_crkey"); X else X { X fp = af_open(&key, mode); X return (fp); X } X return((FILE *) NIL); X} END_OF_FILE if test 27004 -ne `wc -c <'src/shape/files.c'`; then echo shar: \"'src/shape/files.c'\" unpacked with wrong size! fi # end of 'src/shape/files.c' fi echo shar: End of archive 24 \(of 33\). cp /dev/null ark24isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 33 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.