113645Ssam #ifndef lint 2*33949Srick static char sccsid[] = "@(#)gename.c 5.7 (Berkeley) 04/05/88"; 313645Ssam #endif 413645Ssam 513645Ssam #include "uucp.h" 613645Ssam 713645Ssam #define SEQLEN 4 825131Sbloom #define SLOCKTIME 10L 925131Sbloom #define SLOCKTRIES 5 1025131Sbloom /* 1125131Sbloom * the alphabet can be anything, but if it's not in ascii order, 1225131Sbloom * sequence ordering is not preserved 1325131Sbloom */ 1425131Sbloom static char alphabet[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 1513645Ssam 1625131Sbloom #ifdef BSD4_2 1725131Sbloom #include <sys/file.h> 1825131Sbloom #endif BSD4_2 1925131Sbloom 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; 2925131Sbloom static char snum[5]; 3023600Sbloom static char *lastchar = NULL; 3113645Ssam 3213645Ssam if (lastchar == NULL || (snum[SEQLEN-1] = *(lastchar++)) == '\0') { 3325131Sbloom #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"); 4225131Sbloom goto getrandseq; 4323600Sbloom } 4425131Sbloom #endif !BSD4_2 4513645Ssam 4613645Ssam if ((fd = open(SEQFILE, 2)) >= 0) { 4725131Sbloom register char *p; 4825131Sbloom #ifdef BSD4_2 4925131Sbloom flock(fd, LOCK_EX); 5025131Sbloom #endif !BSD4_2 5113645Ssam read(fd, snum, SEQLEN); 5213645Ssam /* increment the penultimate character */ 5313645Ssam for (i = SEQLEN - 2; i >= 0; --i) { 5425131Sbloom if ((p = index(alphabet, snum[i])) == NULL) 5525131Sbloom goto getrandseq; 5625131Sbloom 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*33949Srick syslog(LOG_WARNING, "open(%s) failed: %m", SEQFILE); 6525131Sbloom fd = creat(SEQFILE, 0666); 6625131Sbloom getrandseq: srand((int)time((time_t *)0)); 6713645Ssam for (i = 0; i < SEQLEN; i++) 6825131Sbloom snum[i] = alphabet[rand() % (sizeof alphabet - 1)]; 6925131Sbloom snum[SEQLEN-1] = alphabet[0]; 7013645Ssam } 7113645Ssam 7225131Sbloom if (fd >= 0) { 7325131Sbloom lseek(fd, 0L, 0); 7425131Sbloom write(fd, snum, SEQLEN); 7525131Sbloom close(fd); 7625131Sbloom } 7725131Sbloom #ifndef BSD4_2 7813645Ssam rmlock(SEQLOCK); 7925131Sbloom #endif !BSD4_2 8013645Ssam lastchar = alphabet + 1; 8113645Ssam } 8225131Sbloom sprintf(file,"%c.%.*s%c%.*s", pre, SYSNSIZE, sys, grade, SEQLEN, snum); 8325131Sbloom DEBUG(4, "file - %s\n", file); 8413645Ssam } 85