xref: /csrg-svn/usr.bin/uucp/libuu/gename.c (revision 25131)
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