|
|
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 m
Length: 5807 (0x16af)
Types: TextFile
Names: »motd.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦653021b30⟧ »EurOpenD3/utils/downtime.tar.Z«
└─⟦946c717da⟧
└─⟦this⟧ »motd.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: motd.c,v 4.2 88/07/05 16:00:45 mcooper Exp $";
#endif
/*
*------------------------------------------------------------------
*
* $Source: /usr/skat3/src/common/usc/etc/downtime/RCS/motd.c,v $
* $Revision: 4.2 $
* $Date: 88/07/05 16:00:45 $
* $State: Exp $
*
*------------------------------------------------------------------
*
* Michael A. Cooper
* Research and Development Group
* University Computing Services
* University of Southern California
* (mcooper@oberon.USC.EDU)
*
*------------------------------------------------------------------
*
* $Log: motd.c,v $
* Revision 4.2 88/07/05 16:00:45 mcooper
* Added copyright notice.
*
* Revision 4.1 88/05/23 15:40:42 mcooper
* All tm tm_mon members are now 0-11
* instead of 1-12 for compat. with
* the normal BSD time routines.
*
* Revision 4.0 88/04/20 15:43:03 mcooper
* Version 4.
*
* Revision 3.6 88/04/19 16:50:28 mcooper
* Fixed problem in delmotd() that caused trailing
* blank lines to sometimes be deleted.
*
* Revision 3.5 88/04/19 16:19:15 mcooper
* Do more checking for preceeding and trailing blank
* lines in the motd file.
*
* Revision 3.4 88/03/02 16:10:50 mcooper
* Cleanup time.
*
* Revision 3.3 87/12/16 14:31:34 mcooper
* Fixed bug in delmotd() that sometimes
* caused random blank lines to be deleted
* from /etc/motd.
*
* Revision 3.2 87/12/16 13:56:51 mcooper
* Stupid kludge in addmotd to make
* sun4's happy.
*
* Revision 3.1 87/12/11 18:12:55 mcooper
* The first line of a motd message now
* contains the current date to be consistant
* with the way we make /etc/motd entries.
*
* Revision 3.0 87/07/24 14:20:51 mcooper
* Version 3.
*
*------------------------------------------------------------------
*/
#include "defs.h"
#define MOTD_MSG1 "\tSystem downtime scheduled for"
#define MOTD_MSG2 "\tThe system will be down for:"
#define MOTD_MSG3 "\tExpected back up"
#define MSG_LEN(s) (70 - strlen(s))
/*
* addmotd - Add a message to the message of the day.
*/
addmotd(dt)
struct downtime *dt;
{
FILE *fd;
char *ddate;
int prepend;
if (dt == NULL) {
return(-1);
}
prepend = lastblank(MOTD);
if ((fd = fopen(MOTD, "a")) == NULL) {
perror(MOTD);
return(-1);
}
ddate = mkdate(dt->dt_orderdown, D_MOTD);
if (!prepend) {
fprintf(fd, "\n");
}
fprintf(fd, "%s:", ddate);
fprintf(fd, "%s %s.\n", MOTD_MSG1, mkdate(dt->dt_down, D_VERBOSE));
if (strncmp(dt->dt_reason, EMPTY, strlen(EMPTY)))
fprintf(fd, "%s %.*s.\n",
MOTD_MSG2,
MSG_LEN(MOTD_MSG2),
dt->dt_reason
);
fprintf(fd, "%s %s.\n\n", MOTD_MSG3, mkdate(dt->dt_up, D_VERBOSE));
fclose(fd);
return(0);
}
/*
* from date.c
*/
extern char *days[];
extern char *months[];
/*
* delmotd - Delete a motd.
*/
delmotd(dt)
struct downtime *dt;
{
FILE *fdmotd, *fdtmp;
char *odate;
char tmpfile[200], buf[BUFSIZ], firstline[BUFSIZ];
char format[BUFSIZ], mon[100];
int minute, hour, mday, year;
register struct downtime *tmpdt;
register int z;
int gotnl;
tmpdt = (struct downtime *) xmalloc(sizeof(struct downtime));
tmpdt->dt_down = (struct tm *) xmalloc(sizeof(struct tm));
if ((fdmotd = fopen(MOTD, "r")) == NULL) {
perror(MOTD);
return(-1);
}
sprintf(tmpfile, "%s.tmpXXXXXX", MOTD);
mktemp(tmpfile);
if ((fdtmp = fopen(tmpfile, "w")) == NULL) {
perror(tmpfile);
return(-1);
}
odate = (char *) mkdate(dt->dt_orderdown, D_MOTD);
sprintf(firstline, "%s:%s %s.", odate, MOTD_MSG1,
mkdate(dt->dt_down, D_VERBOSE));
while (fgets(buf, sizeof(buf), fdmotd)) {
if (isblank(buf)) {
gotnl = TRUE;
if (!fgets(buf, sizeof(buf), fdmotd)) {
fputs("\n", fdtmp);
break;
}
} else {
gotnl = FALSE;
}
if (strncmp(firstline, buf, strlen(firstline))) {
if (gotnl && !(isblank(buf))) {
gotnl = FALSE;
fputs("\n", fdtmp);
}
fputs(buf, fdtmp);
continue;
}
sprintf(format, "%s: %s %%*s %%s %%d, %%d at %%d:%%d", odate, MOTD_MSG1);
sscanf(buf, format,
mon, &mday, &year, &hour, &minute
);
for (z = 0; z < 12; z++) {
if (strncmp(mon, months[z], strlen(months[z])) == 0)
tmpdt->dt_down->tm_mon = z;
}
tmpdt->dt_down->tm_mday = mday;
tmpdt->dt_down->tm_year = year;
tmpdt->dt_down->tm_hour = hour;
tmpdt->dt_down->tm_min = minute;
if (strcmp(ttod(tmpdt->dt_down), ttod(dt->dt_down)) == 0) {
/*
* nuke the "down for" line.
*/
fgets(buf, sizeof(buf), fdmotd);
if (strncmp(buf, MOTD_MSG2, strlen(MOTD_MSG2)) &&
strncmp(buf, MOTD_MSG3, strlen(MOTD_MSG3))) {
fputs(buf, fdtmp);
}
/*
* nuke the "Expected up" line.
*/
fgets(buf, sizeof(buf), fdmotd);
if (strncmp(buf, MOTD_MSG2, strlen(MOTD_MSG2)) &&
strncmp(buf, MOTD_MSG3, strlen(MOTD_MSG3))) {
fputs(buf, fdtmp);
}
continue;
}
fputs(buf, fdtmp);
}
fclose(fdmotd);
fclose(fdtmp);
if (unlink(MOTD) < 0) {
perror(MOTD);
return(-1);
}
if (rename(tmpfile, MOTD) < 0) {
fprintf(stderr, "%s --> ", tmpfile);
perror(MOTD);
return(-1);
}
return(0);
}
/*
* lastblank - If the last line of file is blank, return 0, else 1.
*/
lastblank(file)
char *file;
{
FILE *fd;
char buf[BUFSIZ];
if ((fd = fopen(file, "r")) == NULL) {
perror(file);
return(-1);
}
while (fgets(buf, sizeof(buf), fd));
fclose(fd);
return(isblank(buf));
}