|
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 c
Length: 14572 (0x38ec) Types: TextFile Names: »c_add.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦653021b30⟧ »EurOpenD3/utils/downtime.tar.Z« └─⟦946c717da⟧ └─⟦this⟧ »c_add.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: c_add.c,v 4.3 88/07/05 15:58:17 mcooper Exp $"; #endif /* *------------------------------------------------------------------ * * $Source: /usr/skat3/src/common/usc/etc/downtime/RCS/c_add.c,v $ * $Revision: 4.3 $ * $Date: 88/07/05 15:58:17 $ * $State: Exp $ * *------------------------------------------------------------------ * * Michael A. Cooper * Research and Development Group * University Computing Services * University of Southern California * (mcooper@oberon.USC.EDU) * *------------------------------------------------------------------ * * $Log: c_add.c,v $ * Revision 4.3 88/07/05 15:58:17 mcooper * Added copyright notice. * * Revision 4.2 88/05/23 15:39:33 mcooper * All tm tm_mon members are now 0-11 * instead of 1-12 for compat. with * the normal BSD time routines. * * Revision 4.1 88/05/18 14:49:17 mcooper * Commands no longer have extra -'s in their names. * * Revision 4.0 88/04/20 15:41:12 mcooper * Version 4. * * Revision 3.8 88/04/20 13:38:01 mcooper * Replace F_BROADCAST with F_MSG_REMOTE. * Added F_MSG_LOCAL. * * Revision 3.7 88/04/13 19:10:15 mcooper * Cleaned up handling of flag bits. No longer need * to define "temporary" flags for turning off a flag * big that is listed in the ccmd keyword list. * The number of special cases for turning bits on * has been almost eliminated. * * Revision 3.6 88/04/11 19:47:41 mcooper * Converted all dt_flags to use flag * bits. * * Revision 3.5 88/04/06 20:51:00 mcooper * Malloc dt_reason and dt_shutter. * * Revision 3.4 88/03/02 16:08:56 mcooper * Cleanup time. * * Revision 3.3 88/03/01 15:48:46 mcooper * Cleaned up header files. * * Revision 3.2 88/03/01 12:37:28 mcooper * Initial most members of tm structs. * * Revision 3.1 88/01/21 20:29:28 mcooper * Port to Alliant (Concentrix 3.0). * * Revision 3.0 87/07/24 14:12:42 mcooper * Version 3. * *------------------------------------------------------------------ */ #include "defs.h" #include "parse.h" struct tm *now; long nowl; /* * c_add - Ccmd Add interface. * */ c_add() { static keywrd howkeys[] = { { "Kill", 0, F_KILL }, { "Reboot", 0, F_REBOOT }, { "Halt", 0, F_HALT }, { "Fake", 0, F_FAKE }, }; static keytab howtab = { (sizeof(howkeys)/sizeof(keywrd)), howkeys }; static fdb howfdb = { _CMKEY, 0, NULL, (pdat) &(howtab), NULL, "Kill", NULL}; static keywrd shutmsgkeys[] = { { "ShortMessages", 0, F_SHUTMSG_ONE }, { "VerboseMessages", 0, F_SHUTMSG_VER }, }; static keytab shutmsgtab = { (sizeof(shutmsgkeys)/sizeof(keywrd)), shutmsgkeys }; static fdb shutmsgfdb = { _CMKEY, 0, NULL, (pdat) &(shutmsgtab), NULL, NULL, NULL}; static keywrd fskeys[] = { { "Fastboot", 0, F_FASTBOOT }, { "NoSync", 0, F_NOSYNC }, { "LocalMessages", 0, F_MSG_LOCAL }, { "NoLocalMessages", 0, -F_MSG_LOCAL }, #ifdef RPCWALL { "Broadcast", KEY_INV, F_MSG_REMOTE }, { "NoBroadcast", KEY_INV, -F_MSG_REMOTE }, { "RemoteMessages", 0, F_MSG_REMOTE }, { "NoRemoteMessages", 0, -F_MSG_REMOTE }, #endif RPCWALL { "NoMessages", 0, -(F_MSG_REMOTE|F_MSG_LOCAL) }, { "Motd", 0, F_MOTD }, { "NoMotd", 0, -F_MOTD }, }; static keytab fstab = { (sizeof(fskeys)/sizeof(keywrd)), fskeys }; static fdb opt2fdb = { _CMKEY, 0, NULL, (pdat) &(fstab), NULL, NULL, NULL }; static keywrd nowkeys[] = { { "Now", 0, 1 }, }; static keytab nowtab = { (sizeof(nowkeys)/sizeof(keywrd)), nowkeys }; static fdb nowfdb = { _CMKEY, 0, NULL, (pdat) &(nowtab), NULL, NULL, NULL }; static fdb minfdb = { _CMTOK, 0, NULL, (pdat) "-", NULL, NULL, NULL }; static fdb plsfdb = { _CMTOK, 0, NULL, (pdat) "+", NULL, NULL, NULL }; struct downtime d; struct tm *gt; int tmp = -1, addflags = 0; int month, day, year, isdst; month = day = year = isdst = -1; d.dt_up = (struct tm *) xmalloc(sizeof(struct tm)); d.dt_down = (struct tm *) xmalloc(sizeof(struct tm)); d.dt_orderdown = (struct tm *) malloc(sizeof(struct tm)); txtfdb._cmhlp = "Shutdown Message"; howfdb._cmhlp = "Shutdown Method, "; shutmsgfdb._cmhlp = "Shutdown Message Type, "; opt2fdb._cmhlp = "Shutdown Flag, "; time(&nowl); now = localtime(&nowl); month = now->tm_mon; day = now->tm_mday; year = now->tm_year; isdst = now->tm_isdst; d.dt_down->tm_mon = month; d.dt_down->tm_mday = day; d.dt_down->tm_year = year; d.dt_down->tm_isdst = isdst; d.dt_down->tm_sec = 0; d.dt_down->tm_wday = 0; d.dt_down->tm_yday = 0; d.dt_up->tm_mon = month; d.dt_up->tm_mday = day; d.dt_up->tm_year = year; d.dt_up->tm_isdst = isdst; d.dt_up->tm_sec = 0; d.dt_up->tm_wday = 0; d.dt_up->tm_yday = 0; d.dt_orderdown->tm_mon = month; d.dt_orderdown->tm_mday = day; d.dt_orderdown->tm_year = year; d.dt_orderdown->tm_isdst = isdst; d.dt_orderdown->tm_sec = now->tm_sec; d.dt_orderdown->tm_min = now->tm_min; d.dt_orderdown->tm_hour = now->tm_hour; d.dt_orderdown->tm_wday = 0; d.dt_orderdown->tm_yday = 0; d.dt_flags = 0; /* * Setup default shutdown flags */ if (fake || (!killflg && !halt && !reboot)) d.dt_flags |= F_FAKE; else if (halt) d.dt_flags |= F_HALT; else if (reboot) d.dt_flags |= F_REBOOT; else if (killflg) d.dt_flags |= F_KILL; if (fastboot) d.dt_flags |= F_FASTBOOT; else if (nosync) d.dt_flags |= F_NOSYNC; if (shortshutmsg) d.dt_flags |= F_SHUTMSG_ONE; else d.dt_flags |= F_SHUTMSG_VER; d.dt_flags |= F_MOTD; d.dt_flags |= F_MSG_LOCAL; #ifdef RPCWALL d.dt_flags |= F_MSG_REMOTE; #endif RPCWALL offdb._cmdef = "ON"; if (username != NULL) { d.dt_shutter = (char *) xmalloc(strlen(username)+1); strcpy(d.dt_shutter, username); } if (host != NULL) strcpy(d.dt_host, host); d.dt_reason = (char *) xmalloc(BUFSIZ); strcpy(d.dt_reason, EMPTY); d.dt_islocked = FALSE; noise("option OR down-time"); start: numfdb._cmlst = NULL; numfdb._cmhlp = "Hour"; parse(fdbchn(&plsfdb, &minfdb, &nowfdb, &numfdb, NULL), &val, &used); if (used == &plsfdb) { numfdb._cmhlp = "Number of minutes until downtime"; parse(&numfdb, &val, &used); if (val._pvint < 1) { printf( "?You cannot specify ``+0''. Use ``now'' to take the system down immediately.\n"); return(-1); } gt = getplus(val._pvint); d.dt_down->tm_min = gt->tm_min; d.dt_down->tm_sec = gt->tm_sec; d.dt_down->tm_hour = gt->tm_hour; d.dt_down->tm_mon = gt->tm_mon; d.dt_down->tm_mday = gt->tm_mday; d.dt_down->tm_year = gt->tm_year; goto uptime; } else if (used == &nowfdb) { d.dt_down->tm_min = now->tm_min; d.dt_down->tm_sec = now->tm_sec; d.dt_down->tm_hour = now->tm_hour; d.dt_down->tm_mon = now->tm_mon; d.dt_down->tm_mday = now->tm_mday; d.dt_down->tm_year = now->tm_year; addflags |= ISNOW; noise("up-time"); goto uptime; } else if (used == &minfdb) { howfdb._cmlst = opt2fdb._cmlst = shutmsgfdb._cmlst = NULL; noise("option"); parse(fdbchn(&howfdb, &opt2fdb, &shutmsgfdb, NULL), &val, &used); if (used == &howfdb) { d.dt_flags &= ~(F_KILL | F_REBOOT | F_HALT | F_FAKE); d.dt_flags |= val._pvint; } else if (used == &shutmsgfdb) { d.dt_flags &= ~(F_SHUTMSG_ONE | F_SHUTMSG_VER); d.dt_flags |= val._pvint; } else if (used == &opt2fdb) { if (val._pvint < 0) { d.dt_flags &= ~-val._pvint; } else { d.dt_flags |= val._pvint; } } else { printf("Unknown option fdb.\n"); } goto start; } if (val._pvint < 0 || val._pvint > 23) { printf("?The hour must be between 0 and 23.\n"); return(-1); } d.dt_down->tm_hour = val._pvint; tok2fdb._cmlst = NULL; parse(&tok2fdb, &val, &used); numfdb._cmlst = NULL; numfdb._cmhlp = "Minute"; parse(&numfdb, &val, &used); if (val._pvint < 0 || val._pvint > 59) { printf("?Minute must be between 0 and 59.\n"); return(-1); } d.dt_down->tm_min = val._pvint; noise("down-date OR up-time"); uptime: numfdb._cmlst = NULL; numfdb._cmhlp = "Down time Month or Up time Hour"; parse(fdbchn(&plsfdb, &numfdb, NULL), &val, &used); if (used == &plsfdb) { numfdb._cmhlp = "Number of minutes until uptime"; parse(&numfdb, &val, &used); if (val._pvint < 1) { printf("?You must specify a plus time of at least ``1''.\n"); return(-1); } gt = getplus(val._pvint); d.dt_up->tm_min = gt->tm_min; d.dt_up->tm_sec = gt->tm_sec; d.dt_up->tm_hour = gt->tm_hour; d.dt_up->tm_mon = gt->tm_mon; d.dt_up->tm_mday = gt->tm_mday; d.dt_up->tm_year = gt->tm_year; noise("shutdown message"); txtfdb._cmlst = NULL; cfmfdb._cmlst = NULL; /* * Ccmd is very picky about the order of the following FDB chain */ parse(fdbchn(&cfmfdb, &txtfdb, NULL), &val, &used); goto postup; } tmp = val._pvint; tok2fdb._cmlst = NULL; tok1fdb._cmlst = NULL; parse(fdbchn(&tok1fdb, &tok2fdb, NULL), &val, &used); if (used == &tok1fdb) { /* parse down date */ d.dt_down->tm_mon = tmp - 1; numfdb._cmlst = NULL; numfdb._cmhlp = "Day"; parse(&numfdb, &val, &used); if (val._pvint < 1 || val._pvint > dom(d.dt_down->tm_mon)) { printf("?Day must be between 1 and %d.\n", dom(d.dt_down->tm_mon)); return(-1); } d.dt_down->tm_mday = val._pvint; noise("up-time"); numfdb._cmhlp = "Up time"; tok1fdb._cmlst = NULL; numfdb._cmlst = NULL; plsfdb._cmlst = NULL; parse(fdbchn(&tok1fdb, &plsfdb, &numfdb, NULL), &val, &used); if (used == &plsfdb) { doplus: numfdb._cmhlp = "Number of minutes until uptime"; parse(&numfdb, &val, &used); if (val._pvint < 1) { printf("?You must specify a plus time of at least ``1''.\n"); return(-1); } gt = getplus(val._pvint); d.dt_up->tm_min = gt->tm_min; d.dt_up->tm_sec = gt->tm_sec; d.dt_up->tm_hour = gt->tm_hour; d.dt_up->tm_mon = gt->tm_mon; d.dt_up->tm_mday = gt->tm_mday; d.dt_up->tm_year = gt->tm_year; noise("shutdown message"); txtfdb._cmlst = NULL; cfmfdb._cmlst = NULL; /* * Ccmd is very picky about the order of the following FDB chain. */ parse(fdbchn(&cfmfdb, &txtfdb, NULL), &val, &used); goto postup; } else if (used == &tok1fdb) { numfdb._cmhlp = "Year"; numfdb._cmlst = NULL; parse(&numfdb, &val, &used); if (val._pvint < 1) { printf("?Year must be greater than 0.\n"); return(-1); } d.dt_down->tm_year = val._pvint; noise("up-time"); numfdb._cmhlp = "Hour"; numfdb._cmlst = NULL; plsfdb._cmlst = NULL; parse(fdbchn(&plsfdb, &numfdb, NULL), &val, &used); if (used == &plsfdb) { goto doplus; } } else if (used == &numfdb) { d.dt_down->tm_year = now->tm_year; } else { printf("?Bad parse value.\n"); return(-1); } if (val._pvint < 0 || val._pvint > 23) { printf("?Hour must be between 0 and 23.\n"); return(-1); } d.dt_up->tm_hour = val._pvint; tok2fdb._cmlst = NULL; parse(&tok2fdb, &val, &used); } else if (used == &tok2fdb) { /* parse up time */ d.dt_up->tm_hour = tmp; } else { printf("?Bad parse value.\n"); return(-1); } numfdb._cmlst = NULL; numfdb._cmhlp = "Minute"; parse(&numfdb, &val, &used); if (used != &numfdb) { printf("?You must enter a number.\n"); return(-1); } if (val._pvint < 0 || val._pvint > 59) { printf("?Minute must be between 0 and 59.\n"); return(-1); } d.dt_up->tm_min = val._pvint; d.dt_up->tm_mon = d.dt_down->tm_mon; d.dt_up->tm_mday = d.dt_down->tm_mday; d.dt_up->tm_year = d.dt_down->tm_year; d.dt_up->tm_isdst = d.dt_down->tm_isdst; noise("up-date OR shutdown message"); numfdb._cmhlp = "Up time Month"; numfdb._cmlst = NULL; txtfdb._cmlst = NULL; cfmfdb._cmlst = NULL; parse(fdbchn(&cfmfdb, &numfdb, &txtfdb, NULL), &val, &used); if (used == &cfmfdb) { /* stupid kludge to keep ccmd happy */ tmp = -1; } else if (used == &numfdb) { if (val._pvint < 1 || val._pvint > 12) { printf("?month must be between 1 and 12.\n"); return(-1); } d.dt_up->tm_mon = val._pvint - 1; tok1fdb._cmlst = NULL; parse(&tok1fdb, &val, &used); numfdb._cmlst = NULL; numfdb._cmhlp = "Day"; parse(&numfdb, &val, &used); if (used != &numfdb) { printf("?You must enter a number for the day.\n"); return(-1); } if (val._pvint < 1 || val._pvint > dom(d.dt_up->tm_mon)) { printf("?You must enter a day between 1 and %d.\n", dom(d.dt_up->tm_mon)); return(-1); } d.dt_up->tm_mday = val._pvint; tok1fdb._cmlst = NULL; txtfdb._cmlst = NULL; cfmfdb._cmlst = NULL; /* * The order of the fdb's is *very* important. */ parse(fdbchn(&cfmfdb, &tok1fdb, &txtfdb, NULL), &val, &used); if (used == &tok1fdb) { numfdb._cmhlp = "Year"; numfdb._cmlst = NULL; parse(&numfdb, &val, &used); if (val._pvint < 1) { printf("?The year must be greater than 0.\n"); return(-1); } d.dt_up->tm_year = val._pvint; noise("shutdown message"); txtfdb._cmlst = NULL; cfmfdb._cmlst = NULL; parse(fdbchn(&txtfdb, &cfmfdb, NULL), &val, &used); } } postup: if (used == &txtfdb) { if (strlen(atmbuf) <= 0 || (strlen(atmbuf) == 1 && atmbuf[0] == '\n')) strcpy(d.dt_reason, EMPTY); else strcpy(d.dt_reason, atmbuf); confirm(); } if (force) { addflags |= FORCE; } if (quiet) { addflags |= QUIET; } if (add(&d, addflags) < 0) { fprintf(stderr, "Add failed: Entry not added.\n"); return(-1); } return(0); }