xref: /csrg-svn/usr.bin/uucp/libuu/gnxseq.c (revision 23609)
113655Ssam #ifndef lint
2*23609Sbloom static char sccsid[] = "@(#)gnxseq.c	5.4 (Berkeley) 06/20/85";
313655Ssam #endif
413655Ssam 
513655Ssam #include "uucp.h"
617835Sralph #ifdef BSD4_2
713706Ssam #include <sys/time.h>
817835Sralph #else sane
917835Sralph #include <time.h>
1017835Sralph #endif sane
1113655Ssam 
12*23609Sbloom /*LINTLIBRARY*/
13*23609Sbloom 
1417835Sralph #ifdef GNXSEQ
1517835Sralph 
16*23609Sbloom /*
17*23609Sbloom  *	get next conversation sequence number
1813655Ssam  *
1913655Ssam  *	return - 0 no entry | >0 sequence number
2013655Ssam  */
2113655Ssam 
2213655Ssam gnxseq(rmtname)
2313655Ssam char *rmtname;
2413655Ssam {
2513655Ssam 	int count = 0, ct, ret, i;
2613655Ssam 	register struct tm *tp;
2713655Ssam 	extern struct tm *localtime();
2813655Ssam 	time_t clock;
2913655Ssam 	register FILE *fp0, *fp1;
3013655Ssam 	char buf[BUFSIZ], name[NAMESIZE];
3113655Ssam 
3213655Ssam 	if (access(SQFILE, 0) != 0)	/* nothing to do here */
3313655Ssam 		return(0);
3413655Ssam 
3513655Ssam 	for (i = 0; i < 5; i++) {
3613655Ssam 		if ((ret = ulockf(SQLOCK, (time_t)  SQTIME)) == 0)
3713655Ssam 			break;
3813655Ssam 		sleep(5);
3913655Ssam 	}
4013655Ssam 	if (ret != 0) {
4113655Ssam 		logent("CAN'T LOCK", SQLOCK);
4213655Ssam 		DEBUG(4, "can't lock %s\n", SQLOCK);
4313655Ssam 		return(0);
4413655Ssam 	}
4513655Ssam 	if ((fp0 = fopen(SQFILE, "r")) == NULL)
4613655Ssam 		return(0);
4713655Ssam 	if ((fp1 = fopen(SQTMP, "w")) == NULL) {
4813655Ssam 		fclose(fp0);
4913655Ssam 		return(0);
5013655Ssam 	}
5113655Ssam 	chmod(SQTMP, 0400);
5213655Ssam 
5313655Ssam 	while (fgets(buf, BUFSIZ, fp0) != NULL) {
5413655Ssam 		ret = sscanf(buf, "%s%d", name, &ct);
5513655Ssam 		if (ret < 2)
5613655Ssam 			ct = 0;
57*23609Sbloom 		name[MAXBASENAME] = '\0';
5813655Ssam 		if (ct > 9998)
5913655Ssam 			ct = 0;
60*23609Sbloom 		if (strncmp(rmtname, name, MAXBASENAME) != SAME) {
6113655Ssam 			fputs(buf, fp1);
6213655Ssam 			continue;
6313655Ssam 		}
6413655Ssam 
6513655Ssam 		/*  found name  */
6613655Ssam 		count = ++ct;
6713655Ssam 		time(&clock);
6813655Ssam 		tp = localtime(&clock);
6917835Sralph #ifdef USG
7017835Sralph 		fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct,
7113655Ssam 		  tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
7213655Ssam 		  tp->tm_min);
7317835Sralph #endif
7417835Sralph #ifndef USG
7517835Sralph 		fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct,
7617835Sralph 		  tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
7717835Sralph 		  tp->tm_min);
7817835Sralph #endif
7913655Ssam 		while (fgets(buf, BUFSIZ, fp0) != NULL)
8013655Ssam 			fputs(buf, fp1);
8113655Ssam 	}
8213655Ssam 	fclose(fp0);
8313655Ssam 	fclose(fp1);
8413655Ssam 	if (count == 0) {
8513655Ssam 		rmlock(SQLOCK);
8613655Ssam 		unlink(SQTMP);
8713655Ssam 	}
8813655Ssam 	return(count);
8913655Ssam }
9013655Ssam 
9113655Ssam 
9213655Ssam /***
9313655Ssam  *	cmtseq()	commit sequence update
9413655Ssam  *
9513655Ssam  *	return  0  ok | other - link failed
9613655Ssam  */
9713655Ssam 
9813655Ssam cmtseq()
9913655Ssam {
10013655Ssam 	register int ret;
10113655Ssam 
10217835Sralph 	if ((ret = access(SQTMP, 04)) != 0) {
10313655Ssam 		rmlock(SQLOCK);
10413655Ssam 		return(0);
10513655Ssam 	}
10613655Ssam 	unlink(SQFILE);
10713655Ssam 	ret = link(SQTMP, SQFILE);
10813655Ssam 	unlink(SQTMP);
10913655Ssam 	rmlock(SQLOCK);
11013655Ssam 	return(ret);
11113655Ssam }
11213655Ssam 
11313655Ssam /***
11413655Ssam  *	ulkseq()	unlock sequence file
11513655Ssam  */
11613655Ssam 
11713655Ssam ulkseq()
11813655Ssam {
11913655Ssam 	unlink(SQTMP);
12013655Ssam 	rmlock(SQLOCK);
12113655Ssam }
12217835Sralph #endif GNXSEQ
123