Annotation of 43BSDReno/usr.bin/uucp/ulockf.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)ulockf.c   5.7     (Berkeley) 4/24/88";
                      3: #endif
                      4: 
                      5: #include "uucp.h"
                      6: #include <sys/stat.h>
                      7: #include <errno.h>
                      8: 
                      9: #define        LCKMODE 0444    /* File mode for lock files */
                     10: #define MAXLOCKS 16    /* Maximum number of lock files */
                     11: 
                     12: char *Lockfile[MAXLOCKS];
                     13: char *LockDirectory = LOCKDIR;
                     14: int Nlocks = 0;
                     15: extern int errno;
                     16: 
                     17: /*LINTLIBRARY*/
                     18: 
                     19: /*
                     20:  *     This routine will attempt to create a lock file (file).
                     21:  *     It makes sure that the lock file is valid if it already exists.
                     22:  *
                     23:  *     return codes:  SUCCESS  |  FAIL
                     24:  */
                     25: ulockf(hfile, atime)
                     26: char *hfile;
                     27: time_t atime;
                     28: {
                     29:        register char *p;
                     30:        register int i;
                     31:        static char tempfile[NAMESIZE];
                     32:        char file[NAMESIZE];
                     33:        static int pid = -1;
                     34: 
                     35:        if (pid < 0) {
                     36:                pid = getpid();
                     37:                sprintf(tempfile, "%s/LTMP.%d", LockDirectory, pid);
                     38:        }
                     39:        sprintf(file, "%s/LCK..%s", LockDirectory, hfile);
                     40:        i = 0;
                     41:        while (onelock(pid, tempfile, file) == -1) { /* lock file exists */
                     42: #if !defined(BSD4_2) && !defined(USG)
                     43:                struct stat stbuf;
                     44:                time_t ptime;
                     45:                /* get status to check age of the lock file */
                     46:                if (stat(file, &stbuf) == 0) {
                     47:                        (void) time(&ptime);
                     48:                        if ((ptime - stbuf.st_ctime) < atime)
                     49:                                return FAIL; /* file not old enough to delete */
                     50:                }
                     51: #else  BSD4_2 || USG
                     52:                register int fd;
                     53:                fd = open(file, 0);
                     54:                if (fd >= 0) {
                     55:                        int upid, ret;
                     56:                        ret = read(fd, &upid, sizeof upid);
                     57:                        close(fd);
                     58:                        if (ret == sizeof upid && (kill(upid, 0) == 0
                     59:                                || errno != ESRCH))
                     60:                                return FAIL; /* process is still running */
                     61:                }
                     62: #endif BSD4_2 || USG
                     63:                syslog(LOG_WARNING, "%s: dead lock %s", Rmtname, file);
                     64:                logent(file, "DEAD LOCK");
                     65:                (void) unlink(file);
                     66:                sleep(5);       /* avoid a possible race */
                     67:                if (i++ >= 5) {
                     68:                        syslog(LOG_ERR, "%s: can't get lockfile %s: %m",
                     69:                                Rmtname, tempfile);
                     70:                        cleanup(FAIL);
                     71:                }
                     72:        }
                     73: 
                     74:        for (i = 0; i < Nlocks; i++) {
                     75:                if (Lockfile[i] == NULL)
                     76:                        break;
                     77:        }
                     78:        if (i >= MAXLOCKS) {
                     79:                syslog(LOG_ERR, "Too many locks");
                     80:                cleanup(FAIL);
                     81:        }
                     82:        if (i >= Nlocks)
                     83:                i = Nlocks++;
                     84:        p = malloc((unsigned)(strlen(file)+1));
                     85:        if (p == NULL) {
                     86:                syslog(LOG_ERR, "malloc failed: %m");
                     87:                cleanup(FAIL);
                     88:        }
                     89:        strcpy(p, file);
                     90:        Lockfile[i] = p;
                     91: 
                     92:        return SUCCESS;
                     93: }
                     94: 
                     95: /*
                     96:  *     remove all lock files in list or name
                     97:  */
                     98: rmlock(name)
                     99: register char *name;
                    100: {
                    101:        register int i;
                    102:        char file[MAXFULLNAME];
                    103: 
                    104:        if (name != NULL) {
                    105:                sprintf(file, "%s/LCK..%s", LockDirectory, name);
                    106:                name = file;
                    107:        }
                    108:        for (i = 0; i < Nlocks; i++) {
                    109:                if (Lockfile[i] == NULL)
                    110:                        continue;
                    111:                if (name == NULL || strcmp(name, Lockfile[i]) == SAME) {
                    112:                        unlink(Lockfile[i]);
                    113:                        free(Lockfile[i]);
                    114:                        Lockfile[i] = NULL;
                    115:                }
                    116:        }
                    117: }
                    118: 
                    119: /*
                    120:  *     makes lock a name on behalf of pid. Tempfile must be in the same
                    121:  *     file system as name.
                    122:  */
                    123: onelock(pid, tempfile, name)
                    124: int pid;
                    125: char *tempfile, *name;
                    126: {
                    127:        register int fd, ret;
                    128: #ifdef VMS
                    129:        fd = creat(name, LCKMODE, "1version");
                    130: #else !VMS
                    131:        fd = creat(tempfile, LCKMODE);
                    132: #endif !VMS
                    133:        if (fd < 0) {
                    134:                DEBUG(1,"Can't creat temp file %s ", tempfile);
                    135:                DEBUG(1,"-- errno %d", errno);
                    136:                return FAIL;
                    137:        }
                    138:        ret = write(fd, (char *)&pid, sizeof(int));
                    139:        (void) close(fd);
                    140: 
                    141:        if (ret != sizeof(int)) {
                    142:                DEBUG(1,"Temp file write failed -- errno %d\n", errno);
                    143: #ifdef VMS
                    144:                (void) unlink(name);
                    145: #else !VMS
                    146:                (void) unlink(tempfile);
                    147: #endif !VMS
                    148:                return FAIL;
                    149:        }
                    150: #ifndef VMS
                    151:        if (link(tempfile, name) < 0) {
                    152:                (void) unlink(tempfile);
                    153:                return FAIL;
                    154:        }
                    155:        unlink(tempfile);
                    156: #endif !VMS
                    157:        return SUCCESS;
                    158: }
                    159: 
                    160: #if !defined(BSD4_2) && !defined(USG)
                    161: /*
                    162:  *     update 'change' time for lock files
                    163:  *
                    164:  *     Only update ctime, not mtime or atime.
                    165:  *     The 'chmod' method permits cu(I)-like programs
                    166:  *     to determine how long uucp has been on the line.
                    167:  *     The old "change access, mod, and change time" method
                    168:  *     can be had by defining OLDTOUCH
                    169:  *
                    170:  *     return code - none
                    171:  */
                    172: 
                    173: ultouch()
                    174: {
                    175:        static time_t lasttouch = 0;
                    176:        register int i;
                    177:        struct ut {
                    178:                time_t actime;
                    179:                time_t modtime;
                    180:        } ut;
                    181: 
                    182: #ifdef USG
                    183:        time(&Now.time);
                    184:        t1.millitm = 0;
                    185: #else !USG
                    186:        ftime(&Now);
                    187: #endif !USG
                    188:        ut.actime = ut.modtime = Now.time;
                    189:        /* Do not waste time touching locking files too often */
                    190:        /* (But, defend against backward time changes) */
                    191:        if (ut.actime >= lasttouch && ut.actime < lasttouch+60)
                    192:                return;
                    193:        lasttouch = ut.actime;
                    194:        DEBUG(4, "ultouch\n", 0);
                    195: 
                    196:        for (i = 0; i < Nlocks; i++) {
                    197:                if (Lockfile[i] == NULL)
                    198:                        continue;
                    199: #ifdef OLDTOUCH
                    200:                utime(Lockfile[i], &ut);
                    201: #else  !OLDTOUCH
                    202:                chmod(Lockfile[i], LCKMODE);
                    203: #endif !OLDTOUCH
                    204:        }
                    205: }
                    206: #endif !BSD4_2 && ! USG

unix.superglobalmegacorp.com

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