Annotation of researchv10no/cmd/uucp/gename.c, revision 1.1

1.1     ! root        1: 
        !             2: /*     /sccs/src/cmd/uucp/s.gename.c
        !             3:        gename.c        1.1     8/30/84 17:37:19
        !             4: */
        !             5: #include "uucp.h"
        !             6: VERSION(@(#) c gename.c 1.1);
        !             7: 
        !             8: static struct {
        !             9:        char    sys[NAMESIZE];
        !            10:        int     job;
        !            11:        int     subjob;
        !            12: } syslst[30];          /* no more than 30 systems per job */
        !            13: 
        !            14: static int nsys = 0;
        !            15: 
        !            16:  /* generate file name
        !            17:   *    pre     -> file prefix
        !            18:   *    sys     -> system name
        !            19:   *    grade   -> service grade 
        !            20:   *    file    -> buffer to return filename must be of size DIRSIZ+1
        !            21:   * return:
        !            22:   *    none
        !            23:   */
        !            24: gename(pre, sys, grade, file)
        !            25: char pre, *sys, grade, *file;
        !            26: {
        !            27:        int     n;
        !            28: 
        !            29:        DEBUG(9, "gename(%c, ", pre);
        !            30:        DEBUG(9, "%s, ", sys);
        !            31:        DEBUG(9, "%c)\n", grade);
        !            32:        if (*sys == '\0') {
        !            33:                sys = Myname;
        !            34:                DEBUG(9, "null sys -> %s\n", sys);
        !            35:        }
        !            36:        n = sysseq(sys);
        !            37:        if (pre == CMDPRE || pre == XQTPRE) {
        !            38:                (void) sprintf(file, "%c.%.*s%c%.4x",
        !            39:                        pre, SYSNSIZE, sys, grade, syslst[n].job); 
        !            40:        } else
        !            41:                (void) sprintf(file, "%c.%.5s%.4x%.3x",
        !            42:                        pre, sys, syslst[n].job & 0xffff,
        !            43:                                ++syslst[n].subjob & 0xfff); 
        !            44:        DEBUG(4, "file - %s\n", file);
        !            45:        return;
        !            46: }
        !            47: 
        !            48: 
        !            49: #define SLOCKTIME 10
        !            50: #define SLOCKTRIES 5
        !            51: #define SEQLEN 4
        !            52: 
        !            53:  /*
        !            54:   * get next sequence number
        !            55:   * returns:  
        !            56:   *    number between 1 and 0xffff
        !            57:   *
        !            58:   * sequence number 0 is reserved for polling
        !            59:   */
        !            60: static int
        !            61: getseq(sys)
        !            62: char   *sys;
        !            63: {
        !            64:        register FILE *fp;
        !            65:        register int i;
        !            66:        int n;
        !            67:        int     seed;
        !            68:        char seqlock[MAXFULLNAME], seqfile[MAXFULLNAME];
        !            69: 
        !            70:        ASSERT(nsys < sizeof (syslst)/ sizeof (syslst[0]),
        !            71:            "SYSLST OVERFLOW", "", sizeof (syslst));
        !            72: 
        !            73:        (void) time(&seed);     /* crank up the sequence initializer */
        !            74:        srand(seed);
        !            75: 
        !            76:        (void) sprintf(seqlock, "%s%s", SEQLOCK, sys);
        !            77:        BASENAME(seqlock, '/')[MAXBASENAME] = '\0';
        !            78:        for (i = 1; i < SLOCKTRIES; i++) {
        !            79:                if (!ulockf(seqlock, (time_t) SLOCKTIME))
        !            80:                        break;
        !            81:                sleep(5);
        !            82:        }
        !            83: 
        !            84:        ASSERT(i < SLOCKTRIES, Ct_LOCK, seqlock, 0);
        !            85: 
        !            86:        (void) sprintf(seqfile, "%s/%s", SEQDIR, sys);
        !            87:        if ((fp = fopen(seqfile, "r")) != NULL) {
        !            88:                /* read sequence number file */
        !            89:                if (fscanf(fp, "%4x", &n) != 1) {
        !            90:                    n = rand();
        !            91:                    clearerr(fp);
        !            92:                }
        !            93:                fp = freopen(seqfile, "w", fp);
        !            94:                ASSERT(fp != NULL, Ct_OPEN, seqfile, errno);
        !            95:                (void) chmod(seqfile, 0666);
        !            96:        } else {
        !            97:                /* can not read file - create a new one */
        !            98:                ASSERT((fp = fopen(seqfile, "w")) != NULL,
        !            99:                    Ct_CREATE, seqfile, errno);
        !           100:                (void) chmod(seqfile, 0666);
        !           101:                n = rand();
        !           102:        }
        !           103: 
        !           104:        n++;
        !           105:        n &= 0xffff;    /* 4 byte sequence numbers */
        !           106:        (void) fprintf(fp, "%.4x\n", n);
        !           107:        ASSERT(ferror(fp) == 0, Ct_WRITE, seqfile, errno);
        !           108:        (void) fclose(fp);
        !           109:        ASSERT(ferror(fp) == 0, Ct_CLOSE, seqfile, errno);
        !           110:        rmlock(seqlock);
        !           111:        DEBUG(6, "%s seq ", sys); DEBUG(6, "now %x\n", n);
        !           112:        (void) strcpy(syslst[nsys].sys, sys);
        !           113:        syslst[nsys].job = n;
        !           114:        syslst[nsys].subjob = rand() & 0xfff;   /* random initial value */
        !           115:        return(nsys++);
        !           116: }
        !           117: 
        !           118: static int
        !           119: sysseq(sys)
        !           120: char   *sys;
        !           121: {
        !           122:        int     i;
        !           123: 
        !           124:        for (i = 0; i < nsys; i++)
        !           125:                if (strncmp(syslst[i].sys, sys, SYSNSIZE) == SAME)
        !           126:                        return(i);
        !           127: 
        !           128:        return(getseq(sys));
        !           129: }
        !           130: 
        !           131: /*
        !           132:  *     initSeq() exists because it is sometimes important to forget any
        !           133:  *     cached work files.  for example, when processing a bunch of spooled X.
        !           134:  *     files, we must not re-use any C. files used to send back output.
        !           135:  */
        !           136: void
        !           137: initSeq()
        !           138: {
        !           139:        nsys = 0;
        !           140: }

unix.superglobalmegacorp.com

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