date and time created 85/01/22 13:49:21 by ralph
[unix-history] / usr / src / usr.bin / uucp / libuu / gename.c
#ifndef lint
static char sccsid[] = "@(#)gename.c 5.3 (Berkeley) %G%";
#endif
#include "uucp.h"
#include <sys/types.h>
#define SEQLEN 4
/*******
* gename(pre, sys, grade, file) generate file name
* char grade, *sys, pre, *file;
*
* return codes: none
*/
gename(pre, sys, grade, file)
char pre, *sys, grade, *file;
{
static char sqnum[SEQLEN+1];
getseq(sqnum);
sprintf(file, "%c.%.7s%c%.*s", pre, sys, grade, SEQLEN, sqnum);
DEBUG(4, "file - %s\n", file);
return;
}
#define SLOCKTIME 10L
#define SLOCKTRIES 5
/*******
* getseq(snum) get next sequence number
* char *snum;
*
* return codes: none
*/
static
getseq(snum)
register char *snum;
{
/*
* the alphabet can be anything, but if it's not in ascii order,
* sequence ordering is not preserved
*/
char *alphabet =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
register int i, fd;
static char *lastchar;
if (lastchar == NULL || (snum[SEQLEN-1] = *(lastchar++)) == '\0') {
for (i = 0; i < SLOCKTRIES; i++) {
if (!ulockf(SEQLOCK, (time_t)SLOCKTIME))
break;
sleep(5);
}
ASSERT(i < SLOCKTRIES, "CAN NOT GET", "SEQLOCK", 0);
if ((fd = open(SEQFILE, 2)) >= 0) {
int alphalen;
register char *p;
char *index();
alphalen = strlen(alphabet);
read(fd, snum, SEQLEN);
/* increment the penultimate character */
for (i = SEQLEN - 2; i >= 0; --i) {
if ((p = index(alphabet, snum[i])) == NULL) {
/* drastic but effective */
snum[i] = alphabet[alphalen - 1];
DEBUG(6, "bad seqf: %s\n", snum);
}
if (++p < &alphabet[alphalen]) {
snum[i] = *p;
break;
} else /* carry */
snum[i] = alphabet[0]; /* continue */
}
snum[SEQLEN-1] = alphabet[0];
} else {
if ((fd = creat(SEQFILE, 0666)) < 0)
return(FAIL);
for (i = 0; i < SEQLEN; i++)
snum[i] = alphabet[0];
}
lseek(fd, 0L, 0);
write(fd, snum, SEQLEN);
close(fd);
rmlock(SEQLOCK);
lastchar = alphabet + 1;
}
return(0);
}