/********************************************************************** * Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. * * All Rights Reserved. * * Reference "/usr/src/COPYRIGHT" for applicable restrictions. * **********************************************************************/ # include "../hdr/defines.h" # include "../hdr/had.h" static char Sccsid[] = "@(#)get.c 3.0 4/22/86"; USXALLOC(); int Debug = 0; int had_pfile; struct packet gpkt; struct sid sid = { 0,-1,0,0, }; unsigned Ser; int num_files; char had[26]; char Pfilename[FILESIZE]; char *ilist, *elist, *lfile; long cutoff = 0X7FFFFFFFL; /* max positive long */ int verbosity; char Gfile[16]; char *Type; int Did_id; main(argc,argv) int argc; register char *argv[]; { register int i; register char *p; char c; int testmore; extern int Fcnt; extern get(); Fflags = FTLEXIT | FTLMSG | FTLCLN; for(i=1; i<argc; i++) if(argv[i][0] == '-' && (c=argv[i][1])) { p = &argv[i][2]; testmore = 0; switch (c) { case 'a': if (!p[0]) { argv[i] = 0; continue; } Ser = patoi(p); break; case 'r': if (!p[0]) { argv[i] = 0; continue; } chksid(sid_ab(p,&sid),&sid); if ((sid.s_rel < MINR) || (sid.s_rel > MAXR)) fatal("r out of range (ge22)"); break; case 'c': if (!p[0]) { argv[i] = 0; continue; } if (date_ab(p,&cutoff)) fatal("bad date/time (cm5)"); break; case 'l': lfile = p; break; case 'i': if (!p[0]) { argv[i] = 0; continue; } ilist = p; break; case 'x': if (!p[0]) { argv[i] = 0; continue; } elist = p; break; case 'b': case 'g': case 'e': case 'p': case 'k': case 'm': case 'n': case 's': case 't': testmore++; break; default: fatal("unknown key letter (cm1)"); } if (testmore) { testmore = 0; if (*p) { sprintf(Error, "value after %c arg (cm8)",c); fatal(Error); } } if (had[c - 'a']++) fatal("key letter twice (cm2)"); argv[i] = 0; } else num_files++; if(num_files == 0) fatal("missing file arg (cm3)"); if (HADE && HADM) fatal("e not allowed with m (ge3)"); if (HADE) HADK = 1; if (!HADS) verbosity = -1; if (HADE && ! logname()) fatal("User ID not in password file (cm9)"); setsig(); Fflags &= ~FTLEXIT; Fflags |= FTLJMP; for (i=1; i<argc; i++) if (p=argv[i]) do_file(p,get); exit(Fcnt ? 1 : 0); } extern char *Sflags[]; get(file) { register char *p; register unsigned ser; extern char had_dir, had_standinp; struct stats stats; char str[32]; int l_rel; int i,status; Fflags |= FTLMSG; if (setjmp(Fjmp)) return; if (HADE) { had_pfile = 1; /* call `sinit' to check if file is an SCCS file but don't open the SCCS file. If it is, then create lock file. */ sinit(&gpkt,file,0); if (lockit(auxf(file,'z'),10,getpid())) fatal("cannot create lock file (cm4)"); } /* Open SCCS file and initialize packet */ sinit(&gpkt,file,1); gpkt.p_ixuser = (HADI | HADX); gpkt.p_reqsid.s_rel = sid.s_rel; gpkt.p_reqsid.s_lev = sid.s_lev; gpkt.p_reqsid.s_br = sid.s_br; gpkt.p_reqsid.s_seq = sid.s_seq; gpkt.p_verbose = verbosity; gpkt.p_stdout = (HADP ? stderr : stdout); gpkt.p_cutoff = cutoff; gpkt.p_lfile = lfile; copy(auxf(gpkt.p_file,'g'),Gfile); if (gpkt.p_verbose && (num_files > 1 || had_dir || had_standinp)) fprintf(gpkt.p_stdout,"\n%s:\n",gpkt.p_file); if (dodelt(&gpkt,&stats,0,0) == 0) fmterr(&gpkt); finduser(&gpkt); doflags(&gpkt); if (!HADA) ser = getser(&gpkt); else { if ((ser = Ser) > maxser(&gpkt)) fatal("serial number too large (ge19)"); move(&gpkt.p_idel[ser].i_sid, &gpkt.p_gotsid, sizeof(sid)); if (HADR && sid.s_rel != gpkt.p_gotsid.s_rel) { zero(&gpkt.p_reqsid, sizeof(gpkt.p_reqsid)); gpkt.p_reqsid.s_rel = sid.s_rel; } else move(&gpkt.p_gotsid, &gpkt.p_reqsid, sizeof(sid)); } doie(&gpkt,ilist,elist,0); setup(&gpkt,ser); if (!(Type = Sflags[TYPEFLAG - 'a'])) Type = Null; if (!(HADP || HADG)) if (exists(Gfile) && (S_IWRITE & Statbuf.st_mode)) { sprintf(Error,"writable `%s' exists (ge4)",Gfile); fatal(Error); } if (gpkt.p_verbose) { sid_ba(&gpkt.p_gotsid,str); fprintf(gpkt.p_stdout,"%s\n",str); } if (HADE) { if (HADC || gpkt.p_reqsid.s_rel == 0) move(&gpkt.p_gotsid, &gpkt.p_reqsid, sizeof(sid)); newsid(&gpkt,Sflags[BRCHFLAG - 'a'] && HADB); permiss(&gpkt); if (exists(auxf(&gpkt.p_file,'p'))) mk_qfile(&gpkt); else had_pfile = 0; wrtpfile(&gpkt,ilist,elist); } if (HADG) { fclose(gpkt.p_iop); } else { if (gpkt.p_stdout) fflush(gpkt.p_stdout); if ((i = fork()) < 0) fatal("cannot fork, try again"); if (i == 0) { Fflags |= FTLEXIT; Fflags &= ~FTLJMP; setuid(getuid()); if (HADL) gen_lfile(&gpkt); flushto(&gpkt,EUSERTXT,1); idsetup(&gpkt); gpkt.p_chkeof = 1; Did_id = 0; /* call `xcreate' which deletes the old `g-file' and creates a new one except if the `p' keyletter is set in which case any old `g-file' is not disturbed. The mod of the file depends on whether or not the `k' keyletter has been set. */ if (gpkt.p_gout == 0) { if (HADP) gpkt.p_gout = stdout; else gpkt.p_gout = xfcreat(Gfile,HADK ? 0644 : 0444); } while(readmod(&gpkt)) { prfx(&gpkt); p = idsubst(&gpkt,gpkt.p_line); fputs(p,gpkt.p_gout); } if (gpkt.p_gout) fflush(gpkt.p_gout); if (gpkt.p_gout && gpkt.p_gout != stdout) fclose(gpkt.p_gout); if (gpkt.p_verbose) fprintf(gpkt.p_stdout,"%u lines\n",gpkt.p_glnno); if (!Did_id && !HADK) if (Sflags[IDFLAG - 'a']) fatal("no id keywords (cm6)"); else if (gpkt.p_verbose) printf("No id keywords (cm7)\n"); exit(0); } else { wait(&status); if (status) { Fflags &= ~FTLMSG; fatal(); } } } if (gpkt.p_iop) fclose(gpkt.p_iop); /* remove 'q'-file because it is no longer needed */ unlink(auxf(&gpkt.p_file,'q')); xfreeall(); unlockit(auxf(gpkt.p_file,'z'),getpid()); /* * Prompt for dot.why comments unless environment "SCCSWHY=off" */ if ((HADE) && (!had_dir)) { if (((p=getenv("SCCSWHY")) == NULL) || (((p=getenv("SCCSWHY")) != NULL) && (strcmp(p,"off") != 0))) dodotwhy(); } } /* * If the file is being edited with "get -e" or "edit", * prompt for a line or two for inclusion in 'file.why' * so we know who currently has it checked out and why. * --John Dustin 11/12/84 */ dodotwhy() { #include <signal.h> extern char had_dir; extern int errno; int cc, done, gotit, whyfd; char *user; char *termname; char *date; char whyfile[FILESIZE]; char whytmp[FILESIZE]; char whybuff[BUFSIZ]; struct stat sb; /* * Up to 10-character file names will work, * otherwise, prompt for a why-file name. */ signal(SIGINT, SIG_IGN); if (strlen(Gfile) > 10) { printf("Cannot create '%s.why' (why-file name too long).\n",Gfile); printf("Press <CTRL/D> to cancel, or <RETURN> to use default name.\n"); /* * Loop forever, until something reasonable is * entered or the user enters <CR> alone on a line, * or a <CTRL/D> (end of file). */ for (;;) { printf("\nEnter an alternate why-file name"); /* printf(" (ie: %.10s",Gfile); if (Gfile[9] != '.') printf("."); printf("why): "); */ /* * Set up whytmp with the suggested default why-name */ sprintf(whytmp, "%.10s", Gfile); if (whytmp[9] != '.') strcat(whytmp, "."); strcat(whytmp, "why"); printf(" < %s >: ", whytmp); if (fgets(whybuff, 132, stdin) != NULL) { if (strlen(whybuff) > 1) { /* get rid of '\n' in whybuff */ whybuff[strlen(whybuff)-1] = '\0'; if (strlen(whybuff) > 14) { printf("\nPlease use a shorter file name (14 characters or less).\n"); continue; } if (stat(whybuff, &sb) < 0) { ; /* OK */ } else { printf("\n'%s' file already exists, try something else.\n", whybuff); continue; } } else { /* * entered a <CR> only, just * use constructed why-file name. */ strcpy(whybuff, whytmp); if (stat(whybuff, &sb) < 0) { ; /* OK */ } else { printf("\n'%s' file already exists, try something else.\n", whybuff); continue; } } } else { /* CTRL/D entered */ printf("\nNo why-file created.\n"); return(1); } /* * Use the name which the user entered. * filename already has the ".why" extension */ strcpy(whyfile, whybuff); printf("\n"); break; } /* end for(;;) */ } else { strcpy(whyfile,Gfile); strcat(whyfile,".why\0"); } if ((whyfd = creat(whyfile,0644)) < 0) { printf("cannot create %s (errno=%d)\n",whyfile,errno); printf("No why-file created!\n"); return(1); } if (stat(Gfile, &sb) < 0) { /* should never fail... */ printf("\ncannot stat %s (errno=%d)\n",Gfile, errno); return(1); } if ((chown(whyfile, sb.st_uid, sb.st_gid)) < 0) { printf("cannot chown %s to uid=%d, gid=%d (errno=%d)\n",whyfile,sb.st_uid,sb.st_gid,errno); } if ((chmod(whyfile, 0644)) < 0) { printf("cannot chmod %s to 0644 (errno=%d)\n",whyfile,errno); } /* * whybuff is initially set up with one line * of user information: name, tty, and date */ if ((user = getlogin()) == NULL) strcpy(whybuff,"???"); else strcpy(whybuff, user); strcat(whybuff, " "); if ((termname = ttyname(0)) == NULL) strcat(whybuff,"/dev/tty??"); else strcat(whybuff, termname); strcat(whybuff, " "); /* * 'date' is the create time of the why-file */ stat(whyfile, &sb); date = '\0'; date = ctime(&sb.st_ctime); strcat(whybuff, date); strcat(whybuff, "\n\0"); cc = strlen(whybuff); if (write(whyfd, whybuff, cc) != cc) { printf("\ncannot write to %s (errno=%d)\n",whyfile, errno); close(whyfd); return(1); } printf("Comments for '%s' ? (CTRL/D when complete):\n", whyfile); cc=done=gotit=0; do { if (fgets(whybuff, 132, stdin) != NULL) { if (strlen(whybuff) > 1) gotit++; } else { /* CTRL/D */ if (gotit) done++; else printf("\ncomments? "); continue; } if ((whybuff[0] == '.') && (whybuff[1] == '\n')) { if (gotit) { whybuff[0]='\0'; done++; } } /* * write a line at a time to the whyfile */ if ((cc = strlen(whybuff)) > 0) { if (write(whyfd,whybuff,cc) != cc) { printf("%s: write error (errno=%d)\n", whyfile,errno); done++; } } } while (! done); close(whyfd); signal(SIGINT, SIG_DFL); } newsid(pkt,branch) register struct packet *pkt; int branch; { int chkbr; chkbr = 0; /* if branch value is 0 set newsid level to 1 */ if (pkt->p_reqsid.s_br == 0) { pkt->p_reqsid.s_lev += 1; /* if the sid requested has been deltaed or the branch flag was set or the requested SID exists in the p-file then create a branch delta off of the gotten SID */ if (sidtoser(&pkt->p_reqsid,pkt) || pkt->p_maxr > pkt->p_reqsid.s_rel || branch || in_pfile(&pkt->p_reqsid,pkt)) { pkt->p_reqsid.s_rel = pkt->p_gotsid.s_rel; pkt->p_reqsid.s_lev = pkt->p_gotsid.s_lev; pkt->p_reqsid.s_br = pkt->p_gotsid.s_br + 1; pkt->p_reqsid.s_seq = 1; chkbr++; } } /* if a three component SID was given as the -r argument value and the b flag is not set then up the gotten SID sequence number by 1 */ else if (pkt->p_reqsid.s_seq == 0 && !branch) pkt->p_reqsid.s_seq = pkt->p_gotsid.s_seq + 1; else { /* if sequence number is non-zero then increment the requested SID sequence number by 1 */ pkt->p_reqsid.s_seq += 1; if (branch || sidtoser(&pkt->p_reqsid,pkt) || in_pfile(&pkt->p_reqsid,pkt)) { pkt->p_reqsid.s_br += 1; pkt->p_reqsid.s_seq = 1; chkbr++; } } /* keep checking the requested SID until a good SID to be made is calculated or all possibilities have been tried */ while (chkbr) { --chkbr; while (in_pfile(&pkt->p_reqsid,pkt)) { pkt->p_reqsid.s_br += 1; ++chkbr; } while (sidtoser(&pkt->p_reqsid,pkt)) { pkt->p_reqsid.s_br += 1; ++chkbr; } } if (sidtoser(&pkt->p_reqsid,pkt) || in_pfile(&pkt->p_reqsid,pkt)) fatal("bad SID calculated in newsid()"); } enter(pkt,ch,n,sidp) struct packet *pkt; char ch; int n; struct sid *sidp; { char str[32]; register struct apply *ap; sid_ba(sidp,str); if (pkt->p_verbose) fprintf(pkt->p_stdout,"%s\n",str); ap = &pkt->p_apply[n]; switch(ap->a_code) { case EMPTY: if (ch == INCLUDE) condset(ap,APPLY,INCLUSER); else condset(ap,NOAPPLY,EXCLUSER); break; case APPLY: sid_ba(sidp,str); sprintf(Error,"%s already included (ge9)",str); fatal(Error); break; case NOAPPLY: sid_ba(sidp,str); sprintf(Error,"%s already excluded (ge10)",str); fatal(Error); break; default: fatal("internal error in get/enter() (ge11)"); break; } } gen_lfile(pkt) register struct packet *pkt; { int n; int reason; char str[32]; char line[BUFSIZ]; struct deltab dt; FILE *in; FILE *out; in = xfopen(pkt->p_file,0); if (*pkt->p_lfile) out = stdout; else out = xfcreat(auxf(pkt->p_file,'l'),0444); fgets(line,sizeof(line),in); while (fgets(line,sizeof(line),in) != NULL && line[0] == CTLCHAR && line[1] == STATS) { fgets(line,sizeof(line),in); del_ab(line,&dt); if (dt.d_type == 'D') { reason = pkt->p_apply[dt.d_serial].a_reason; if (pkt->p_apply[dt.d_serial].a_code == APPLY) { putc(' ',out); putc(' ',out); } else { putc('*',out); if (reason & IGNR) putc(' ',out); else putc('*',out); } switch (reason & (INCL | EXCL | CUTOFF)) { case INCL: putc('I',out); break; case EXCL: putc('X',out); break; case CUTOFF: putc('C',out); break; default: putc(' ',out); break; } putc(' ',out); sid_ba(&dt.d_sid,str); fprintf(out,"%s\t",str); date_ba(&dt.d_datetime,str); fprintf(out,"%s %s\n",str,dt.d_pgmr); } while ((n = fgets(line,sizeof(line),in)) != NULL) if (line[0] != CTLCHAR) break; else { switch (line[1]) { case EDELTAB: break; default: continue; case MRNUM: case COMMENTS: if (dt.d_type == 'D') fprintf(out,"\t%s",&line[3]); continue; } break; } if (n == NULL || line[0] != CTLCHAR) break; putc('\n',out); } fclose(in); if (out != stdout) fclose(out); } char Curdate[18]; char *Curtime; char Gdate[9]; char Chgdate[18]; char *Chgtime; char Gchgdate[9]; char Sid[32]; char Mod[16]; char Olddir[BUFSIZ]; char Pname[BUFSIZ]; char Dir[BUFSIZ]; char *Qsect; idsetup(pkt) register struct packet *pkt; { extern long Timenow; register int n; register char *p; date_ba(&Timenow,Curdate); Curtime = &Curdate[9]; Curdate[8] = 0; makgdate(Curdate,Gdate); for (n = maxser(pkt); n; n--) if (pkt->p_apply[n].a_code == APPLY) break; if (n) date_ba(&pkt->p_idel[n].i_datetime,Chgdate); Chgtime = &Chgdate[9]; Chgdate[8] = 0; makgdate(Chgdate,Gchgdate); sid_ba(&pkt->p_gotsid,Sid); if (p = Sflags[MODFLAG - 'a']) copy(p,Mod); else copy(Gfile,Mod); if (!(Qsect = Sflags[QSECTFLAG - 'a'])) Qsect = Null; } makgdate(old,new) register char *old, *new; { if ((*new = old[3]) != '0') new++; *new++ = old[4]; *new++ = '/'; if ((*new = old[6]) != '0') new++; *new++ = old[7]; *new++ = '/'; *new++ = old[0]; *new++ = old[1]; *new = 0; } static char Zkeywd[5] = "@(#)"; idsubst(pkt,line) register struct packet *pkt; char line[]; { static char tline[BUFSIZ]; static char str[32]; register char *lp, *tp; extern char *Type; extern char *Sflags[]; if (HADK || !any('%',line)) return(line); tp = tline; for(lp=line; *lp != 0; lp++) { if(lp[0] == '%' && lp[1] != 0 && lp[2] == '%') { switch(*++lp) { case 'M': tp = trans(tp,Mod); break; case 'Q': tp = trans(tp,Qsect); break; case 'R': sprintf(str,"%u",pkt->p_gotsid.s_rel); tp = trans(tp,str); break; case 'L': sprintf(str,"%u",pkt->p_gotsid.s_lev); tp = trans(tp,str); break; case 'B': sprintf(str,"%u",pkt->p_gotsid.s_br); tp = trans(tp,str); break; case 'S': sprintf(str,"%u",pkt->p_gotsid.s_seq); tp = trans(tp,str); break; case 'D': tp = trans(tp,Curdate); break; case 'H': tp = trans(tp,Gdate); break; case 'T': tp = trans(tp,Curtime); break; case 'E': tp = trans(tp,Chgdate); break; case 'G': tp = trans(tp,Gchgdate); break; case 'U': tp = trans(tp,Chgtime); break; case 'Z': tp = trans(tp,Zkeywd); break; case 'Y': tp = trans(tp,Type); break; case 'W': tp = trans(tp,Zkeywd); tp = trans(tp,Mod); *tp++ = '\t'; case 'I': tp = trans(tp,Sid); break; case 'P': copy(pkt->p_file,Dir); dname(Dir); if(curdir(Olddir) != 0) fatal("curdir failed (ge20)"); if(chdir(Dir) != 0) fatal("cannot change directory (ge21)"); if(curdir(Pname) != 0) fatal("curdir failed (ge20)"); if(chdir(Olddir) != 0) fatal("cannot change directory (ge21)"); tp = trans(tp,Pname); *tp++ = '/'; tp = trans(tp,(sname(pkt->p_file))); break; case 'F': tp = trans(tp,pkt->p_file); break; case 'C': sprintf(str,"%u",pkt->p_glnno); tp = trans(tp,str); break; case 'A': tp = trans(tp,Zkeywd); tp = trans(tp,Type); *tp++ = ' '; tp = trans(tp,Mod); *tp++ = ' '; tp = trans(tp,Sid); tp = trans(tp,Zkeywd); break; default: *tp++ = '%'; *tp++ = *lp; continue; } lp++; } else *tp++ = *lp; } *tp = 0; return(tline); } trans(tp,str) register char *tp, *str; { Did_id = 1; while(*tp++ = *str++) ; return(tp-1); } prfx(pkt) register struct packet *pkt; { char str[32]; if (HADN) fprintf(pkt->p_gout,"%s\t",Mod); if (HADM) { sid_ba(&pkt->p_inssid,str); fprintf(pkt->p_gout,"%s\t",str); } } clean_up(n) { /* clean_up is only called from fatal() upon bad termination. */ if (gpkt.p_iop) fclose(gpkt.p_iop); if (gpkt.p_gout) { fflush(gpkt.p_gout); if (gpkt.p_gout != stdout) { fclose(gpkt.p_gout); unlink(Gfile); } } if (HADE) { if (! had_pfile) { unlink(auxf(&gpkt.p_file,'p')); } else if (exists(auxf(&gpkt.p_file,'q'))) { copy(auxf(&gpkt.p_file,'p'),Pfilename); rename(auxf(&gpkt.p_file,'q'),Pfilename); } } xfreeall(); unlockit(auxf(gpkt.p_file,'z'),getpid()); } static char warn[] = "WARNING: being edited: `%s' (ge18)\n"; wrtpfile(pkt,inc,exc) register struct packet *pkt; char *inc, *exc; { char line[64], str1[32], str2[32]; char *user; FILE *in, *out; struct pfile pf; register char *p; int fd; int i; extern long Timenow; user = logname(); if (exists(p = auxf(pkt->p_file,'p'))) { fd = xopen(p,2); in = fdfopen(fd,0); while (fgets(line,sizeof(line),in) != NULL) { p = line; p[length(p) - 1] = 0; pf_ab(p,&pf,0); if (!(Sflags[JOINTFLAG - 'a'])) { if ((pf.pf_gsid.s_rel == pkt->p_gotsid.s_rel && pf.pf_gsid.s_lev == pkt->p_gotsid.s_lev && pf.pf_gsid.s_br == pkt->p_gotsid.s_br && pf.pf_gsid.s_seq == pkt->p_gotsid.s_seq) || (pf.pf_nsid.s_rel == pkt->p_reqsid.s_rel && pf.pf_nsid.s_lev == pkt->p_reqsid.s_lev && pf.pf_nsid.s_br == pkt->p_reqsid.s_br && pf.pf_nsid.s_seq == pkt->p_reqsid.s_seq)) { fclose(in); sprintf(Error, "being edited: `%s' (ge17)",line); fatal(Error); } if (!equal(pf.pf_user,user)) fprintf(stderr,warn,line); } else fprintf(stderr,warn,line); } out = fdfopen(dup(fd),1); fclose(in); } else out = xfcreat(p,0644); fseek(out,0L,2); sid_ba(&pkt->p_gotsid,str1); sid_ba(&pkt->p_reqsid,str2); date_ba(&Timenow,line); fprintf(out,"%s %s %s %s",str1,str2,user,line); if (inc) fprintf(out," -i%s",inc); if (exc) fprintf(out," -x%s",exc); fprintf(out,"\n"); fclose(out); if (pkt->p_verbose) fprintf(pkt->p_stdout,"new delta %s\n",str2); } getser(pkt) register struct packet *pkt; { register struct idel *rdp; int n, ser, def; char *p; extern char *Sflags[]; def = 0; if (pkt->p_reqsid.s_rel == 0) { if (p = Sflags[DEFTFLAG - 'a']) chksid(sid_ab(p, &pkt->p_reqsid), &pkt->p_reqsid); else { pkt->p_reqsid.s_rel = MAX; def = 1; } } ser = 0; if (pkt->p_reqsid.s_lev == -1) { for (n = maxser(pkt); n; n--) { rdp = &pkt->p_idel[n]; if ((rdp->i_sid.s_br == 0 || HADT) && pkt->p_reqsid.s_rel >= rdp->i_sid.s_rel && rdp->i_sid.s_rel > pkt->p_gotsid.s_rel) { ser = n; pkt->p_gotsid.s_rel = rdp->i_sid.s_rel; } } } /* * If had '-t' keyletter and R.L SID type, find * the youngest SID */ else if ((pkt->p_reqsid.s_br == 0) && HADT) { for (n = maxser(pkt); n; n--) { rdp = &pkt->p_idel[n]; if (rdp->i_sid.s_rel == pkt->p_reqsid.s_rel && rdp->i_sid.s_lev == pkt->p_reqsid.s_lev ) break; } ser = n; } else if (pkt->p_reqsid.s_br && pkt->p_reqsid.s_seq == 0) { for (n = maxser(pkt); n; n--) { rdp = &pkt->p_idel[n]; if (rdp->i_sid.s_rel == pkt->p_reqsid.s_rel && rdp->i_sid.s_lev == pkt->p_reqsid.s_lev && rdp->i_sid.s_br == pkt->p_reqsid.s_br) break; } ser = n; } else { ser = sidtoser(&pkt->p_reqsid,pkt); } if (ser == 0) fatal("nonexistent sid (ge5)"); rdp = &pkt->p_idel[ser]; move(&rdp->i_sid, &pkt->p_gotsid, sizeof(pkt->p_gotsid)); if (def || (pkt->p_reqsid.s_lev == 0 && pkt->p_reqsid.s_rel == pkt->p_gotsid.s_rel)) move(&pkt->p_gotsid, &pkt->p_reqsid, sizeof(pkt->p_gotsid)); return(ser); } /* Null routine to satisfy external reference from dodelt() */ escdodelt() { } in_pfile(sp,pkt) struct sid *sp; struct packet *pkt; { struct pfile pf; char line[BUFSIZ]; char *p; FILE *in; if (Sflags[JOINTFLAG - 'a']) { if (exists(auxf(pkt->p_file,'p'))) { in = xfopen(auxf(pkt->p_file,'p'),0); while ((p = fgets(line,sizeof(line),in)) != NULL) { p[length(p) - 1] = 0; pf_ab(p,&pf,0); if (pf.pf_nsid.s_rel == sp->s_rel && pf.pf_nsid.s_lev == sp->s_lev && pf.pf_nsid.s_br == sp->s_br && pf.pf_nsid.s_seq == sp->s_seq) { fclose(in); return(1); } } fclose(in); } else return(0); } else return(0); } mk_qfile(pkt) register struct packet *pkt; { FILE *in, *qout; char line[BUFSIZ]; in = xfopen(auxf(pkt->p_file,'p'),0); qout = xfcreat(auxf(pkt->p_file,'q'),0644); while ((fgets(line,sizeof(line),in) != NULL)) fputs(line,qout); fclose(in); fclose(qout); } chksid(p,sp) char *p; register struct sid *sp; { if (*p || (sp->s_rel == 0 && sp->s_lev)) fatal("invalid sid (co8)"); } char *satoi(p,ip) register char *p; register int *ip; { register int sum; if(*p){ sum = 0; while (numeric(*p)) sum = sum * 10 + (*p++ - '0'); *ip = sum; } return(p); }