|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T g
Length: 8857 (0x2299)
Types: TextFile
Names: »getdtent.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦653021b30⟧ »EurOpenD3/utils/downtime.tar.Z«
└─⟦946c717da⟧
└─⟦this⟧ »getdtent.c«
/*
* Copyright (c) 1988 Michael A. Cooper, University of Southern California.
* This program may be used, copied, modified, and redistributed freely
* for noncommercial purposes, so long as this notice remains intact.
*/
#ifndef lint
static char *RCSid = "$Header: getdtent.c,v 4.3 88/07/05 15:59:47 mcooper Exp $";
#endif
/*
*------------------------------------------------------------------
*
* $Source: /usr/skat3/src/common/usc/etc/downtime/RCS/getdtent.c,v $
* $Revision: 4.3 $
* $Date: 88/07/05 15:59:47 $
* $State: Exp $
*
*------------------------------------------------------------------
*
* Michael A. Cooper
* Research and Development Group
* University Computing Services
* University of Southern California
* (mcooper@oberon.USC.EDU)
*
*------------------------------------------------------------------
*
* $Log: getdtent.c,v $
* Revision 4.3 88/07/05 15:59:47 mcooper
* Added copyright notice.
*
* Revision 4.2 88/06/30 10:07:09 mcooper
* Fixed -u problem that caused no checktime()
* to be run.
*
* Revision 4.1 88/05/24 13:29:46 mcooper
* General cleanup.
*
* Revision 4.0 88/04/20 15:42:22 mcooper
*
*
* Revision 3.5 88/04/20 13:37:34 mcooper
* Replace F_BROADCAST with F_MSG_REMOTE.
* Added F_MSG_LOCAL.
*
* Revision 3.4 88/04/11 19:48:14 mcooper
* Converted all dt_flags to use flag
* bits.
*
* Revision 3.3 88/03/15 14:42:25 mcooper
* Malloc dt_shutter and dt_reason.
*
* Revision 3.2 88/03/02 16:10:29 mcooper
* Cleanup time.
*
* Revision 3.1 88/01/21 20:28:56 mcooper
* Port to Alliant (Concentrix 3.0).
*
* Revision 3.0 87/07/24 14:19:02 mcooper
* Version 3.
*
*------------------------------------------------------------------
*/
#include "defs.h"
#include "getdtent.h"
static FILE *fddata = NULL;
/*
* dtclose - Close data file
*/
dtclose()
{
if (fddata)
fclose(fddata);
}
/*
* dtrewind - Rewind data file
*/
dtrewind()
{
if (fddata != NULL)
fclose(fddata);
if ((fddata = fopen(datafile, "r")) == NULL) {
return(-1);
}
return(0);
}
char *
mkflags(flags)
int flags;
{
char buf[FC_END+1];
strcpy(buf, "");
if (flags & F_KILL)
buf[FC_HOW] = FC_KILL;
else if (flags & F_HALT)
buf[FC_HOW] = FC_HALT;
else if (flags & F_REBOOT)
buf[FC_HOW] = FC_REBOOT;
else if (flags & F_FAKE)
buf[FC_HOW] = FC_FAKE;
else
buf[FC_HOW] = FC_NULL;
if (flags & F_MOTD) {
if (flags & F_DONEMOTD)
buf[FC_MOTD] = FC_DONE;
else
buf[FC_MOTD] = FC_YES;
} else {
buf[FC_MOTD] = FC_NO;
}
if (flags & F_MSG_REMOTE)
buf[FC_MSG_REMOTE] = FC_YES;
else
buf[FC_MSG_REMOTE] = FC_NO;
if (flags & F_MSG_LOCAL)
buf[FC_MSG_LOCAL] = FC_YES;
else
buf[FC_MSG_LOCAL] = FC_NO;
if (flags & F_FASTBOOT)
buf[FC_FTSY] = FC_FASTBOOT;
else if (flags & F_NOSYNC)
buf[FC_FTSY] = FC_NOSYNC;
else
buf[FC_FTSY] = FC_NULL;
if (flags & F_SHUTMSG_ONE)
buf[FC_SHUTMSG] = FC_SHUTMSG_ONE;
else
buf[FC_SHUTMSG] = FC_SHUTMSG_VER;
buf[FC_END] = NULL;
return(newstr(buf));
}
/*
* mkdtline - Make a downtime datafile line.
*/
char *
mkdtline(d)
struct downtime *d;
{
char buf[BUFSIZ];
(void) sprintf(buf, "%s %s %s %d %s %s %s '%s'\n",
ttod(d->dt_down),
ttod(d->dt_up),
ttod(d->dt_orderdown),
d->dt_islocked,
d->dt_shutter,
d->dt_host,
mkflags(d->dt_flags),
d->dt_reason);
return(newstr(buf));
}
getflags(str)
char *str;
{
int flags = 0;
switch (str[FC_HOW]) {
case FC_NULL:
case FC_KILL:
flags |= F_KILL;
break;
case FC_HALT:
flags |= F_HALT;
break;
case FC_REBOOT:
flags |= F_REBOOT;
break;
case FC_FAKE:
flags |= F_FAKE;
break;
default:
fprintf(stderr, "getflags: Unknown take down character `%c'.\n",
str[FC_HOW]);
return(-1);
}
switch (str[FC_FTSY]) {
case FC_FASTBOOT:
flags |= F_FASTBOOT;
break;
case FC_NOSYNC:
flags |= F_NOSYNC;
break;
case FC_NULL:
break;
default:
fprintf(stderr, "getflags: Unknown fastboot/nosync character `%s'.\n",
str[FC_FTSY]);
return(-1);
}
switch (str[FC_SHUTMSG]) {
case FC_SHUTMSG_ONE:
flags |= F_SHUTMSG_ONE;
break;
case FC_SHUTMSG_VER:
flags |= F_SHUTMSG_VER;
break;
case FC_NULL:
break;
default:
fprintf(stderr, "getflags: Unknown shutmsg character `%s'.\n",
str[FC_SHUTMSG]);
return(-1);
}
switch (str[FC_MOTD]) {
case FC_DONE:
flags |= F_DONEMOTD;
case FC_YES:
flags |= F_MOTD;
break;
case FC_NO:
case FC_NULL:
break;
default:
fprintf(stderr, "getflags: Unknown motd character `%s'.\n",
str[FC_SHUTMSG]);
return(-1);
}
if (str[FC_MSG_REMOTE] == FC_YES)
flags |= F_MSG_REMOTE;
if (str[FC_MSG_LOCAL] == FC_YES)
flags |= F_MSG_LOCAL;
return(flags);
}
/*
* getdtent() - For each call to getdtent(), it returns a pointer
* to the next downtime struct found in the data file.
*
* Returns NULL at EOF.
*/
char tmp[9][200], dbuf[BUFSIZ];
struct downtime *
getdtent()
{
struct downtime *dt;
int done;
if (fddata == NULL) {
if ((fddata = fopen(datafile, "r")) == NULL) {
dprintf("fopen failed on %s.\n", datafile);
return(NULL);
}
}
done = FALSE;
if (fgets(dbuf, sizeof(dbuf), fddata) == NULL)
done = TRUE;
if (done)
return(NULL);
tmp[0][0] = NULL;
sscanf(dbuf, "%s %s %s %s %s %s %s '%[^']",
tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7]);
if (tmp[0][0] == NULL) {
return(NULL);
}
dt = (struct downtime *) xmalloc(sizeof(struct downtime));
dt->dt_shutter = xmalloc(strlen(tmp[4])+1);
dt->dt_reason = xmalloc(strlen(tmp[7])+1);
dt->dt_down = dtot(tmp[0]);
dt->dt_up = dtot(tmp[1]);
dt->dt_orderdown = dtot(tmp[2]);
dt->dt_islocked = atoi(tmp[3]);
dt->dt_flags = getflags(tmp[6]);
strcpy(dt->dt_shutter, tmp[4]);
strcpy(dt->dt_host, tmp[5]);
strcpy(dt->dt_reason, tmp[7]);
return(dt);
}
/*
* getdtdate - get entry for "date". Date is of form:
*
* MM/DD/YY-HH:MM
*/
struct downtime *
getdtdate(date)
char *date;
{
struct downtime *d;
dtrewind();
while (d = getdtent()) {
if (strncmp(ttod(d->dt_down), date, strlen(date)) == 0) {
return(d);
}
}
return(NULL);
}
dtlock(d, how)
struct downtime *d;
int how;
{
struct downtime *tmpdt;
char *date, *p;
char tmpfile[200];
int found_it = FALSE;
int did_it = FALSE;
FILE *fdtmp;
dtrewind();
if (d != NULL) {
date = ttod(d->dt_down);
}
sprintf(tmpfile, "%s.tmpXXXXXX", datafile);
mktemp(tmpfile);
if ((fdtmp = fopen(tmpfile, "w")) == NULL) {
perror(tmpfile);
return(-1);
}
while (tmpdt = getdtent()) {
did_it = FALSE;
if (uflag && tmpdt->dt_islocked) {
if (!iflag)
printf("%s: ", prog);
printf(" Unlocking [%s] ... ", mkdate(tmpdt->dt_down, D_DATE));
did_it = TRUE;
}
if (uflag || strncmp(ttod(tmpdt->dt_down), date, strlen(date)) == 0) {
found_it = TRUE;
if (tmpdt->dt_islocked && !uflag) {
fprintf(stderr, "Entry for %s is already locked.\n", date);
return(-1);
}
if (how == L_LOCK)
tmpdt->dt_islocked = getpid();
else if (how == L_UNLOCK)
tmpdt->dt_islocked = 0;
if (d != NULL)
tmpdt->dt_flags = d->dt_flags;
}
if ((p = mkdtline(tmpdt)) == NULL) {
fprintf(stderr, "dtlock: mkdtline failed.\n");
return(-1);
}
fputs(p, fdtmp);
if (uflag && did_it)
printf(" done.\n");
}
fclose(fdtmp);
dtclose();
unlink(datafile);
if (rename(tmpfile, datafile) < 0) {
fprintf(stderr, "%s --> ", tmpfile);
perror(datafile);
return(-1);
}
if (!found_it && !uflag) {
fprintf(stderr, "dtlock: Cannot lock entry for %s: No entry found.\n",
date);
return(-1);
}
return(0);
}
dtfileislocked()
{
if (access(LOCKFILE, F_OK) == 0)
return(TRUE);
else
return(FALSE);
}
dtfilewaitlock()
{
register int r;
for (r = 0;r <= LOCKRETRIES && access(LOCKFILE, F_OK) == 0;++r) {
sleep(1);
}
return(dtfileislocked());
}
dtfilelock()
{
FILE *fd;
if (dtfileislocked()) {
if (dtfilewaitlock()) {
fprintf(stderr, "%s: File is locked by `%s'.\n", datafile, LOCKFILE);
return(-1);
}
}
if ((fd = fopen(LOCKFILE, "w")) == NULL) {
fprintf(stderr, "%s: Cannot create lock file: ", datafile);
perror(LOCKFILE);
return(-1);
}
fclose(fd);
return(0);
}
dtfileunlock()
{
if (!dtfileislocked()) {
fprintf(stderr, "%s: Cannot remove lock: File is not locked.\n",
datafile);
return(-1);
}
if (unlink(LOCKFILE) < 0) {
fprintf(stderr, "%s: Cannot remove lock: ", LOCKFILE);
perror();
return(-1);
}
return(0);
}