113645Ssam #ifndef lint 2*25131Sbloom static char sccsid[] = "@(#)gename.c 5.6 (Berkeley) 10/09/85"; 313645Ssam #endif 413645Ssam 513645Ssam #include "uucp.h" 613645Ssam 713645Ssam #define SEQLEN 4 8*25131Sbloom #define SLOCKTIME 10L 9*25131Sbloom #define SLOCKTRIES 5 10*25131Sbloom /* 11*25131Sbloom * the alphabet can be anything, but if it's not in ascii order, 12*25131Sbloom * sequence ordering is not preserved 13*25131Sbloom */ 14*25131Sbloom static char alphabet[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 1513645Ssam 16*25131Sbloom #ifdef BSD4_2 17*25131Sbloom #include <sys/file.h> 18*25131Sbloom #endif BSD4_2 19*25131Sbloom 2023600Sbloom /*LINTLIBRARY*/ 2123600Sbloom 2223600Sbloom /* 2323600Sbloom * generate file name 2413645Ssam */ 2513645Ssam gename(pre, sys, grade, file) 2613645Ssam char pre, *sys, grade, *file; 2713645Ssam { 2813645Ssam register int i, fd; 29*25131Sbloom static char snum[5]; 3023600Sbloom static char *lastchar = NULL; 3113645Ssam 3213645Ssam if (lastchar == NULL || (snum[SEQLEN-1] = *(lastchar++)) == '\0') { 33*25131Sbloom #ifndef BSD4_2 3413645Ssam for (i = 0; i < SLOCKTRIES; i++) { 3523600Sbloom if (!ulockf(SEQLOCK, SLOCKTIME)) 3613645Ssam break; 3713645Ssam sleep(5); 3813645Ssam } 3913645Ssam 4023600Sbloom if (i >= SLOCKTRIES) { 4123600Sbloom logent(SEQLOCK, "CAN NOT LOCK"); 42*25131Sbloom goto getrandseq; 4323600Sbloom } 44*25131Sbloom #endif !BSD4_2 4513645Ssam 4613645Ssam if ((fd = open(SEQFILE, 2)) >= 0) { 47*25131Sbloom register char *p; 48*25131Sbloom #ifdef BSD4_2 49*25131Sbloom flock(fd, LOCK_EX); 50*25131Sbloom #endif !BSD4_2 5113645Ssam read(fd, snum, SEQLEN); 5213645Ssam /* increment the penultimate character */ 5313645Ssam for (i = SEQLEN - 2; i >= 0; --i) { 54*25131Sbloom if ((p = index(alphabet, snum[i])) == NULL) 55*25131Sbloom goto getrandseq; 56*25131Sbloom if (++p < &alphabet[sizeof alphabet - 1]) { 5713645Ssam snum[i] = *p; 5813645Ssam break; 5913645Ssam } else /* carry */ 6013645Ssam snum[i] = alphabet[0]; /* continue */ 6113645Ssam } 6213645Ssam snum[SEQLEN-1] = alphabet[0]; 6313645Ssam } else { 64*25131Sbloom extern int errno; 65*25131Sbloom fd = creat(SEQFILE, 0666); 66*25131Sbloom getrandseq: srand((int)time((time_t *)0)); 67*25131Sbloom assert(SEQFILE, "is missing or trashed\n", errno); 6813645Ssam for (i = 0; i < SEQLEN; i++) 69*25131Sbloom snum[i] = alphabet[rand() % (sizeof alphabet - 1)]; 70*25131Sbloom snum[SEQLEN-1] = alphabet[0]; 7113645Ssam } 7213645Ssam 73*25131Sbloom if (fd >= 0) { 74*25131Sbloom lseek(fd, 0L, 0); 75*25131Sbloom write(fd, snum, SEQLEN); 76*25131Sbloom close(fd); 77*25131Sbloom } 78*25131Sbloom #ifndef BSD4_2 7913645Ssam rmlock(SEQLOCK); 80*25131Sbloom #endif !BSD4_2 8113645Ssam lastchar = alphabet + 1; 8213645Ssam } 83*25131Sbloom sprintf(file,"%c.%.*s%c%.*s", pre, SYSNSIZE, sys, grade, SEQLEN, snum); 84*25131Sbloom DEBUG(4, "file - %s\n", file); 8513645Ssam } 86