Annotation of 42BSD/usr.bin/tip/uucplock.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)uucplock.c 4.6 (Berkeley) 6/25/83";
                      3: #endif
                      4: /*
                      5:  * defs that come from uucp.h
                      6:  */
                      7: #define NAMESIZE 15
                      8: #define FAIL -1
                      9: #define SAME 0
                     10: #define SLCKTIME 28800 /* system/device timeout (LCK.. files) in seconds (8 hours) */
                     11: #define ASSERT(e, f, v) if (!(e)) {\
                     12:        fprintf(stderr, "AERROR - (%s) ", "e");\
                     13:        fprintf(stderr, f, v);\
                     14:        finish(FAIL);\
                     15: }
                     16: 
                     17: #define LOCKPRE "/usr/spool/uucp/LCK."
                     18: 
                     19: /*
                     20:  * This code is taken almost directly from uucp and follows the same
                     21:  * conventions.  This is important since uucp and tip should
                     22:  * respect each others locks.
                     23:  */
                     24: 
                     25:        /*  ulockf 3.2  10/26/79  11:40:29  */
                     26: /* #include "uucp.h" */
                     27: #include <sys/types.h>
                     28: #include <sys/stat.h>
                     29: #include <stdio.h>
                     30: 
                     31: /*******
                     32:  *     ulockf(file, atime)
                     33:  *     char *file;
                     34:  *     time_t atime;
                     35:  *
                     36:  *     ulockf  -  this routine will create a lock file (file).
                     37:  *     If one already exists, the create time is checked for
                     38:  *     older than the age time (atime).
                     39:  *     If it is older, an attempt will be made to unlink it
                     40:  *     and create a new one.
                     41:  *
                     42:  *     return codes:  0  |  FAIL
                     43:  */
                     44: 
                     45: static
                     46: ulockf(file, atime)
                     47:        char *file;
                     48:        time_t atime;
                     49: {
                     50:        struct stat stbuf;
                     51:        time_t ptime;
                     52:        int ret;
                     53:        static int pid = -1;
                     54:        static char tempfile[NAMESIZE];
                     55: 
                     56:        if (pid < 0) {
                     57:                pid = getpid();
                     58:                sprintf(tempfile, "/usr/spool/uucp/LTMP.%d", pid);
                     59:        }
                     60:        if (onelock(pid, tempfile, file) == -1) {
                     61:                /* lock file exists */
                     62:                /* get status to check age of the lock file */
                     63:                ret = stat(file, &stbuf);
                     64:                if (ret != -1) {
                     65:                        time(&ptime);
                     66:                        if ((ptime - stbuf.st_ctime) < atime) {
                     67:                                /* file not old enough to delete */
                     68:                                return (FAIL);
                     69:                        }
                     70:                }
                     71:                ret = unlink(file);
                     72:                ret = onelock(pid, tempfile, file);
                     73:                if (ret != 0)
                     74:                        return (FAIL);
                     75:        }
                     76:        stlock(file);
                     77:        return (0);
                     78: }
                     79: 
                     80: #define MAXLOCKS 10    /* maximum number of lock files */
                     81: char *Lockfile[MAXLOCKS];
                     82: int Nlocks = 0;
                     83: 
                     84: /***
                     85:  *     stlock(name)    put name in list of lock files
                     86:  *     char *name;
                     87:  *
                     88:  *     return codes:  none
                     89:  */
                     90: 
                     91: static
                     92: stlock(name)
                     93:        char *name;
                     94: {
                     95:        char *p;
                     96:        extern char *calloc();
                     97:        int i;
                     98: 
                     99:        for (i = 0; i < Nlocks; i++) {
                    100:                if (Lockfile[i] == NULL)
                    101:                        break;
                    102:        }
                    103:        ASSERT(i < MAXLOCKS, "TOO MANY LOCKS %d", i);
                    104:        if (i >= Nlocks)
                    105:                i = Nlocks++;
                    106:        p = calloc(strlen(name) + 1, sizeof (char));
                    107:        ASSERT(p != NULL, "CAN NOT ALLOCATE FOR %s", name);
                    108:        strcpy(p, name);
                    109:        Lockfile[i] = p;
                    110:        return;
                    111: }
                    112: 
                    113: /***
                    114:  *     rmlock(name)    remove all lock files in list
                    115:  *     char *name;     or name
                    116:  *
                    117:  *     return codes: none
                    118:  */
                    119: 
                    120: static
                    121: rmlock(name)
                    122:        char *name;
                    123: {
                    124:        int i;
                    125: 
                    126:        for (i = 0; i < Nlocks; i++) {
                    127:                if (Lockfile[i] == NULL)
                    128:                        continue;
                    129:                if (name == NULL || strcmp(name, Lockfile[i]) == SAME) {
                    130:                        unlink(Lockfile[i]);
                    131:                        free(Lockfile[i]);
                    132:                        Lockfile[i] = NULL;
                    133:                }
                    134:        }
                    135: }
                    136: 
                    137: /*
                    138:  * this stuff from pjw 
                    139:  *  /usr/pjw/bin/recover - check pids to remove unnecessary locks
                    140:  *
                    141:  *     isalock(name) returns 0 if the name is a lock
                    142:  *
                    143:  *     onelock(pid,tempfile,name) makes lock a name
                    144:  *     on behalf of pid.  Tempfile must be in the same
                    145:  *     file system as name.
                    146:  *
                    147:  *     lock(pid,tempfile,names) either locks all the
                    148:  *     names or none of them
                    149:  */
                    150: static
                    151: isalock(name)
                    152:        char *name;
                    153: {
                    154:        struct stat xstat;
                    155: 
                    156:        if (stat(name, &xstat) < 0)
                    157:                return (0);
                    158:        if (xstat.st_size != sizeof(int))
                    159:                return (0);
                    160:        return (1);
                    161: }
                    162: 
                    163: static
                    164: onelock(pid, tempfile, name)
                    165:        char *tempfile, *name;
                    166: {
                    167:        int fd;
                    168: 
                    169:        fd = creat(tempfile, 0444);
                    170:        if (fd < 0)
                    171:                return (-1);
                    172:        write(fd,(char *)&pid, sizeof(int));
                    173:        close(fd);
                    174:        if (link(tempfile, name) < 0) {
                    175:                unlink(tempfile);
                    176:                return (-1);
                    177:        }
                    178:        unlink(tempfile);
                    179:        return (0);
                    180: }
                    181: 
                    182: /***
                    183:  *     delock(s)       remove a lock file
                    184:  *     char *s;
                    185:  *
                    186:  *     return codes:  0  |  FAIL
                    187:  */
                    188: 
                    189: delock(s)
                    190:        char *s;
                    191: {
                    192:        char ln[30];
                    193: 
                    194:        sprintf(ln, "%s.%s", LOCKPRE, s);
                    195:        rmlock(ln);
                    196: }
                    197: 
                    198: /***
                    199:  *     mlock(sys)      create system lock
                    200:  *     char *sys;
                    201:  *
                    202:  *     return codes:  0  |  FAIL
                    203:  */
                    204: 
                    205: mlock(sys)
                    206:        char *sys;
                    207: {
                    208:        char lname[30];
                    209:        sprintf(lname, "%s.%s", LOCKPRE, sys);
                    210:        return (ulockf(lname, (time_t) SLCKTIME ) < 0 ? FAIL : 0);
                    211: }

unix.superglobalmegacorp.com

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