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