xref: /csrg-svn/usr.bin/uucp/libuu/gnxseq.c (revision 13706)
113655Ssam #ifndef lint
2*13706Ssam static char sccsid[] = "@(#)gnxseq.c	5.2 (Berkeley) 07/02/83";
313655Ssam #endif
413655Ssam 
513655Ssam #include "uucp.h"
613655Ssam #include <sys/types.h>
7*13706Ssam #include <sys/time.h>
813655Ssam 
913655Ssam extern	time_t	time();
1013655Ssam 
1113655Ssam /*******
1213655Ssam  *	gnxseq(rmtname)		get next conversation sequence number
1313655Ssam  *	char *rmtname;
1413655Ssam  *
1513655Ssam  *	return - 0 no entry | >0 sequence number
1613655Ssam  */
1713655Ssam 
1813655Ssam gnxseq(rmtname)
1913655Ssam char *rmtname;
2013655Ssam {
2113655Ssam 	int count = 0, ct, ret, i;
2213655Ssam 	register struct tm *tp;
2313655Ssam 	extern struct tm *localtime();
2413655Ssam 	time_t clock;
2513655Ssam 	register FILE *fp0, *fp1;
2613655Ssam 	char buf[BUFSIZ], name[NAMESIZE];
2713655Ssam 
2813655Ssam 	if (access(SQFILE, 0) != 0)	/* nothing to do here */
2913655Ssam 		return(0);
3013655Ssam 
3113655Ssam 	for (i = 0; i < 5; i++) {
3213655Ssam 		if ((ret = ulockf(SQLOCK, (time_t)  SQTIME)) == 0)
3313655Ssam 			break;
3413655Ssam 		sleep(5);
3513655Ssam 	}
3613655Ssam 	if (ret != 0) {
3713655Ssam 		logent("CAN'T LOCK", SQLOCK);
3813655Ssam 		DEBUG(4, "can't lock %s\n", SQLOCK);
3913655Ssam 		return(0);
4013655Ssam 	}
4113655Ssam 	if ((fp0 = fopen(SQFILE, "r")) == NULL)
4213655Ssam 		return(0);
4313655Ssam 	if ((fp1 = fopen(SQTMP, "w")) == NULL) {
4413655Ssam 		fclose(fp0);
4513655Ssam 		return(0);
4613655Ssam 	}
4713655Ssam 	chmod(SQTMP, 0400);
4813655Ssam 
4913655Ssam 	while (fgets(buf, BUFSIZ, fp0) != NULL) {
5013655Ssam 		ret = sscanf(buf, "%s%d", name, &ct);
5113655Ssam 		if (ret < 2)
5213655Ssam 			ct = 0;
5313655Ssam 		name[7] = '\0';
5413655Ssam 		if (ct > 9998)
5513655Ssam 			ct = 0;
5613655Ssam 		if (strcmp(rmtname, name) != SAME) {
5713655Ssam 			fputs(buf, fp1);
5813655Ssam 			continue;
5913655Ssam 		}
6013655Ssam 
6113655Ssam 		/*  found name  */
6213655Ssam 		count = ++ct;
6313655Ssam 		time(&clock);
6413655Ssam 		tp = localtime(&clock);
6513655Ssam 		fprintf(fp1, "%s %d %d/%d-%d:%02d\n", name, ct,
6613655Ssam 		  tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
6713655Ssam 		  tp->tm_min);
6813655Ssam 		while (fgets(buf, BUFSIZ, fp0) != NULL)
6913655Ssam 			fputs(buf, fp1);
7013655Ssam 	}
7113655Ssam 	fclose(fp0);
7213655Ssam 	fclose(fp1);
7313655Ssam 	if (count == 0) {
7413655Ssam 		rmlock(SQLOCK);
7513655Ssam 		unlink(SQTMP);
7613655Ssam 	}
7713655Ssam 	return(count);
7813655Ssam }
7913655Ssam 
8013655Ssam 
8113655Ssam /***
8213655Ssam  *	cmtseq()	commit sequence update
8313655Ssam  *
8413655Ssam  *	return  0  ok | other - link failed
8513655Ssam  */
8613655Ssam 
8713655Ssam cmtseq()
8813655Ssam {
8913655Ssam 	register int ret;
9013655Ssam 
9113655Ssam 	if ((ret = access(SQTMP, 0400)) != 0) {
9213655Ssam 		rmlock(SQLOCK);
9313655Ssam 		return(0);
9413655Ssam 	}
9513655Ssam 	unlink(SQFILE);
9613655Ssam 	ret = link(SQTMP, SQFILE);
9713655Ssam 	unlink(SQTMP);
9813655Ssam 	rmlock(SQLOCK);
9913655Ssam 	return(ret);
10013655Ssam }
10113655Ssam 
10213655Ssam /***
10313655Ssam  *	ulkseq()	unlock sequence file
10413655Ssam  */
10513655Ssam 
10613655Ssam ulkseq()
10713655Ssam {
10813655Ssam 	unlink(SQTMP);
10913655Ssam 	rmlock(SQLOCK);
11013655Ssam }
111