Annotation of 43BSD/usr.bin/uucp/ulockf.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)ulockf.c   5.5 (Berkeley) 10/9/85";
        !             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: 
        !            16: /*LINTLIBRARY*/
        !            17: 
        !            18: /*
        !            19:  *     This routine will attempt to create a lock file (file).
        !            20:  *     It makes sure that the lock file is valid if it already exists.
        !            21:  *
        !            22:  *     return codes:  SUCCESS  |  FAIL
        !            23:  */
        !            24: ulockf(hfile, atime)
        !            25: char *hfile;
        !            26: time_t atime;
        !            27: {
        !            28:        register char *p;
        !            29:        register int i;
        !            30:        static char tempfile[NAMESIZE];
        !            31:        char file[NAMESIZE];
        !            32:        static int pid = -1;
        !            33:        extern int errno;
        !            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:                assert("DEAD LOCK", file, errno);
        !            64:                logent(file, "DEAD LOCK");
        !            65:                (void) unlink(file);
        !            66:                sleep(5);       /* avoid a possible race */
        !            67:                ASSERT(i++ < 5, "CAN'T GET LOCKFILE", tempfile, errno);
        !            68:        }
        !            69: 
        !            70:        for (i = 0; i < Nlocks; i++) {
        !            71:                if (Lockfile[i] == NULL)
        !            72:                        break;
        !            73:        }
        !            74:        ASSERT(i < MAXLOCKS, "TOO MANY LOCKS", CNULL, i);
        !            75:        if (i >= Nlocks)
        !            76:                i = Nlocks++;
        !            77:        p = malloc((unsigned)(strlen(file)+1));
        !            78:        ASSERT(p != NULL, "CAN NOT ALLOCATE FOR", file, 0);
        !            79:        strcpy(p, file);
        !            80:        Lockfile[i] = p;
        !            81: 
        !            82:        return SUCCESS;
        !            83: }
        !            84: 
        !            85: /*
        !            86:  *     remove all lock files in list or name
        !            87:  */
        !            88: rmlock(name)
        !            89: register char *name;
        !            90: {
        !            91:        register int i;
        !            92:        char file[MAXFULLNAME];
        !            93: 
        !            94:        if (name != NULL) {
        !            95:                sprintf(file, "%s/LCK..%s", LockDirectory, name);
        !            96:                name = file;
        !            97:        }
        !            98:        for (i = 0; i < Nlocks; i++) {
        !            99:                if (Lockfile[i] == NULL)
        !           100:                        continue;
        !           101:                if (name == NULL || strcmp(name, Lockfile[i]) == SAME) {
        !           102:                        unlink(Lockfile[i]);
        !           103:                        free(Lockfile[i]);
        !           104:                        Lockfile[i] = NULL;
        !           105:                }
        !           106:        }
        !           107: }
        !           108: 
        !           109: /*
        !           110:  *     makes lock a name on behalf of pid. Tempfile must be in the same
        !           111:  *     file system as name.
        !           112:  */
        !           113: onelock(pid, tempfile, name)
        !           114: int pid;
        !           115: char *tempfile, *name;
        !           116: {
        !           117:        register int fd, ret;
        !           118: #ifdef VMS
        !           119:        fd = creat(name, LCKMODE, "1version");
        !           120: #else !VMS
        !           121:        fd = creat(tempfile, LCKMODE);
        !           122: #endif !VMS
        !           123:        if (fd < 0) {
        !           124:                DEBUG(1,"Can't creat temp file %s ", tempfile);
        !           125:                DEBUG(1,"-- errno %d", errno);
        !           126:                return FAIL;
        !           127:        }
        !           128:        ret = write(fd, (char *)&pid, sizeof(int));
        !           129:        (void) close(fd);
        !           130: 
        !           131:        if (ret != sizeof(int)) {
        !           132:                DEBUG(1,"Temp file write failed -- errno %d\n", errno);
        !           133: #ifdef VMS
        !           134:                (void) unlink(name);
        !           135: #else !VMS
        !           136:                (void) unlink(tempfile);
        !           137: #endif !VMS
        !           138:                return FAIL;
        !           139:        }
        !           140: #ifndef VMS
        !           141:        if (link(tempfile, name) < 0) {
        !           142:                (void) unlink(tempfile);
        !           143:                return FAIL;
        !           144:        }
        !           145:        unlink(tempfile);
        !           146: #endif !VMS
        !           147:        return SUCCESS;
        !           148: }
        !           149: 
        !           150: #if !defined(BSD4_2) && !defined(USG)
        !           151: /*
        !           152:  *     update 'change' time for lock files
        !           153:  *
        !           154:  *     Only update ctime, not mtime or atime.
        !           155:  *     The 'chmod' method permits cu(I)-like programs
        !           156:  *     to determine how long uucp has been on the line.
        !           157:  *     The old "change access, mod, and change time" method
        !           158:  *     can be had by defining OLDTOUCH
        !           159:  *
        !           160:  *     return code - none
        !           161:  */
        !           162: 
        !           163: ultouch()
        !           164: {
        !           165:        static time_t lasttouch = 0;
        !           166:        register int i;
        !           167:        struct ut {
        !           168:                time_t actime;
        !           169:                time_t modtime;
        !           170:        } ut;
        !           171: 
        !           172: #ifdef USG
        !           173:        time(&Now.time);
        !           174:        t1.millitm = 0;
        !           175: #else !USG
        !           176:        ftime(&Now);
        !           177: #endif !USG
        !           178:        ut.actime = ut.modtime = Now.time;
        !           179:        /* Do not waste time touching locking files too often */
        !           180:        /* (But, defend against backward time changes) */
        !           181:        if (ut.actime >= lasttouch && ut.actime < lasttouch+60)
        !           182:                return;
        !           183:        lasttouch = ut.actime;
        !           184:        DEBUG(4, "ultouch\n", 0);
        !           185: 
        !           186:        for (i = 0; i < Nlocks; i++) {
        !           187:                if (Lockfile[i] == NULL)
        !           188:                        continue;
        !           189: #ifdef OLDTOUCH
        !           190:                utime(Lockfile[i], &ut);
        !           191: #else  !OLDTOUCH
        !           192:                chmod(Lockfile[i], LCKMODE);
        !           193: #endif !OLDTOUCH
        !           194:        }
        !           195: }
        !           196: #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.