Annotation of 43BSD/usr.bin/tip/uucplock.c, revision 1.1

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

unix.superglobalmegacorp.com

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