19677bed1Sbostic /*-
2*8216efb6Sbostic * Copyright (c) 1985, 1993
3*8216efb6Sbostic * The Regents of the University of California. All rights reserved.
49677bed1Sbostic *
59677bed1Sbostic * %sccs.include.proprietary.c%
69677bed1Sbostic */
79677bed1Sbostic
86c12252aSsam #ifndef lint
9*8216efb6Sbostic static char sccsid[] = "@(#)gnxseq.c 8.1 (Berkeley) 06/06/93";
109677bed1Sbostic #endif /* not lint */
116c12252aSsam
126c12252aSsam #include "uucp.h"
13c9dd95d8Sralph #ifdef BSD4_2
140d244a74Ssam #include <sys/time.h>
15c9dd95d8Sralph #else sane
16c9dd95d8Sralph #include <time.h>
17c9dd95d8Sralph #endif sane
18c9dd95d8Sralph
19fd99b45cSbloom /*LINTLIBRARY*/
20fd99b45cSbloom
21c9dd95d8Sralph #ifdef GNXSEQ
226c12252aSsam
23fd99b45cSbloom /*
24fd99b45cSbloom * get next conversation sequence number
256c12252aSsam *
266c12252aSsam * return - 0 no entry | >0 sequence number
276c12252aSsam */
286c12252aSsam
gnxseq(rmtname)296c12252aSsam gnxseq(rmtname)
306c12252aSsam char *rmtname;
316c12252aSsam {
326c12252aSsam int count = 0, ct, ret, i;
336c12252aSsam register struct tm *tp;
346c12252aSsam extern struct tm *localtime();
356c12252aSsam time_t clock;
366c12252aSsam register FILE *fp0, *fp1;
376c12252aSsam char buf[BUFSIZ], name[NAMESIZE];
386c12252aSsam
396c12252aSsam if (access(SQFILE, 0) != 0) /* nothing to do here */
406c12252aSsam return(0);
416c12252aSsam
426c12252aSsam for (i = 0; i < 5; i++) {
436c12252aSsam if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0)
446c12252aSsam break;
456c12252aSsam sleep(5);
466c12252aSsam }
476c12252aSsam if (ret != 0) {
486c12252aSsam logent("CAN'T LOCK", SQLOCK);
496c12252aSsam DEBUG(4, "can't lock %s\n", SQLOCK);
506c12252aSsam return(0);
516c12252aSsam }
526c12252aSsam if ((fp0 = fopen(SQFILE, "r")) == NULL)
536c12252aSsam return(0);
546c12252aSsam if ((fp1 = fopen(SQTMP, "w")) == NULL) {
556c12252aSsam fclose(fp0);
566c12252aSsam return(0);
576c12252aSsam }
586c12252aSsam chmod(SQTMP, 0400);
596c12252aSsam
606c12252aSsam while (fgets(buf, BUFSIZ, fp0) != NULL) {
616c12252aSsam ret = sscanf(buf, "%s%d", name, &ct);
626c12252aSsam if (ret < 2)
636c12252aSsam ct = 0;
64fd99b45cSbloom name[MAXBASENAME] = '\0';
656c12252aSsam if (ct > 9998)
666c12252aSsam ct = 0;
67fd99b45cSbloom if (strncmp(rmtname, name, MAXBASENAME) != SAME) {
686c12252aSsam fputs(buf, fp1);
696c12252aSsam continue;
706c12252aSsam }
716c12252aSsam
726c12252aSsam /* found name */
736c12252aSsam count = ++ct;
746c12252aSsam time(&clock);
756c12252aSsam tp = localtime(&clock);
76c9dd95d8Sralph #ifdef USG
77c9dd95d8Sralph fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct,
786c12252aSsam tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
796c12252aSsam tp->tm_min);
80c9dd95d8Sralph #endif
81c9dd95d8Sralph #ifndef USG
82c9dd95d8Sralph fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct,
83c9dd95d8Sralph tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
84c9dd95d8Sralph tp->tm_min);
85c9dd95d8Sralph #endif
866c12252aSsam while (fgets(buf, BUFSIZ, fp0) != NULL)
876c12252aSsam fputs(buf, fp1);
886c12252aSsam }
896c12252aSsam fclose(fp0);
906c12252aSsam fclose(fp1);
916c12252aSsam if (count == 0) {
926c12252aSsam rmlock(SQLOCK);
936c12252aSsam unlink(SQTMP);
946c12252aSsam }
956c12252aSsam return(count);
966c12252aSsam }
976c12252aSsam
986c12252aSsam
996c12252aSsam /***
1006c12252aSsam * cmtseq() commit sequence update
1016c12252aSsam *
1026c12252aSsam * return 0 ok | other - link failed
1036c12252aSsam */
1046c12252aSsam
cmtseq()1056c12252aSsam cmtseq()
1066c12252aSsam {
1076c12252aSsam register int ret;
1086c12252aSsam
109c9dd95d8Sralph if ((ret = access(SQTMP, 04)) != 0) {
1106c12252aSsam rmlock(SQLOCK);
1116c12252aSsam return(0);
1126c12252aSsam }
1136c12252aSsam unlink(SQFILE);
1146c12252aSsam ret = link(SQTMP, SQFILE);
1156c12252aSsam unlink(SQTMP);
1166c12252aSsam rmlock(SQLOCK);
1176c12252aSsam return(ret);
1186c12252aSsam }
1196c12252aSsam
1206c12252aSsam /***
1216c12252aSsam * ulkseq() unlock sequence file
1226c12252aSsam */
1236c12252aSsam
ulkseq()1246c12252aSsam ulkseq()
1256c12252aSsam {
1266c12252aSsam unlink(SQTMP);
1276c12252aSsam rmlock(SQLOCK);
1286c12252aSsam }
129c9dd95d8Sralph #endif GNXSEQ
130