148652Sbostic /*-
2*62386Sbostic * Copyright (c) 1985, 1993
3*62386Sbostic * The Regents of the University of California. All rights reserved.
448652Sbostic *
548652Sbostic * %sccs.include.proprietary.c%
648652Sbostic */
748652Sbostic
813655Ssam #ifndef lint
9*62386Sbostic static char sccsid[] = "@(#)gnxseq.c 8.1 (Berkeley) 06/06/93";
1048652Sbostic #endif /* not lint */
1113655Ssam
1213655Ssam #include "uucp.h"
1317835Sralph #ifdef BSD4_2
1413706Ssam #include <sys/time.h>
1517835Sralph #else sane
1617835Sralph #include <time.h>
1717835Sralph #endif sane
1813655Ssam
1923609Sbloom /*LINTLIBRARY*/
2023609Sbloom
2117835Sralph #ifdef GNXSEQ
2217835Sralph
2323609Sbloom /*
2423609Sbloom * get next conversation sequence number
2513655Ssam *
2613655Ssam * return - 0 no entry | >0 sequence number
2713655Ssam */
2813655Ssam
gnxseq(rmtname)2913655Ssam gnxseq(rmtname)
3013655Ssam char *rmtname;
3113655Ssam {
3213655Ssam int count = 0, ct, ret, i;
3313655Ssam register struct tm *tp;
3413655Ssam extern struct tm *localtime();
3513655Ssam time_t clock;
3613655Ssam register FILE *fp0, *fp1;
3713655Ssam char buf[BUFSIZ], name[NAMESIZE];
3813655Ssam
3913655Ssam if (access(SQFILE, 0) != 0) /* nothing to do here */
4013655Ssam return(0);
4113655Ssam
4213655Ssam for (i = 0; i < 5; i++) {
4313655Ssam if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0)
4413655Ssam break;
4513655Ssam sleep(5);
4613655Ssam }
4713655Ssam if (ret != 0) {
4813655Ssam logent("CAN'T LOCK", SQLOCK);
4913655Ssam DEBUG(4, "can't lock %s\n", SQLOCK);
5013655Ssam return(0);
5113655Ssam }
5213655Ssam if ((fp0 = fopen(SQFILE, "r")) == NULL)
5313655Ssam return(0);
5413655Ssam if ((fp1 = fopen(SQTMP, "w")) == NULL) {
5513655Ssam fclose(fp0);
5613655Ssam return(0);
5713655Ssam }
5813655Ssam chmod(SQTMP, 0400);
5913655Ssam
6013655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL) {
6113655Ssam ret = sscanf(buf, "%s%d", name, &ct);
6213655Ssam if (ret < 2)
6313655Ssam ct = 0;
6423609Sbloom name[MAXBASENAME] = '\0';
6513655Ssam if (ct > 9998)
6613655Ssam ct = 0;
6723609Sbloom if (strncmp(rmtname, name, MAXBASENAME) != SAME) {
6813655Ssam fputs(buf, fp1);
6913655Ssam continue;
7013655Ssam }
7113655Ssam
7213655Ssam /* found name */
7313655Ssam count = ++ct;
7413655Ssam time(&clock);
7513655Ssam tp = localtime(&clock);
7617835Sralph #ifdef USG
7717835Sralph fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct,
7813655Ssam tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
7913655Ssam tp->tm_min);
8017835Sralph #endif
8117835Sralph #ifndef USG
8217835Sralph fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct,
8317835Sralph tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
8417835Sralph tp->tm_min);
8517835Sralph #endif
8613655Ssam while (fgets(buf, BUFSIZ, fp0) != NULL)
8713655Ssam fputs(buf, fp1);
8813655Ssam }
8913655Ssam fclose(fp0);
9013655Ssam fclose(fp1);
9113655Ssam if (count == 0) {
9213655Ssam rmlock(SQLOCK);
9313655Ssam unlink(SQTMP);
9413655Ssam }
9513655Ssam return(count);
9613655Ssam }
9713655Ssam
9813655Ssam
9913655Ssam /***
10013655Ssam * cmtseq() commit sequence update
10113655Ssam *
10213655Ssam * return 0 ok | other - link failed
10313655Ssam */
10413655Ssam
cmtseq()10513655Ssam cmtseq()
10613655Ssam {
10713655Ssam register int ret;
10813655Ssam
10917835Sralph if ((ret = access(SQTMP, 04)) != 0) {
11013655Ssam rmlock(SQLOCK);
11113655Ssam return(0);
11213655Ssam }
11313655Ssam unlink(SQFILE);
11413655Ssam ret = link(SQTMP, SQFILE);
11513655Ssam unlink(SQTMP);
11613655Ssam rmlock(SQLOCK);
11713655Ssam return(ret);
11813655Ssam }
11913655Ssam
12013655Ssam /***
12113655Ssam * ulkseq() unlock sequence file
12213655Ssam */
12313655Ssam
ulkseq()12413655Ssam ulkseq()
12513655Ssam {
12613655Ssam unlink(SQTMP);
12713655Ssam rmlock(SQLOCK);
12813655Ssam }
12917835Sralph #endif GNXSEQ
130