xref: /csrg-svn/usr.bin/uucp/libuu/gnxseq.c (revision 17835)
113655Ssam #ifndef lint
2*17835Sralph static char sccsid[] = "@(#)gnxseq.c	5.3 (Berkeley) 01/22/85";
313655Ssam #endif
413655Ssam 
513655Ssam #include "uucp.h"
613655Ssam #include <sys/types.h>
7*17835Sralph #ifdef BSD4_2
813706Ssam #include <sys/time.h>
9*17835Sralph #else sane
10*17835Sralph #include <time.h>
11*17835Sralph #endif sane
1213655Ssam 
13*17835Sralph #ifdef GNXSEQ
14*17835Sralph 
1513655Ssam extern	time_t	time();
1613655Ssam 
1713655Ssam /*******
1813655Ssam  *	gnxseq(rmtname)		get next conversation sequence number
1913655Ssam  *	char *rmtname;
2013655Ssam  *
2113655Ssam  *	return - 0 no entry | >0 sequence number
2213655Ssam  */
2313655Ssam 
2413655Ssam gnxseq(rmtname)
2513655Ssam char *rmtname;
2613655Ssam {
2713655Ssam 	int count = 0, ct, ret, i;
2813655Ssam 	register struct tm *tp;
2913655Ssam 	extern struct tm *localtime();
3013655Ssam 	time_t clock;
3113655Ssam 	register FILE *fp0, *fp1;
3213655Ssam 	char buf[BUFSIZ], name[NAMESIZE];
3313655Ssam 
3413655Ssam 	if (access(SQFILE, 0) != 0)	/* nothing to do here */
3513655Ssam 		return(0);
3613655Ssam 
3713655Ssam 	for (i = 0; i < 5; i++) {
3813655Ssam 		if ((ret = ulockf(SQLOCK, (time_t)  SQTIME)) == 0)
3913655Ssam 			break;
4013655Ssam 		sleep(5);
4113655Ssam 	}
4213655Ssam 	if (ret != 0) {
4313655Ssam 		logent("CAN'T LOCK", SQLOCK);
4413655Ssam 		DEBUG(4, "can't lock %s\n", SQLOCK);
4513655Ssam 		return(0);
4613655Ssam 	}
4713655Ssam 	if ((fp0 = fopen(SQFILE, "r")) == NULL)
4813655Ssam 		return(0);
4913655Ssam 	if ((fp1 = fopen(SQTMP, "w")) == NULL) {
5013655Ssam 		fclose(fp0);
5113655Ssam 		return(0);
5213655Ssam 	}
5313655Ssam 	chmod(SQTMP, 0400);
5413655Ssam 
5513655Ssam 	while (fgets(buf, BUFSIZ, fp0) != NULL) {
5613655Ssam 		ret = sscanf(buf, "%s%d", name, &ct);
5713655Ssam 		if (ret < 2)
5813655Ssam 			ct = 0;
5913655Ssam 		name[7] = '\0';
6013655Ssam 		if (ct > 9998)
6113655Ssam 			ct = 0;
6213655Ssam 		if (strcmp(rmtname, name) != SAME) {
6313655Ssam 			fputs(buf, fp1);
6413655Ssam 			continue;
6513655Ssam 		}
6613655Ssam 
6713655Ssam 		/*  found name  */
6813655Ssam 		count = ++ct;
6913655Ssam 		time(&clock);
7013655Ssam 		tp = localtime(&clock);
71*17835Sralph #ifdef USG
72*17835Sralph 		fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct,
7313655Ssam 		  tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
7413655Ssam 		  tp->tm_min);
75*17835Sralph #endif
76*17835Sralph #ifndef USG
77*17835Sralph 		fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct,
78*17835Sralph 		  tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
79*17835Sralph 		  tp->tm_min);
80*17835Sralph #endif
8113655Ssam 		while (fgets(buf, BUFSIZ, fp0) != NULL)
8213655Ssam 			fputs(buf, fp1);
8313655Ssam 	}
8413655Ssam 	fclose(fp0);
8513655Ssam 	fclose(fp1);
8613655Ssam 	if (count == 0) {
8713655Ssam 		rmlock(SQLOCK);
8813655Ssam 		unlink(SQTMP);
8913655Ssam 	}
9013655Ssam 	return(count);
9113655Ssam }
9213655Ssam 
9313655Ssam 
9413655Ssam /***
9513655Ssam  *	cmtseq()	commit sequence update
9613655Ssam  *
9713655Ssam  *	return  0  ok | other - link failed
9813655Ssam  */
9913655Ssam 
10013655Ssam cmtseq()
10113655Ssam {
10213655Ssam 	register int ret;
10313655Ssam 
104*17835Sralph 	if ((ret = access(SQTMP, 04)) != 0) {
10513655Ssam 		rmlock(SQLOCK);
10613655Ssam 		return(0);
10713655Ssam 	}
10813655Ssam 	unlink(SQFILE);
10913655Ssam 	ret = link(SQTMP, SQFILE);
11013655Ssam 	unlink(SQTMP);
11113655Ssam 	rmlock(SQLOCK);
11213655Ssam 	return(ret);
11313655Ssam }
11413655Ssam 
11513655Ssam /***
11613655Ssam  *	ulkseq()	unlock sequence file
11713655Ssam  */
11813655Ssam 
11913655Ssam ulkseq()
12013655Ssam {
12113655Ssam 	unlink(SQTMP);
12213655Ssam 	rmlock(SQLOCK);
12313655Ssam }
124*17835Sralph #endif GNXSEQ
125