1 /*- 2 * Copyright (c) 1985 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)gnxseq.c 5.5 (Berkeley) 04/24/91"; 10 #endif /* not lint */ 11 12 #include "uucp.h" 13 #ifdef BSD4_2 14 #include <sys/time.h> 15 #else sane 16 #include <time.h> 17 #endif sane 18 19 /*LINTLIBRARY*/ 20 21 #ifdef GNXSEQ 22 23 /* 24 * get next conversation sequence number 25 * 26 * return - 0 no entry | >0 sequence number 27 */ 28 29 gnxseq(rmtname) 30 char *rmtname; 31 { 32 int count = 0, ct, ret, i; 33 register struct tm *tp; 34 extern struct tm *localtime(); 35 time_t clock; 36 register FILE *fp0, *fp1; 37 char buf[BUFSIZ], name[NAMESIZE]; 38 39 if (access(SQFILE, 0) != 0) /* nothing to do here */ 40 return(0); 41 42 for (i = 0; i < 5; i++) { 43 if ((ret = ulockf(SQLOCK, (time_t) SQTIME)) == 0) 44 break; 45 sleep(5); 46 } 47 if (ret != 0) { 48 logent("CAN'T LOCK", SQLOCK); 49 DEBUG(4, "can't lock %s\n", SQLOCK); 50 return(0); 51 } 52 if ((fp0 = fopen(SQFILE, "r")) == NULL) 53 return(0); 54 if ((fp1 = fopen(SQTMP, "w")) == NULL) { 55 fclose(fp0); 56 return(0); 57 } 58 chmod(SQTMP, 0400); 59 60 while (fgets(buf, BUFSIZ, fp0) != NULL) { 61 ret = sscanf(buf, "%s%d", name, &ct); 62 if (ret < 2) 63 ct = 0; 64 name[MAXBASENAME] = '\0'; 65 if (ct > 9998) 66 ct = 0; 67 if (strncmp(rmtname, name, MAXBASENAME) != SAME) { 68 fputs(buf, fp1); 69 continue; 70 } 71 72 /* found name */ 73 count = ++ct; 74 time(&clock); 75 tp = localtime(&clock); 76 #ifdef USG 77 fprintf(fp1, "%s %d %d/%d-%2.2d:%2.2d\n", name, ct, 78 tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 79 tp->tm_min); 80 #endif 81 #ifndef USG 82 fprintf(fp1, "%s %d %d/%d-%02d:%02d\n", name, ct, 83 tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 84 tp->tm_min); 85 #endif 86 while (fgets(buf, BUFSIZ, fp0) != NULL) 87 fputs(buf, fp1); 88 } 89 fclose(fp0); 90 fclose(fp1); 91 if (count == 0) { 92 rmlock(SQLOCK); 93 unlink(SQTMP); 94 } 95 return(count); 96 } 97 98 99 /*** 100 * cmtseq() commit sequence update 101 * 102 * return 0 ok | other - link failed 103 */ 104 105 cmtseq() 106 { 107 register int ret; 108 109 if ((ret = access(SQTMP, 04)) != 0) { 110 rmlock(SQLOCK); 111 return(0); 112 } 113 unlink(SQFILE); 114 ret = link(SQTMP, SQFILE); 115 unlink(SQTMP); 116 rmlock(SQLOCK); 117 return(ret); 118 } 119 120 /*** 121 * ulkseq() unlock sequence file 122 */ 123 124 ulkseq() 125 { 126 unlink(SQTMP); 127 rmlock(SQLOCK); 128 } 129 #endif GNXSEQ 130