Annotation of 43BSD/contrib/rcs/src/rcsutil.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *                     RCS utilities
                      3:  */
                      4:  static char rcsid[]=
                      5:  "$Header: /usr/wft/RCS/SRC/RCS/rcsutil.c,v 3.8 83/02/15 15:41:49 wft Exp $ Purdue CS";
                      6: /*****************************************************************************
                      7:  *****************************************************************************
                      8:  *
                      9:  * Copyright (C) 1982 by Walter F. Tichy
                     10:  *                       Purdue University
                     11:  *                       Computer Science Department
                     12:  *                       West Lafayette, IN 47907
                     13:  *
                     14:  * All rights reserved. No part of this software may be sold or distributed
                     15:  * in any form or by any means without the prior written permission of the
                     16:  * author.
                     17:  * Report problems and direct all inquiries to Tichy@purdue (ARPA net).
                     18:  */
                     19: 
                     20: 
                     21: 
                     22: /* $Log:       rcsutil.c,v $
                     23:  * Revision 3.8  83/02/15  15:41:49  wft
                     24:  * Added routine fastcopy() to copy remainder of a file in blocks.
                     25:  * 
                     26:  * Revision 3.7  82/12/24  15:25:19  wft
                     27:  * added catchints(), ignoreints() for catching and ingnoring interrupts;
                     28:  * fixed catchsig().
                     29:  *
                     30:  * Revision 3.6  82/12/08  21:52:05  wft
                     31:  * Using DATEFORM to format dates.
                     32:  *
                     33:  * Revision 3.5  82/12/04  18:20:49  wft
                     34:  * Replaced SNOOPDIR with SNOOPFILE; changed addlock() to update
                     35:  * lockedby-field.
                     36:  *
                     37:  * Revision 3.4  82/12/03  17:17:43  wft
                     38:  * Added check to addlock() ensuring only one lock per person.
                     39:  * Addlock also returns a pointer to the lock created. Deleted fancydate().
                     40:  *
                     41:  * Revision 3.3  82/11/27  12:24:37  wft
                     42:  * moved rmsema(), trysema(), trydiraccess(), getfullRCSname() to rcsfnms.c.
                     43:  * Introduced macro SNOOP so that snoop can be placed in directory other than
                     44:  * TARGETDIR. Changed %02d to %.2d for compatibility reasons.
                     45:  *
                     46:  * Revision 3.2  82/10/18  21:15:11  wft
                     47:  * added function getfullRCSname().
                     48:  *
                     49:  * Revision 3.1  82/10/13  16:17:37  wft
                     50:  * Cleanup message is now suppressed in quiet mode.
                     51:  */
                     52: 
                     53: 
                     54: 
                     55: 
                     56: #include <sys/types.h>
                     57: #include <sys/stat.h>
                     58: #include <signal.h>
                     59: #include "rcsbase.h"
                     60: 
                     61: extern char * malloc();
                     62: extern FILE * finptr;
                     63: extern char * getfullRCSname();
                     64: 
                     65: struct hshentry dummy;         /* dummy delta for reservations  */
                     66: 
                     67: 
                     68: struct lock * addlock(delta,who)
                     69: struct hshentry * delta; char * who;
                     70: /* Given a delta, addlock checks whether
                     71:  * the delta is locked by somebody other than who.
                     72:  * If so, an error message is printed, and false returned.
                     73:  * If the delta is not reserved at all, a lock for it is added,
                     74:  * and a pointer for the lock returned.
                     75:  */
                     76: {
                     77:         struct lock * next;
                     78: 
                     79:         next=Locks;
                     80:         while (next!=nil) {
                     81:                 if (cmpnum(delta->num,next->delta->num)==0) {
                     82:                         if (strcmp(who,next->login)==0)
                     83:                                 return next;
                     84:                                 /* lock exists already */
                     85:                         else {
                     86:                                 error("revision %s already locked by %s",
                     87:                                       delta->num, next->login);
                     88:                                 return false;
                     89:                         }
                     90:                 } else {
                     91:                         if (strcmp(who,next->login)==0) {
                     92:                                 error("you already locked %s; only one lock allowed per person.",
                     93:                                        next->delta->num);
                     94:                                 return false;
                     95:                         } else {
                     96:                                 next=next->nextlock;
                     97:                         }
                     98:                 }
                     99:         }
                    100:         /* not found; set up new lockblock */
                    101:         next= (struct lock *) malloc(sizeof (struct lock));
                    102:         delta->lockedby=next->login=who;
                    103:         next->delta= delta;
                    104:         next->nextlock=Locks;
                    105:         Locks=next;
                    106:         return next;
                    107: }
                    108: 
                    109: 
                    110: 
                    111: int addsymbol(delta,name,rebind)
                    112: struct hshentry * delta; char * name; int rebind;
                    113: /* Function: adds a new symbolic name and associates it with node delta.
                    114:  * If name already exists and rebind is true, the name is associated
                    115:  * with the new delta; otherwise, an error message is printed and
                    116:  * false returned. Returns true it successful.
                    117:  */
                    118: {       register struct assoc * next;
                    119:         next=Symbols;
                    120:         while (next!=nil) {
                    121:                 if (strcmp(name,next->symbol)==0) {
                    122:                         if (rebind) {
                    123:                                 next->delta=delta;
                    124:                                 return true;
                    125:                         } else {
                    126:                                 error("symbolic name %s already bound to %s",
                    127:                                         name,next->delta->num);
                    128:                                 return false;
                    129:                         }
                    130:                 } else  next = next->nextassoc;
                    131:         }
                    132:         /* not found; insert new pair. */
                    133:         next = (struct assoc *) malloc(sizeof(struct assoc));
                    134:         next->symbol=name;
                    135:         next->delta=delta;
                    136:         next->nextassoc=Symbols;
                    137:         Symbols = next;
                    138:         return true;
                    139: }
                    140: 
                    141: 
                    142: 
                    143: 
                    144: int checkaccesslist(who)
                    145: char * who;
                    146: /* function: Returns true if who is the superuser, the owner of the
                    147:  * file, the access list is empty, or who is on the access list.
                    148:  * Prints an error message and returns false otherwise.
                    149:  */
                    150: {
                    151:         register struct access * next;
                    152:         struct stat statbuf;
                    153: 
                    154:         if ((AccessList==nil) || (strcmp(who,"root")==0))
                    155:                 return true;
                    156: 
                    157:         next=AccessList;
                    158:         do {
                    159:                 if (strcmp(who,next->login)==0)
                    160:                         return true;
                    161:                 next=next->nextaccess;
                    162:         } while (next!=nil);
                    163: 
                    164:         fstat(fileno(finptr),&statbuf);  /* get owner of file */
                    165:         if (getuid() == statbuf.st_uid) return true;
                    166: 
                    167:         error("User %s not on the access list",who);
                    168:         return false;
                    169: }
                    170: 
                    171: void catchsig(sig)
                    172: {
                    173:        signal(sig, SIG_IGN);
                    174:         diagnose("\nRCS: cleaning up\n");
                    175:         cleanup();
                    176:         exit(1);
                    177: }
                    178: 
                    179: void catchints()
                    180: {
                    181:         signal(SIGINT,catchsig); signal(SIGHUP,catchsig);
                    182:         signal(SIGQUIT,catchsig); signal(SIGPIPE,catchsig);
                    183:        signal(SIGTERM,catchsig);
                    184: }
                    185: 
                    186: void ignoreints()
                    187: {
                    188:         signal(SIGINT,SIG_IGN); signal(SIGHUP,SIG_IGN);
                    189:         signal(SIGQUIT,SIG_IGN); signal(SIGPIPE,SIG_IGN);
                    190:        signal(SIGTERM,SIG_IGN);
                    191: }
                    192: 
                    193: 
                    194: fastcopy(inf,outf)
                    195: FILE * inf, * outf;
                    196: /* Function: copies the remainder of file inf to outf. First copies the
                    197:  * rest that is in the IO-buffer of inf character by character, and then
                    198:  * copies the remainder in blocks.
                    199:  */
                    200: {       char buf[BUFSIZ];
                    201:         register int rcount, wcount;
                    202: 
                    203:         /* write the rest of the buffer to outf */
                    204:         while ((--inf->_cnt)>=0) {
                    205:                 putc(*inf->_ptr++&0377,outf);
                    206:         }
                    207:         fflush(outf);
                    208: 
                    209:         /*now read the rest of the file in blocks*/
                    210:         while ((rcount=read(fileno(inf),buf,BUFSIZ))>0) {
                    211:                 wcount=write(fileno(outf),buf,rcount);
                    212:                 if (wcount!=rcount) {
                    213:                     faterror("write error");
                    214:                 }
                    215:         }
                    216: }
                    217: 
                    218: 
                    219: 
                    220: 
                    221: 
                    222: 
                    223: #ifdef SNOOPFILE
                    224: 
                    225: #include "time.h"
                    226: extern struct tm* localtime();
                    227: extern long time();
                    228: 
                    229: logcommand(commandname,delta, sequence,login)
                    230: char* commandname; struct hshentry * delta, * sequence[];char * login;
                    231: /* Function: start a process to write the file that
                    232:  * logs the RCS command.
                    233:  * Each line in the log file contains the following information:
                    234:  * operation, revision(r), backward deltas applied(b), forward deltas applied(f),
                    235:  * total deltas present(t), creation date of delta(d), date of operation(o),
                    236:  * login of caller, full path of RCS file
                    237:  */
                    238: {
                    239:         char command[200];
                    240:         char curdate[datelength];
                    241:         register int i, backward, forward;
                    242:         long clock;
                    243:         struct tm * tm;
                    244: 
                    245:         clock=time(0);
                    246:         tm=localtime(&clock);
                    247: 
                    248:         sprintf(curdate,DATEFORM,
                    249:                 tm->tm_year, tm->tm_mon+1, tm->tm_mday,
                    250:                 tm->tm_hour, tm->tm_min, tm->tm_sec);
                    251: 
                    252:         i= backward=forward=0;
                    253:         while(sequence[i]!=nil) {  /* count deltas to be applied*/
                    254:         if (countnumflds(sequence[i]->num) == 2)
                    255:                 backward++;  /* reverse delta */
                    256:         else    forward++;   /* branch delta  */
                    257:         i++;
                    258:         }
                    259:         sprintf(command,"%s \"%s %10sr %3db %3df %3dt %sc %so %s %s\" &\n",
                    260:                 SNOOP, commandname,delta->num,backward,forward,TotalDeltas,delta->date,
                    261:                 curdate,login,getfullRCSname());
                    262:         system(command);
                    263: }
                    264: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.