Annotation of researchv8dc/cmd/Mail/olock.c, revision 1.1.1.1

1.1       root        1: #
                      2: 
                      3: /*
                      4:  * A mailing program.
                      5:  *
                      6:  * Stuff to do version 7 style locking.
                      7:  */
                      8: 
                      9: #include "rcv.h"
                     10: #include <sys/stat.h>
                     11: 
                     12: static char *SccsId = "@(#)lock.c      2.3 12/17/82";
                     13: 
                     14: static int             locked;                 /* To note that we locked it */
                     15: static         char            lockfile[64];           /* Last locked file */
                     16: 
                     17: /*
                     18:  * Lock the specified mail file by setting the execute bit on mailfile.
                     19:  * We must, of course, be careful to remove the lock by a call
                     20:  * to unlock before we stop.  The algorithm used here is to see if
                     21:  * the lock exists, and if it does, to check its modify time.  If it
                     22:  * is older than 5 minutes, we assume error and set our own lock.
                     23:  * Otherwise, we wait for 5 seconds and try again.
                     24:  */
                     25: 
                     26: lock(file)
                     27: char *file;
                     28: {
                     29:        register int f;
                     30:        struct stat sbuf;
                     31:        long curtime;
                     32: 
                     33:        if (file == NOSTR) {
                     34:                printf("Locked = %d\n", locked);
                     35:                return(0);
                     36:        }
                     37:        if (locked)
                     38:                return(0);
                     39:        strcpy(lockfile, file);
                     40:        for (;;) {
                     41:                f = lock1(file);
                     42:                if (f == 0) {
                     43:                        locked = 1;
                     44:                        return(0);
                     45:                }
                     46:                if (stat(file, &sbuf) < 0)
                     47:                        return(0);
                     48:                time(&curtime);
                     49:                if (curtime < sbuf.st_ctime + 300) {
                     50:                        sleep(5);
                     51:                        continue;
                     52:                }
                     53:                unlock();
                     54:        }
                     55: }
                     56: 
                     57: /*
                     58:  * Remove the mail lock, and note that we no longer
                     59:  * have it locked.
                     60:  */
                     61: 
                     62: unlock()
                     63: {
                     64:        struct stat sbuf;
                     65: 
                     66:        if (stat(lockfile, &sbuf) < 0)
                     67:                return;
                     68:        if (chmod(lockfile, sbuf.st_mode & ~01) < 0)
                     69:                return;
                     70:        locked = 0;
                     71: }
                     72: 
                     73: /*
                     74:  * Attempt to set the lock by setting the execute bit.
                     75:  * If it fails, return -1 else 0
                     76:  */
                     77: 
                     78: lock1(file)
                     79: char *file;
                     80: {
                     81:        struct stat sbuf;
                     82: 
                     83:        if (stat(file, &sbuf) < 0)
                     84:                return(-1);
                     85:        if (sbuf.st_mode & 01)
                     86:                return(-1);
                     87:        if (chmod(file, sbuf.st_mode | 01) < 0)
                     88:                return(-1);
                     89:        return(0);
                     90: }

unix.superglobalmegacorp.com

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