1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 23 /* All Rights Reserved */ 24 25 26 #ident "%Z%%M% %I% %E% SMI" /* from SVR4 bnu:gnxseq.c 2.5 */ 27 28 #include "uucp.h" 29 30 /* 31 * get next conversation sequence number 32 * rmtname -> name of remote system 33 * returns: 34 * 0 -> no entery 35 * 1 -> 0 sequence number 36 */ 37 int 38 gnxseq(rmtname) 39 char *rmtname; 40 { 41 register FILE *fp0, *fp1; 42 register struct tm *tp; 43 int count = 0, ct, ret; 44 char buf[BUFSIZ], name[NAMESIZE]; 45 time_t clock; 46 47 if (access(SQFILE, 0) != 0) 48 return(0); 49 50 { 51 register int i; 52 for (i = 0; i < 5; i++) 53 if ( (ret = mklock(SQLOCK)) == SUCCESS ) 54 break; 55 sleep(5); 56 } 57 if (ret != SUCCESS) { 58 logent("CAN'T LOCK", SQLOCK); 59 DEBUG(4, "can't lock %s\n", SQLOCK); 60 return(0); 61 } 62 if ((fp0 = fopen(SQFILE, "r")) == NULL) 63 return(0); 64 if ((fp1 = fopen(SQTMP, "w")) == NULL) { 65 fclose(fp0); 66 return(0); 67 } 68 chmod(SQTMP, DFILEMODE); 69 70 while (fgets(buf, BUFSIZ, fp0) != NULL) { 71 ret = sscanf(buf, "%s%d", name, &ct); 72 if (ret < 2) 73 ct = 0; 74 name[7] = '\0'; 75 if (ct > 9998) 76 ct = 0; 77 if (strncmp(rmtname, name, SYSNSIZE) != SAME) { 78 fputs(buf, fp1); 79 continue; 80 } 81 82 /* 83 * found name 84 */ 85 count = ++ct; 86 time(&clock); 87 tp = localtime(&clock); 88 fprintf(fp1, "%s %d %d/%d-%d:%2.2d\n", name, ct, 89 tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, 90 tp->tm_min); 91 92 /* 93 * write should be checked 94 */ 95 while (fgets(buf, BUFSIZ, fp0) != NULL) 96 fputs(buf, fp1); 97 } 98 fclose(fp0); 99 fclose(fp1); 100 if (count == 0) { 101 rmlock(SQLOCK); 102 unlink(SQTMP); 103 } 104 return(count); 105 } 106 107 /* 108 * commit sequence update 109 * returns: 110 * 0 -> ok 111 * other -> link failed 112 */ 113 int 114 cmtseq() 115 { 116 register int ret; 117 118 if ((ret = access(SQTMP, 0)) != 0) { 119 rmlock(SQLOCK); 120 return(0); 121 } 122 unlink(SQFILE); 123 ret = link(SQTMP, SQFILE); 124 unlink(SQTMP); 125 rmlock(SQLOCK); 126 return(ret); 127 } 128 129 /* 130 * unlock sequence file 131 */ 132 void 133 ulkseq() 134 { 135 unlink(SQTMP); 136 rmlock(SQLOCK); 137 return; 138 } 139