Annotation of 42BSD/usr.bin/uucp/ulockf.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)ulockf.c   5.1 (Berkeley) 7/2/83";
                      3: #endif
                      4: 
                      5: #include "uucp.h"
                      6: #include <sys/types.h>
                      7: #include <sys/stat.h>
                      8: 
                      9: 
                     10: extern time_t  time();
                     11: 
                     12: /* File mode for lock files */
                     13: #define        LCKMODE 0444
                     14: 
                     15: /*******
                     16:  *     ulockf(file, atime)
                     17:  *     char *file;
                     18:  *     time_t atime;
                     19:  *
                     20:  *     ulockf  -  this routine will create a lock file (file).
                     21:  *     If one already exists, the create time is checked for
                     22:  *     older than the age time (atime).
                     23:  *     If it is older, an attempt will be made to unlink it
                     24:  *     and create a new one.
                     25:  *
                     26:  *     return codes:  0  |  FAIL
                     27:  */
                     28: 
                     29: ulockf(file, atime)
                     30: register char *file;
                     31: time_t atime;
                     32: {
                     33:        struct stat stbuf;
                     34:        time_t ptime;
                     35:        register int ret;
                     36:        static int pid = -1;
                     37:        static char tempfile[NAMESIZE];
                     38: 
                     39:        if (pid < 0) {
                     40:                pid = getpid();
                     41:                sprintf(tempfile, "LTMP.%d", pid);
                     42:        }
                     43:        if (onelock(pid, tempfile, file) == -1) {
                     44:                /* lock file exists */
                     45:                /* get status to check age of the lock file */
                     46:                ret = stat(file, &stbuf);
                     47:                if (ret != -1) {
                     48:                        time(&ptime);
                     49:                        if ((ptime - stbuf.st_ctime) < atime) {
                     50:                                /* file not old enough to delete */
                     51:                                return(FAIL);
                     52:                        }
                     53:                }
                     54:                ret = unlink(file);
                     55:                ret = onelock(pid, tempfile, file);
                     56:                if (ret != 0)
                     57:                        return(FAIL);
                     58:        }
                     59:        stlock(file);
                     60:        return(0);
                     61: }
                     62: 
                     63: 
                     64: #define MAXLOCKS 10    /* maximum number of lock files */
                     65: char *Lockfile[MAXLOCKS];
                     66: int Nlocks = 0;
                     67: 
                     68: /***
                     69:  *     stlock(name)    put name in list of lock files
                     70:  *     char *name;
                     71:  *
                     72:  *     return codes:  none
                     73:  */
                     74: 
                     75: stlock(name)
                     76: register char *name;
                     77: {
                     78:        register char *p;
                     79:        register int i;
                     80: 
                     81:        for (i = 0; i < Nlocks; i++) {
                     82:                if (Lockfile[i] == NULL)
                     83:                        break;
                     84:        }
                     85:        ASSERT(i < MAXLOCKS, "TOO MANY LOCKS", "", i);
                     86:        if (i >= Nlocks)
                     87:                i = Nlocks++;
                     88:        p = calloc((unsigned)(strlen(name)+1), sizeof (char));
                     89:        ASSERT(p != NULL, "CAN NOT ALLOCATE FOR", name, 0);
                     90:        strcpy(p, name);
                     91:        Lockfile[i] = p;
                     92:        return;
                     93: }
                     94: 
                     95: 
                     96: /***
                     97:  *     rmlock(name)    remove all lock files in list
                     98:  *     char *name;     or name
                     99:  *
                    100:  *     return codes: none
                    101:  */
                    102: 
                    103: rmlock(name)
                    104: register char *name;
                    105: {
                    106:        register int i;
                    107: 
                    108:        for (i = 0; i < Nlocks; i++) {
                    109:                if (Lockfile[i] == NULL)
                    110:                        continue;
                    111:                if (name == NULL
                    112:                || strcmp(name, Lockfile[i]) == SAME) {
                    113:                        unlink(Lockfile[i]);
                    114:                        free(Lockfile[i]);
                    115:                        Lockfile[i] = NULL;
                    116:                }
                    117:        }
                    118:        return;
                    119: }
                    120: 
                    121: 
                    122: /*
                    123:  *  this stuff from pjw 
                    124:  *  /usr/pjw/bin/recover - Check pids to remove unnecessary locks.
                    125:  *     isalock(name) returns 0 if the name is a lock.
                    126:  *     unlock(name)  unlocks name if it is a lock.
                    127:  *     onelock(pid,tempfile,name) makes lock a name
                    128:  *     on behalf of pid.  Tempfile must be in the same
                    129:  *     file system as name.
                    130:  *     lock(pid,tempfile,names) either locks all the
                    131:  *     names or none of them.
                    132:  */
                    133: isalock(name) char *name;
                    134: {
                    135:        struct stat xstat;
                    136:        if(stat(name,&xstat)<0) return(0);
                    137:        if(xstat.st_size!=sizeof(int)) return(0);
                    138:        return(1);
                    139: }
                    140: unlock(name) char *name;
                    141: {
                    142:        if(isalock(name)) return(unlink(name));
                    143:        else return(-1);
                    144: }
                    145: onelock(pid,tempfile,name) char *tempfile,*name;
                    146: {      register int fd;
                    147:        fd=creat(tempfile,LCKMODE);
                    148:        if(fd<0) return(-1);
                    149:        write(fd,(char *) &pid,sizeof(int));
                    150:        close(fd);
                    151:        if(link(tempfile,name)<0)
                    152:        {       unlink(tempfile);
                    153:                return(-1);
                    154:        }
                    155:        unlink(tempfile);
                    156:        return(0);
                    157: }
                    158: lock(pid,tempfile,names) char *tempfile;
                    159: register char **names;
                    160: {      register int i,j;
                    161:        for(i=0;names[i]!=0;i++)
                    162:        {       if(onelock(pid,tempfile,names[i])==0) continue;
                    163:                for(j=0;j<i;j++) unlink(names[j]);
                    164:                return(-1);
                    165:        }
                    166:        return(0);
                    167: }
                    168: 
                    169: #define LOCKPRE "LCK."
                    170: 
                    171: /***
                    172:  *     delock(s)       remove a lock file
                    173:  *     char *s;
                    174:  *
                    175:  *     return codes:  0  |  FAIL
                    176:  */
                    177: 
                    178: delock(s)
                    179: char *s;
                    180: {
                    181:        char ln[30];
                    182: 
                    183:        sprintf(ln, "%s.%s", LOCKPRE, s);
                    184:        rmlock(ln);
                    185: }
                    186: 
                    187: 
                    188: /***
                    189:  *     mlock(sys)      create system lock
                    190:  *     char *sys;
                    191:  *
                    192:  *     return codes:  0  |  FAIL
                    193:  */
                    194: 
                    195: mlock(sys)
                    196: char *sys;
                    197: {
                    198:        char lname[30];
                    199:        sprintf(lname, "%s.%s", LOCKPRE, sys);
                    200:        return(ulockf(lname, (time_t) SLCKTIME ) < 0 ? FAIL : 0);
                    201: }
                    202: 
                    203: 
                    204: /***
                    205:  *     ultouch()       update 'change' time for lock files
                    206:  *
                    207:  *     -- mod by rti!trt --
                    208:  *     Only update ctime, not mtime or atime.
                    209:  *     The 'chmod' method permits cu(I)-like programs
                    210:  *     to determine how long uucp has been on the line.
                    211:  *     The old "change access, mod, and change time" method
                    212:  *     can be had by defining OLDTOUCH
                    213:  *
                    214:  *     return code - none
                    215:  */
                    216: 
                    217: ultouch()
                    218: {
                    219:        time_t time();
                    220:        static time_t lasttouch = 0;
                    221:        register int i;
                    222:        struct ut {
                    223:                time_t actime;
                    224:                time_t modtime;
                    225:        } ut;
                    226: 
                    227:        ut.actime = time(&ut.modtime);
                    228:        /* Do not waste time touching locking files too often */
                    229:        /* (But, defend against backward time changes) */
                    230:        if (ut.actime >= lasttouch && ut.actime < lasttouch+60)
                    231:                return;
                    232:        lasttouch = ut.actime;
                    233:        DEBUG(4, "ultouch\n", 0);
                    234: 
                    235:        for (i = 0; i < Nlocks; i++) {
                    236:                if (Lockfile[i] == NULL)
                    237:                        continue;
                    238: #ifdef OLDTOUCH
                    239:                utime(Lockfile[i], &ut);
                    240: #else
                    241:                chmod(Lockfile[i], LCKMODE);
                    242: #endif
                    243:        }
                    244: }

unix.superglobalmegacorp.com

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