BSD 4_1c_2 release
[unix-history] / usr / src / usr.bin / uucp / gnxseq.c
static char sccsid[] = "@(#)gnxseq.c 4.1 (Berkeley) 9/11/82";
#include "uucp.h"
#include <sys/types.h>
#include <time.h>
/*******
* gnxseq(rmtname) get next conversation sequence number
* char *rmtname;
*
* return - 0 no entry | >0 sequence number
*/
gnxseq(rmtname)
char *rmtname;
{
int count = 0, ct, ret, i;
struct tm *tp;
extern struct tm *localtime();
time_t clock;
FILE *fp0, *fp1;
char buf[BUFSIZ], name[NAMESIZE];
for (i = 0; i < 5; i++) {
if ((ret = ulockf(SQLOCK, SQTIME)) == 0)
break;
sleep(5);
}
if (ret != 0) {
logent("CAN'T LOCK", SQLOCK);
DEBUG(4, "can't lock %s\n", SQLOCK);
return(0);
}
if ((fp0 = fopen(SQFILE, "r")) == NULL)
return(0);
if ((fp1 = fopen(SQTMP, "w")) == NULL) {
fclose(fp0);
return(0);
}
chmod(SQTMP, 0400);
while (fgets(buf, BUFSIZ, fp0) != NULL) {
ret = sscanf(buf, "%s%d", name, &ct);
if (ret < 2)
ct = 0;
name[7] = '\0';
if (ct > 9998)
ct = 0;
if (strcmp(rmtname, name) != SAME) {
fputs(buf, fp1);
continue;
}
/* found name */
count = ++ct;
time(&clock);
tp = localtime(&clock);
fprintf(fp1, "%s %d %d/%d-%d:%d\n", name, ct,
tp->tm_mon + 1, tp->tm_mday, tp->tm_hour,
tp->tm_min);
while (fgets(buf, BUFSIZ, fp0) != NULL)
fputs(buf, fp1);
}
fclose(fp0);
fclose(fp1);
if (count == 0) {
rmlock(SQLOCK);
unlink(SQTMP);
}
return(count);
}
/***
* cmtseq() commit sequence update
*
* return 0 ok | other - link failed
*/
cmtseq()
{
int ret;
if ((ret = access(SQTMP, 0400)) != 0) {
rmlock(SQLOCK);
return(0);
}
unlink(SQFILE);
ret = link(SQTMP, SQFILE);
unlink(SQTMP);
rmlock(SQLOCK);
return(ret);
}
/***
* ulkseq() unlock sequence file
*/
ulkseq()
{
unlink(SQTMP);
rmlock(SQLOCK);
}