sources for opermenu (2/2)
Steven Freed CIRT
sfreed at triton.unm.edu
Mon Jun 17 09:47:46 AEST 1991
Part 2 of the sources to opermenu. See part one for a description.
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 2 (of 2)."
# Contents: mdi/getnamevalue.c src/Makefile src/backup.c src/dump_io.c
# src/execute.c src/externs.c src/failed_dump.c src/get_fsystem.c
# src/init.c src/line_to_vec.c src/mtaccess.c src/ps_open.c
# src/reroute_printer.c src/set_date.c src/setdate.c
# Wrapped by sfreed at triton.unm.edu on Fri Jun 14 18:00:59 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'mdi/getnamevalue.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'mdi/getnamevalue.c'\"
else
echo shar: Extracting \"'mdi/getnamevalue.c'\" \(1402 characters\)
sed "s/^X//" >'mdi/getnamevalue.c' <<'END_OF_FILE'
X#include "mdi.h"
X#include <strings.h>
X#include <ctype.h>
X
X_mdi_getnamevalue(name, value, in)
char **name, **value;
XFILE *in;
X{
X char line[MAX_STR], *comment, *name_end, *value_start;
X char *malloc();
X int len;
X extern int debug;
X
X *name = NULL;
X
X do {
X if (fgets(line, MAX_STR, in) == NULL)
X return EOF;
X line[strlen(line)-1] = '\0';
X if (debug)
X printf("read: '%s'\n", line);
X if ((comment = index(line, '#')) != NULL)
X *comment = '\0';
X if (!line[0])
X continue;
X if ((name_end = index(line, '=')) == NULL) {
X fprintf(stderr, "Warning: no '=' on line '%s'\n",
X line);
X continue;
X }
X
X value_start = name_end + 1;
X name_end--;
X
X /* don't hang on to white space before the = */
X while (isspace(*name_end))
X name_end--;
X name_end++; /* loop above goes too far */
X len = name_end - line;
X if (len < 0) {
X fprintf(stderr, "Internal error, len %d < 0!", len);
X fprintf(stderr, " on line '%s'\n", line);
X continue;
X }
X *name = malloc((unsigned)(len + 1));
X if (*name == NULL) {
X fprintf(stderr, "Unable to malloc for getinfo!\n");
X return EOF;
X }
X (void) strncpy(*name, line, len);
X (*name)[len] = '\0';
X
X /* don't hang on to white space after the = */
X for ( ; isspace(*value_start); value_start++)
X ;
X len = strlen(value_start);
X *value = malloc((unsigned)(len+1));
X (void)strcpy(*value, value_start);
X } while (*name == NULL);
X
X return NULL;
X}
END_OF_FILE
if test 1402 -ne `wc -c <'mdi/getnamevalue.c'`; then
echo shar: \"'mdi/getnamevalue.c'\" unpacked with wrong size!
fi
# end of 'mdi/getnamevalue.c'
fi
if test -f 'src/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/Makefile'\"
else
echo shar: Extracting \"'src/Makefile'\" \(2393 characters\)
sed "s/^X//" >'src/Makefile' <<'END_OF_FILE'
X#
X# Makefile for opermenu
X#
X# Each file contains the subroutine named. The only exception is
X# "externs.c", which contains all of the external declarations.
X#
OBJS = backup.o dequeue.o externs.o games.o is_a_tty.o last_backup.o\
X list_ps.o main.o main_menu.o oper_kill.o run.o\
X send_mail.o show_queue.o shutdown.o talk.o log_dump.o\
X atoo.o init.o wall.o mtaccess.o in.o getans.o\
X set_ids.o match.o set_date.o ps_open.o line_to_vec.o\
X get_level.o get_fsystem.o get_tdrive.o \
X get_printername.o printer_menu.o printers.o lpc_cmd.o\
X printer_down.o set_sigs.o naughty.o dump_io.o do_dump.o \
X attend_dump.o printer_up.o reroute_printer.o failed_dump.o\
X list_printers.o known_printer.o kill_end_spaces.o
X
SRCS = backup.c dequeue.c externs.c games.c is_a_tty.c last_backup.c\
X list_ps.c main.c main_menu.c oper_kill.c run.c\
X send_mail.c show_queue.c shutdown.c talk.c log_dump.c\
X atoo.c init.c wall.c mtaccess.c in.c getans.c\
X set_ids.c match.c set_date.c ps_open.c line_to_vec.c\
X get_level.c get_fsystem.c get_tdrive.c \
X get_printername.c printer_menu.c printers.c lpc_cmd.c\
X printer_down.c set_sigs.c naughty.c dump_io.c do_dump.c \
X attend_dump.c printer_up.c reroute_printer.c failed_dump.c\
X list_printers.c known_printer.c kill_end_spaces.c
X
X# This is where the executable is to be placed when everything is done.
BINDIR = /usr/staff/oper/bin
X
X# Location of the machine dependent information library
MDIDIR = ./mdi
MDILIB = -lmdi
X
X# if -DDEBUG is below then things like shotdown dont actually do their
X# stuff. they just print what they would have done.
X# Also, you may need to define a few types:
X#CFLAGS = -O -Duid_t="u_short"
CFLAGS = -O -Duid_t=int
X
oper: ${P} $(OBJS)
X cc -oO oper $(OBJS) $(MDILIB)
X
X$(OBJS): defs.h
X
X$(SRCS) defs.h:
X co $@
X
X$(MDILIB): /tmp
X cd $(MDIDIR) ; make
X
clean:
X rm -f *.o oper
X
install: oper
X install -o root -g operations -m 4750 -s oper $(BINDIR)
X
X# test is used to test a new version without bothering the one in
X# BINDIR. All protections, etc are set up properly.
test: oper
X strip oper
X chown root oper
X chgrp operations oper
X chmod 6755 oper
X
lint:
X lint -xh *.c > Lint.out
X
X# shar: $(SRCS) Mdi.shar defs.h
shar: $(SRCS) defs.h
X shar Makefile $(SRCS) defs.h lib > Oper.shar
X @echo You will need to make the file Mdi.shar also.
X
Mdi.shar: $(MDIDIR)/Mdi.shar
X cp $(MDIDIR)/Mdi.shar Mdi.shar
X
X$(MDIDIR)/Mdi.shar: /tmp
X cd $(MDIDIR) ; make shar
END_OF_FILE
if test 2393 -ne `wc -c <'src/Makefile'`; then
echo shar: \"'src/Makefile'\" unpacked with wrong size!
fi
# end of 'src/Makefile'
fi
if test -f 'src/backup.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/backup.c'\"
else
echo shar: Extracting \"'src/backup.c'\" \(2367 characters\)
sed "s/^X//" >'src/backup.c' <<'END_OF_FILE'
X/*
X backup: start a backup running. This includes finding out from the
X system what filesystems are available, and if necessary, what
X tape drives are available. Selecting a valid filesystem (and
X tape drive) is required.
X*/
X
X#include "defs.h"
X#include <sys/file.h>
X
void
backup()
X{
X extern int oper_uid, errno;
X extern struct tapedrive *tapelist[];
X extern int ntapedrives;
X extern struct tapedrive *get_tdrive();
X char cmd[MAX_STR], fsystem[MAX_STR], tape_name[MAX_STR];
X char answer[MAX_STR], host[MAX_STR];
X int level;
X extern int tape_len; /* default tape length, see externs.c */
X char *tape_len_s; /* string for new tape length, from getinfo */
X int remote;
X char tmach[MAX_STR];
X struct tapedrive *drive;
X char *dump_opt;
X
X printf("Backup\n\n");
X
X if (gethostname(host, MAX_STR) < 0) {
X perror("Get host name in backup");
X return;
X }
X
X level = get_level();
X
X if ( get_fsystem(fsystem) == 0 )
X return;
X
X if ( (drive=get_tdrive()) == (struct tapedrive *) NULL ) {
X fprintf( stderr,"oper: couldn't figure out where to dump.\n" );
X return;
X }
X
X tape_len = 2300; /* in feet */
X tape_len_s = getinfo( "TAPE_LENGTH" );
X if ( tape_len_s != (char *) NULL )
X if ( atoi(tape_len_s) > 0 ) {
X printf( "Using %d, not %d, for tape length in feet.\n",
X atoi(tape_len_s), tape_len );
X tape_len = atoi( tape_len_s );
X } else
X printf( "%s %d %s.\n",
X "Munged new tape length; using default of",
X tape_len, "feet" );
X
X if ( strncmp(host, drive->td_host, strlen(drive->td_host)))
X sprintf( tape_name, "%s:%s", drive->td_host, drive->td_drive );
X else
X strcpy( tape_name, drive->td_drive );
X
X sprintf( cmd, "%s %d%susfd %d %s %d %s",
X drive->td_dumpprog, level, drive->td_flags, tape_len, tape_name,
X drive->td_density, fsystem );
X
X printf( "%s\n",cmd );
X
X#ifndef DEBUG
X /* testing the below; KLI
X ken, don't forget about 'dump_opt'...
X do_dump( cmd, fsystem, host, tmach, tdrive );
X */
X system(cmd);
X#endif DEBUG
X
X getans("\nWas the dump successful? ", "y/n/yes/no", answer);
X if (strcmp(answer, "no") == 0 || strcmp(answer, "n") == 0) {
X if (remote) {
X failed_dump( "oper reports [r]dump failing.", cmd );
X printf( "A message has been mailed to DOC.\n" );
X printf( "Please write up an I.R. Thanks!\n\n" );
X }
X else {
X printf("Please beep DOC and inform them that the\n");
X printf("backup failed.\n\n");
X }
X }
X}
END_OF_FILE
if test 2367 -ne `wc -c <'src/backup.c'`; then
echo shar: \"'src/backup.c'\" unpacked with wrong size!
fi
# end of 'src/backup.c'
fi
if test -f 'src/dump_io.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/dump_io.c'\"
else
echo shar: Extracting \"'src/dump_io.c'\" \(1784 characters\)
sed "s/^X//" >'src/dump_io.c' <<'END_OF_FILE'
X/*
X dump_io: setup the pipeline between us and the dump program. we have
X two pipelines, one for reading from dump and one for writing to
X dump.
X
X Kenneth Ingham
X*/
X
X#include "defs.h"
X
X#define in 0
X#define out 1
X#define err 2
X
X#define p_read 0
X#define p_write 1
X
dump_io(cmd, to_dump, from_dump)
char *cmd;
int *to_dump, *from_dump;
X{
X int pipe_in[2], pipe_out[2]; /* in & out are relative to child */
X char *args[MAX_ARGS];
X extern char **environ;
X
X if (pipe(pipe_out) == -1) {
X printf("Unable to open output pipe to dump pgm!\n");
X perror("oper menu pipe");
X exit(1);
X }
X if (pipe(pipe_in) == -1) {
X fprintf(stderr, "Unable to open input pipe to dump pgm!\n");
X perror("oper menu pipe");
X exit(1);
X }
X
X switch (fork()) {
X case -1: /* error */
X perror("oper menu dump");
X exit(1);
X case 0: /* child */
X close(in);
X if (dup(pipe_in[p_read]) != in) {
X printf("Weird thigs in muddville!\n");
X perror("oper menu dup");
X exit(1);
X }
X close(pipe_in[p_read]);
X
X close(out);
X if (dup(pipe_out[p_write]) != in) {
X printf("Weirder things have %s",
X "never been seen in muddville!\n");
X perror("oper menu dup");
X exit(1);
X }
X
X /*
X note that stdout & stderr are both going down
X the same pipe
X */
X close(err);
X if (dup(pipe_out[p_write]) != in) {
X printf("You wouldn't believe %s",
X "how weird things are in muddville.\n");
X perror("oper menu dup");
X exit(1);
X }
X close(pipe_out[p_write]);
X
X line_to_vec(cmd, args, " ");
X if (execve("dump", args, environ) == -1) {
X perror("oper menu dump fork");
X exit(1);
X }
X /*NOTREACHED*/
X default: /* parent */
X close(pipe_out[p_write]);
X close(pipe_in[p_read]);
X *to_dump = pipe_in[p_write];
X *from_dump = pipe_out[p_read];
X break;
X }
X}
END_OF_FILE
if test 1784 -ne `wc -c <'src/dump_io.c'`; then
echo shar: \"'src/dump_io.c'\" unpacked with wrong size!
fi
# end of 'src/dump_io.c'
fi
if test -f 'src/execute.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/execute.c'\"
else
echo shar: Extracting \"'src/execute.c'\" \(1593 characters\)
sed "s/^X//" >'src/execute.c' <<'END_OF_FILE'
X/*
X execute: execute the command typed in by the operator. All that is
X here is a switch statement, selecting amongst the definitions in
X 'cmds.h'.
X
X Note that 'cmds.h' must correspond to the descriptions given in 'externs.c'.
X*/
X
X#include "defs.h"
X#include "cmds.h"
X
execute(cmd)
int cmd;
X{
X extern int n_choices;
X
X switch(cmd) {
X case IBM_LOG:
X ibm_log();
X break;
X case HASP_LOG:
X hasp_log();
X break;
X case ACCOUNTING:
X accounting();
X break;
X case LAST_BACKUP:
X last_backup();
X break;
X case LPC:
X lpc();
X break;
X case QUIT:
X return;
X case GAMES:
X games();
X break;
X case BERKNET:
X berknet();
X break;
X case RJE:
X rje();
X break;
X case FREE:
X free_space();
X break;
X case IDLE:
X main_menu();
X break;
X case SHOW_QUEUE:
X show_queue();
X break;
X case SHUTDOWN:
X shutdown();
X break;
X case LIST_PS:
X list_ps();
X break;
X case KILL:
X oper_kill();
X break;
X case WHO:
X who();
X break;
X case TALK:
X talk();
X break;
X case WALL:
X wall();
X break;
X case READ_MAIL:
X read_mail();
X break;
X case SEND_MAIL:
X send_mail();
X break;
X case MOTD:
X motd();
X break;
X case PASSWD:
X passwd();
X break;
X case BACKUP:
X backup();
X break;
X case PLOT:
X plot();
X break;
X case DEQUEUE:
X dequeue();
X break;
X case MTACCESS:
X mtaccess();
X break;
X case FCLEAR:
X fclear();
X break;
X case DATE:
X setdate();
X break;
X case 0: /* just pressing return */
X main_menu();
X break;
X default:
X printf("Unknown command. A command is an integer between 1 and %d.",n_choices);
X break;
X }
X}
END_OF_FILE
if test 1593 -ne `wc -c <'src/execute.c'`; then
echo shar: \"'src/execute.c'\" unpacked with wrong size!
fi
# end of 'src/execute.c'
fi
if test -f 'src/externs.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/externs.c'\"
else
echo shar: Extracting \"'src/externs.c'\" \(2586 characters\)
sed "s/^X//" >'src/externs.c' <<'END_OF_FILE'
X/*
X externs: external variables for the oper program live here.
X*/
X#include "defs.h"
X
X#define FREE_PGM "/bin/df"
X#define OBSOLETE "/bin/echo This option is obsolete"
X#define MAIL_PGM "/usr/ucb/mail"
X#define MOTD_PGM "/usr/local/bin/post"
X#define PASSWD_PGM "/bin/passwd"
X#define WHO_PGM "/bin/who"
X
void shutdown(), list_ps(), oper_kill(), show_queue(), dequeue();
void talk(), wall(), send_mail(), last_backup(), backup(), plot();
void games(), ibm_log(), hasp_log(), mtaccess(), set_date(), main_menu();
void printers(), lpc_cmd(), printer_down(), printer_up(),reroute();
void exit();
X
struct cmd_st cmds[] = {
X{ "Exit this procedure.", exit, PROC, NULL },
X{ "System shutdown procedure.", shutdown, PROC, NULL },
X{ "List processes.", list_ps, PROC, NULL },
X{ "Kill a process.", oper_kill, PROC, NULL },
X{ "Play with the printers.", printers, PROC, NULL },
X{ "List users.", NULL, RUN, WHO_PGM },
X{ "Talk to a user.", talk, PROC, NULL },
X{ "Send a message to all users.", wall, PROC, NULL },
X{ "Send mail.", send_mail, PROC, NULL },
X{ "Read mail.", NULL, RUN, MAIL_PGM },
X{ "Edit the message of the day.", NULL, SYSTEM, MOTD_PGM },
X{ "Change the password for oper.", NULL, RUN, PASSWD_PGM },
X{ "Show free space on disks.", NULL, RUN, FREE_PGM },
X{ "Show last dump dates.", last_backup, PROC, NULL },
X{ "Run disk to tape backups.", backup, PROC, NULL },
X{ "Change the status of the games.", NULL, RUN, OBSOLETE },
X{ "Run Accounting.", NULL, RUN, OBSOLETE },
X{ "Set mag tape access.", mtaccess, PROC, NULL },
X{ "Reset the date.", set_date, PROC, NULL },
X{ "Reroute a printer.", reroute, PROC, NULL },
X{ "Redisplay this menu.", main_menu, PROC, NULL },
X{ NULL, NULL, NULL, NULL }
X};
int ncmds = -1;
X
X/* commands for the printer menu */
struct pcmd_st pcmds[] = {
X { "Show printer status.", lpc_cmd, "status" },
X { "Show the print queue.", show_queue, NULL },
X { "Remove a printout from the queue.", dequeue, NULL },
X { "Take a printer down.", printer_down, NULL },
X { "Bring a printer up.", printer_up, NULL },
X { "Restart a printer.", lpc_cmd, "restart" },
X { "Terminate printing on a printer & bring it down.",lpc_cmd,"abort"},
X { NULL, NULL, NULL }
X};
int npcmds = -1;
X
int pid = -9;
X
char *tapenames[] = {
X "/dev/nrmt0h",
X "/dev/nrmt0l",
X "/dev/rmt0h",
X "/dev/rmt0l"
X};
int n_tapes = sizeof(tapenames) / sizeof(char *);
X
int uid, gid, oper_uid;
X
char *lpc_pgm;
int remote_managed;
char *remote_mgr;
X
int tape_len = 2300; /* each reel of backup tape defaults to 2300 feet */
X
struct tapedrive tapelist[25];
int ntapedrives = 0;
END_OF_FILE
if test 2586 -ne `wc -c <'src/externs.c'`; then
echo shar: \"'src/externs.c'\" unpacked with wrong size!
fi
# end of 'src/externs.c'
fi
if test -f 'src/failed_dump.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/failed_dump.c'\"
else
echo shar: Extracting \"'src/failed_dump.c'\" \(1718 characters\)
sed "s/^X//" >'src/failed_dump.c' <<'END_OF_FILE'
X/*
X failed_dump: the dump failed. do whatever we should about it.
X Currently this means sending a letter to DOC (obtained from getinfo).
X
X Kenneth Ingham
X*/
X
X#include "defs.h"
X
failed_dump(errmsg, details)
char *errmsg;
char *details;
X{
X extern FILE *popen();
X extern char *remote_mgr;
X FILE *mail;
X char *mail_pgm;
X char cmd[MAX_STR], host[MAX_STR], *ctime(), *doc;
X long tval, time();
X
X gethostname(host, MAX_STR);
X doc = getinfo("DOC");
X if (doc == (char *) NULL) {
X printf( "%s\n%s.\n",
X "Unable to obtain mail address for DOC; Please",
X "write an IR and send mail to 'doc' on a CIRT machine");
X return;
X }
X
X mail_pgm = getinfo("MAIL_PGM");
X if (mail_pgm == (char *) NULL) {
X printf( "%s\n%s.\n",
X "Unable to locate the mail program; Please",
X "write an IR and send mail to 'doc' on a CIRT machine");
X return;
X }
X
X sprintf( cmd, "%s %s", mail_pgm, doc, remote_mgr );
X
X if ( mail_pgm == (char *) NULL || (mail = popen(cmd, "w")) == NULL ) {
X printf("Unable to send mail to person on call to inform\n");
X printf("them of the failed dump. Please send mail to\n");
X printf("'%s' from a different machine informing them\n",doc);
X printf("that the dumps on %s failed.\n\n", host);
X }
X else {
X tval = time((long *)0);
X
X fprintf( mail, "%s\n%s '%s'.\n%s '%s'.\n",
X "Dear Doc,",
X " It appears that remote dumps are failing on host", host,
X "The error message reads", errmsg );
X
X if ( details != (char *) NULL )
X fprintf( mail, "Some details: '%s'.\n", details );
X
X fprintf( mail, "%s %s.\n%s\n%s\n\n%s\n",
X "This message *automatically* generated at", ctime(&tval),
X "Have fun looking into this...",
X "Later,",
X " Oper-Menu" );
X
X pclose(mail);
X }
X}
END_OF_FILE
if test 1718 -ne `wc -c <'src/failed_dump.c'`; then
echo shar: \"'src/failed_dump.c'\" unpacked with wrong size!
fi
# end of 'src/failed_dump.c'
fi
if test -f 'src/get_fsystem.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/get_fsystem.c'\"
else
echo shar: Extracting \"'src/get_fsystem.c'\" \(2054 characters\)
sed "s/^X//" >'src/get_fsystem.c' <<'END_OF_FILE'
X/*
X get_fsystem: read fstab to find out what filesystems are on the system.
X ignore /tmp and all systems whose names do not begin with /.
X
X it seems much easier to use getfsent... The only thing that will
X have to happen is that 'n_systems' will have to be adjusted after
X all the filesystems have been found so that the original code that
X inquires of the user the desired filesystem will still work.
X
X fixed the check for dumpable file systems to make sure partitions
X is not a swap partitioni, using fs_type == "sw". this is more robust
X than checking the directory on which a fs is mounted for first char == '/'
X -- mike, 11/20/88.
X */
X
X#include "defs.h"
X
extern char *index();
X
get_fsystem(fsystem)
char *fsystem;
X{
X char ans[MAX_STR];
X char *gets();
X int i, f_system;
X char filesystem[50][MAX_STR];
X int n_systems = -1;
X struct fstab *fsent;
X
X setfsent();
X while ( (fsent=getfsent()) != (struct fstab *) NULL )
X
X if ( (strcmp(fsent->fs_file, "/tmp") != 0) &&
X (strcmp(fsent->fs_type, "sw") != 0) &&
X (*(fsent->fs_spec) == '/') &&
X (index(fsent->fs_spec, '@') == (char *) NULL) ){
X n_systems++;
X sprintf( filesystem[n_systems], "%-20.20s %s",
X fsent->fs_spec, fsent->fs_file );
X }
X endfsent();
X if ( n_systems == -1 ) {
X fprintf( stderr, "Hmmm... No filesystems to dump.\n" );
X fprintf( stderr, "You'll want to tell someone about this.\n" );
X return( 0 );
X }
X/*
X* Here is said adjustment:
X*/
X n_systems++;
X
X /* print available filesystems and get user's selection of filesystem */
X do {
X putchar( '\n' );
X for (i=0; i<n_systems; i++)
X printf("%d %s\n",i,filesystem[i]);
X printf("\nEnter number of filesystem: ");
X gets(ans);
X f_system = atoi(ans);
X } while (f_system < 0 || f_system >= n_systems);
X
X /*
X now that they have specified which filesystem, change the
X space to null so that we don't pass the name of the filesystem
X to dump also.
X */
X for (i=0; filesystem[f_system][i] != ' '; i++)
X ;
X filesystem[f_system][i] = '\0';
X
X strcpy(fsystem, filesystem[f_system]);
X return( 1 );
X}
END_OF_FILE
if test 2054 -ne `wc -c <'src/get_fsystem.c'`; then
echo shar: \"'src/get_fsystem.c'\" unpacked with wrong size!
fi
# end of 'src/get_fsystem.c'
fi
if test -f 'src/init.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/init.c'\"
else
echo shar: Extracting \"'src/init.c'\" \(2768 characters\)
sed "s/^X//" >'src/init.c' <<'END_OF_FILE'
X#include "defs.h"
X
init()
X{
X extern int remote_managed;
X extern char *remote_mgr;
X extern struct tapedrive tapelist[];
X extern int ntapedrives;
X char host[MAX_STR];
X char *targets, *colon, *comma, *index();
X int density;
X
X /*
X look for a remote manager for this machine. If there is one
X then this machine must be remotely managed. If not, then it
X must be a local machine.
X */
X remote_mgr = getinfo("REMOTE_MGR");
X if (remote_mgr != NULL)
X remote_managed = True;
X else
X remote_managed = False;
X
X set_ids();
X set_sigs();
X
X if ( (targets=getinfo(TAPELIST)) == (char *) NULL ) {
X fprintf( stderr, "oper: %s.\n",
X "warning: found no tape drives for 'dump'" );
X ntapedrives = 0;
X } else
X for ( ntapedrives=0; ; ++ntapedrives ) {
X
X if ( targets != (char *) NULL && *targets != '\0' ) {
X colon = index( targets, ':' );
X if ( colon != (char *) NULL )
X *colon = '\0';
X else
X colon = targets + strlen(targets) - 1;
X } else
X break;
X
X if ( targets == (char *) NULL || *targets == (char) NULL ||
X (comma=index(targets, ',')) == (char *) NULL ) {
X fprintf( stderr, "oper: bad tape format string '%s'.\n",
X targets );
X break;
X }
X *comma = (char) NULL;
X strcpy( tapelist[ntapedrives].td_host, targets );
printf("td_host '%s'\n", tapelist[ntapedrives].td_host);
X targets = comma + 1;
X
X if ( targets == (char *) NULL || *targets == (char) NULL ||
X (comma=index(targets, ',')) == (char *) NULL ) {
X fprintf( stderr, "oper: bad tape format string '%s'.\n",
X targets );
X break;
X }
X *comma = (char) NULL;
X strcpy( tapelist[ntapedrives].td_drive, targets );
printf("td_drive '%s'\n", tapelist[ntapedrives].td_drive);
X targets = comma + 1;
X
X if ( targets == (char *) NULL || *targets == (char) NULL ||
X (comma=index(targets, ',')) == (char *) NULL ) {
X fprintf( stderr, "oper: bad tape format string '%s'.\n",
X targets );
X break;
X }
X if ( (density=atoi(targets)) == 0 )
X fprintf(stderr,"oper: warning: drive %s's density is %d.\n",
X tapelist[ntapedrives].td_drive, density );
X tapelist[ntapedrives].td_density = density;
X/* printf("td_density '%d'\n", tapelist[ntapedensitys].td_density); */
X targets = comma + 1;
X
X if ( targets == (char *) NULL || *targets == (char) NULL ||
X (comma=index(targets, ',')) == (char *) NULL ) {
X fprintf( stderr, "oper: bad tape format string '%s'.\n",
X targets );
X break;
X }
X *comma = (char) NULL;
X strcpy( tapelist[ntapedrives].td_dumpprog, targets );
X/*printf("td_dumpprog '%s'\n", tapelist[ntapedumpprogs].td_dumpprog); */
X targets = comma + 1;
X
X if ( targets != (char *) NULL && *targets != (char) NULL )
X strcpy( tapelist[ntapedrives].td_flags, targets );
X targets = colon + 1;
X }
X
X}
END_OF_FILE
if test 2768 -ne `wc -c <'src/init.c'`; then
echo shar: \"'src/init.c'\" unpacked with wrong size!
fi
# end of 'src/init.c'
fi
if test -f 'src/line_to_vec.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/line_to_vec.c'\"
else
echo shar: Extracting \"'src/line_to_vec.c'\" \(1508 characters\)
sed "s/^X//" >'src/line_to_vec.c' <<'END_OF_FILE'
X/*
X line_to_vec: take a string and separates it into a vector of strings.
X
X Assumptions:
X
X Arguments:
X line: line to split.
X vec: split line.
X splits: array of characters on which to split.
X
X Global data used:
X none.
X
X Local variables:
X i, j, k: loop indices.
X len: length of 'line'.
X name: current entry in the vector we are building.
X sub: subscript into rpairs of the char we are looking for to
X match the one in rpairs that we found a moment.
X
X Author:
X Kenneth Ingham
X
X Date:
X Thu Sep 5 13:59:21 MDT 1985
X*/
X
X#include "defs.h"
X
char lpairs[] = "'\"";
char rpairs[] = "'\"";
X
line_to_vec(line, vec, splits)
char line[], *vec[], splits[];
X{
X register int i, j, k;
X int len, sub;
X char name[MAX_STR];
X char *malloc(), *strcpy();
X
X len = strlen(line);
X for (i=0, j=0, k=0; i<len; i++) {
X if ((sub = cmatch(line[i], lpairs, strlen(lpairs))) != -1) {
X if (i > 0 && !isspace(line[i-1]) && i < len) {
X name[k] = '\0';
X vec[j] = malloc((unsigned)strlen(name) + 1);
X strcpy(vec[j],name);
X j++;
X k = 0;
X }
X i++;
X while (line[i] != rpairs[sub] && line[i]) {
X name[k] = line[i];
X i++; k++;
X }
X }
X else if (index(splits, line[i]) != 0) {
X name[k] = '\0';
X vec[j] = malloc((unsigned)strlen(name) + 1);
X strcpy(vec[j],name);
X j++;
X k = 0;
X while (index(splits, line[i]) != 0)
X i++;
X if (line[i]) i--;
X }
X else
X name[k++] = line[i];
X }
X name[k] = '\0';
X vec[j] = malloc((unsigned)strlen(name)+1);
X strcpy(vec[j],name);
X vec[j+1] = 0;
X}
END_OF_FILE
if test 1508 -ne `wc -c <'src/line_to_vec.c'`; then
echo shar: \"'src/line_to_vec.c'\" unpacked with wrong size!
fi
# end of 'src/line_to_vec.c'
fi
if test -f 'src/mtaccess.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/mtaccess.c'\"
else
echo shar: Extracting \"'src/mtaccess.c'\" \(4564 characters\)
sed "s/^X//" >'src/mtaccess.c' <<'END_OF_FILE'
X/*
X mtaccess: control access to the tape drive.
X*/
X
X#include "defs.h"
X#include <sys/file.h>
X#include <grp.h>
X
extern char *tapenames[];
extern int n_tapes, oper_uid, remote_managed;
extern char *strncpy();
extern char *gets();
extern int errno, pid;
X
X
void
mtaccess()
X{
X char *gname; /* group name of tape drives */
X struct group *g; /* yields actual group-id */
X char line[MAX_STR];
X char cmd[MAX_STR];
X char ans[MAX_STR];
X struct passwd *user;
X int proc_id; /*proc_id is pid of child process*/
X int itime, i;
X int drive;
X char curnt_drive[50];
X struct stat stat_buf;
X
X if ( remote_managed ) {
X printf("Since this host is remotely managed, please do not do this.\n");
X return;
X }
X
X if ( access(tapenames[0], F_OK) < 0 ) {
X printf( "Drive %d does not exist.\n", drive );
X return;
X }
X stat( tapenames[0], &stat_buf );
X if ( stat_buf.st_uid != oper_uid ) { /* we don't own drive */
X sprintf( line, "%s '%s'. %s? [y/n] ",
X "Mag tape already allocated to",
X ( getpwuid((uid_t)stat_buf.st_uid) )->pw_name,
X "Reallocate" );
X getans( line, "y/n", ans );
X if ( ans[0]== 'n')
X return;
X else if ( kill(pid, SIGKILL) == -1 )
X if ( errno != ESRCH ) {
X fprintf( stderr, "%s %d %s?\n",
X "Wait! Where did pid", pid, "go" );
X perror( "tape drive child" );
X return;
X }
X }
X
X if ( (gname=getinfo("TAPE_GROUP")) == (char *) NULL || *gname == '\0' ){
X fprintf( stderr, "oper: can't locate tape group id.\n" );
X fprintf( stderr, "oper: getinfo(\"%s\") failed.\n",
X "TAPE_GROUP" );
X fprintf( stderr, "oper: returning to main menu.\n" );
X return;
X }
X
X if ( (g=getgrnam(gname)) == (struct group *) NULL ) {
X fprintf( stderr, "oper: could not find group '%s'.\n", gname );
X fprintf( stderr, "oper: returning to main menu.\n" );
X return;
X }
X
X setpwent();
X for (;;) {
X printf( "Enter the new tape drive user's login: " );
X if ( strlen(gets(ans)) == 0 ) {
X printf( "No name specified. Bye..." );
X return;
X } else if ( (user=getpwnam(ans)) == (struct passwd *) NULL )
X printf( "%s '%s' %s\n%s\n\n",
X "Can't find", ans, "in the password file.",
X "Please try again, or hit <return> to exit." );
X else
X break;
X }
X
X for (;;) {
X printf( "Enter the time limit in minutes: " );
X itime = atoi( gets(ans) );
X if ( itime <= 0 )
X printf( "Wait... I don't understand that.\n\n" );
X else
X break;
X }
X
X sprintf( line, "User=%s Time=%d(min) Ok? [y/n] ",
X user->pw_name, itime );
X getans( line, "y/n", ans );
X
X if ( ans[0] == 'y' ) { /* do the stuff! */
X
X for ( i=0; i < n_tapes; i++ ) {
X if (chown(tapenames[i], user->pw_uid, g->gr_gid) != 0) {
X fprintf( stderr, "%s '%s' %s '%s'.\n",
X "FAILED to set ownership of tape drive",
X tapenames[i], "to user", user->pw_name);
X perror( tapenames[i] );
X printf( "Returning to the menu...\n" );
X return;
X }
X if ( chmod(tapenames[i], 0660) != 0 ) {
X fprintf( stderr, "%s '%s' %s '%s'.\n",
X "FAILED to set perms on tape drive",
X tapenames[i], "for user",
X user->pw_name );
X perror( tapenames[i] );
X printf( "Returning to the menu...\n" );
X return;
X }
X#ifdef MTACCT
X {
X FILE *af;
X char *ct;
X long t;
X
X if((af = fopen(MTACCT, "a")) != (FILE *)NULL) {
X time(&t);
X ct = ctime(&t);
X ct[4] = tolower(ct[4]);
X if(ct[8] == ' ') ct[8] = '0';
X fprintf(af, "%s %d %8s %2.2s%3.3s%4.4s\n",
X user->pw_name, 1,
X ct + 11, ct + 8, ct + 4, ct + 20);
X fflush(af); fclose(af);
X }
X }
X#endif MTACCT
X putchar( '*' ), fflush( stdout );
X }
X printf("\n");
X
X#ifndef DEBUG
X if ( (proc_id=fork()) == 0 ) {
X signal(SIGINT, SIG_IGN);
X sleep( itime * 60 );
X
X for ( i=0; i < n_tapes; i++ ) {
X if ( chown(tapenames[i], oper_uid, g->gr_gid) != 0 ) {
X fprintf( stderr, "%s '%s' %s '%s'.\n",
X "FAILED to set ownership of tape drive",
X tapenames[i], "to user", user->pw_name);
X perror( tapenames[i] );
X printf( "Returning to the menu...\n" );
X return;
X }
X if ( chmod(tapenames[i], 0660) != 0 ) {
X fprintf( stderr, "%s '%s' %s '%s'.\n",
X "FAILED to set perms on tape drive",
X tapenames[i], "for user",
X user->pw_name );
X perror( tapenames[i] );
X printf( "Returning to the menu...\n" );
X return;
X }
X }
X _exit(0);
X } else {
X pid = proc_id;
X printf( "%s %d %s.\n",
X "Operator regains control in", itime, "minutes");
X }
X#else DEBUG
X printf( "Debugging on: would sleep %d minutes for '%s'.\n",
X itime, user->pw_name );
X#endif DEBUG
X } else
X printf( "Ok, if you'ld rather not, we won't...\n" );
X return;
X}
END_OF_FILE
if test 4564 -ne `wc -c <'src/mtaccess.c'`; then
echo shar: \"'src/mtaccess.c'\" unpacked with wrong size!
fi
# end of 'src/mtaccess.c'
fi
if test -f 'src/ps_open.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/ps_open.c'\"
else
echo shar: Extracting \"'src/ps_open.c'\" \(1758 characters\)
sed "s/^X//" >'src/ps_open.c' <<'END_OF_FILE'
X/*LINTLIBRARY*/
X/*
X ps_open & ps_close: faster version of popen & pclose. Based upon
X xopen which was gleaned from sysstat.c from net.sources on usenet.
X
X Assumptions:
X
X Arguments:
X command: command to open.
X mode: mode to open command with. Just like fopen.
X fd: file opened with ps_open to close.
X
X Returns:
X ps_open returns a file pointer to a pipe to the command or NULL
X if it could not be done.
X
X Global data used:
X white_space: array containing characters considered white space.
X errno: holds reason for error with failed system calls.
X
X Global data modified:
X none.
X
X Local variables:
X ret_fp: file pointer to return.
X arg: vector of the command to execute.
X pipe_fd: pipe file descriptors.
X i: loop index.
X
X Notes:
X ps_close should not be called with a file pointer that was not
X opened with ps_open.
X
X Author:
X Kenneth Ingham
X
X Date:
X Thu Sep 5 14:13:52 MDT 1985
X
X*/
X
X#include <stdio.h>
X#include <errno.h>
X#include <sys/types.h>
X
X#define MAX_STR 256
X
char white_space[] = {' ', '\t', '\0'};
X
XFILE *ps_open(command, mode)
char command[], mode[];
X{
X extern uid_t uid, gid;
X FILE *ret_fp;
X char *arg[MAX_STR];
X int pipe_fd[2];
X extern int errno;
X extern char white_space[];
X
X line_to_vec(command, arg, white_space);
X
X pipe(pipe_fd);
X switch(fork()) {
X case -1:
X return NULL;
X case 0:
X setuid(uid);
X setgid(gid);
X break;
X default:
X close(pipe_fd[1]);
X if ((ret_fp = fdopen(pipe_fd[0], mode)) == NULL)
X return NULL;
X return ret_fp;
X }
X close(pipe_fd[0]);
X close(1);
X dup2(pipe_fd[1], 1);
X
X execvp(arg[0], arg);
X
X if (errno == ENOENT) {
X printf("Unknown command: %s",arg[0]);
X }
X else
X perror(arg[0]);
X _exit(0);
X return 0; /* for lint */
X}
X
ps_close(fd)
XFILE *fd;
X{
X fclose(fd);
X wait((int *)0);
X}
END_OF_FILE
if test 1758 -ne `wc -c <'src/ps_open.c'`; then
echo shar: \"'src/ps_open.c'\" unpacked with wrong size!
fi
# end of 'src/ps_open.c'
fi
if test -f 'src/reroute_printer.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/reroute_printer.c'\"
else
echo shar: Extracting \"'src/reroute_printer.c'\" \(8088 characters\)
sed "s/^X//" >'src/reroute_printer.c' <<'END_OF_FILE'
X#define MAXPTR 256
X#define MAXNAM 32
X#define MAXROUT 32
X#define TMPCAP "/develop/collier/tempcap"
X#define PRINTCAP "/develop/collier/printcap"
X#define ROUT1SED "/^%s/s/^/%s|/" /* sed script for rerouting */
X#define ROUT2SED "/^#%sS/,/^#%sE/s/^/#/" /* sed script for rerouting */
X#define UNDO1SED "/^%s|/s/%s|//" /* sed script for undoing */
X#define UNDO2SED "/^##%sS/,/^##%sE/s/^#//" /* sed script for undoing */
X#define SWCH1SED "s/^#>%s:/#<%s:/"
X#define SWCH2SED "s/^#<%s:/#>%s:/"
X#define SWCH3SED "s/^#>%s:/#%%%s:/"
X#define SWCH4SED "s/^#%%%s:/#>%s:/"
X
X#include <stdio.h>
X
struct printer {
X char pr_name[MAXNAM], /* name of printer */
X pr_dest[MAXROUT][MAXNAM]; /* routing information */
X int pr_pcount, /* number of routings */
X pr_pri[MAXROUT]; /* routing priority */
X} *p, *pfree, plist[MAXPTR];
X
reroute()
X{
X
X FILE *f;
X int i,
X r,
X pri,
X resp,
X tries;
X char sbuf1[1024],
X sbuf2[1024],
X sbuf3[1024],
X fbuf[1024],
X ans[32];
X
loop: clearerr(stdin);
X if( (f=fopen(PRINTCAP, "r")) == (FILE *) NULL) {
X fprintf(stderr, "Reroute: failed to open %s.", PRINTCAP);
X return(0);
X }
X
X fprintf(stdout, "\nPrinter Rerouting.\n\n");
X fprintf(stdout, "\t1. Re-route a printer.\n");
X fprintf(stdout, "\t2. Undo rerouting.\n");
X fprintf(stdout, "\t3. List of routed printers.\n");
X fprintf(stdout, "\t4. Quit.\n");
X fprintf(stdout, "\nWhich (1 - 4, ^D to quit)? ");
X
X if( gets(ans) == (char *) NULL )
X return(0);
X if(strlen(ans) != 1) {
X fprintf(stderr, "Bad response.\n");
X goto loop;
X }
X
X resp = atoi(ans);
X
X pfree = plist;
X/*###62 [lint] bzero arg. 1 used inconsistently llib-lc(190) :: reroute_printer.c(62)%%%*/
X bzero(plist, sizeof(plist));
X switch(resp) {
X case 1:
X while(fgets(fbuf, 1024, f) != (char *) NULL) {
X if(strncmp("#>", fbuf, 2) == 0 && pfree <= &plist[MAXPTR])
X install(fbuf);
X }
X fclose(f);
X
X if(pfree == plist) {
X fprintf(stderr, "Sorry, no printers may be rerouted.\n");
X goto loop;
X }
X
X tries = 0;
X do {
X fprintf(stdout, "\nThese printers can be rerouted:\n\n");
X for(p = plist; p < pfree; ++ p)
X fprintf(stdout, "%s\n", p->pr_name);
X fprintf(stdout, "\nWhich one (^D to abort)? ");
X if( gets(fbuf) == (char *) NULL ) {
X fprintf(stderr, "Aborting.\n");
X goto loop;
X }
X if(strlen(fbuf) < 1) {
X fprintf(stderr, "Invalid response, aborting.\n");
X goto loop;
X }
X for(p = plist; p < pfree; ++ p)
X if(strcmp(fbuf, p->pr_name) == 0)
X break;
X if(p >= pfree)
X fprintf(stderr, "\nNo such printer.\n");
X } while(p >= pfree && ++ tries < 3);
X
X if(tries >= 3) {
X fprintf(stderr, "Please try again.\n");
X goto loop;
X }
X
X for(i = 0, r = -1, pri = -1; i < p->pr_pcount; ++ i) {
X if(p->pr_pri[i] > pri) {
X pri = p->pr_pri[i];
X r = i;
X }
X }
X
X if(r < 0) {
X fprintf(stderr, "%s cannot be rerouted. Sorry.\n",
X p->pr_name);
X goto loop;
X }
X
X fprintf(stdout, "Rerouting %s to %s, o.k. (y/n/^D to abort)? ",
X p->pr_name, p->pr_dest[r]);
X if( gets(ans) == (char *) NULL ) {
X fprintf(stderr, "Aborting.\n");
X goto loop;
X }
X if(strlen(ans) != 1) {
X fprintf(stderr, "Invalid response, aborting.\n");
X goto loop;
X }
X if(ans[0] == 'y' || ans[0] == 'Y') {
X route(p->pr_name, p->pr_dest[r]);
X goto loop;
X }
X
X tries = 0;
X do {
X fprintf(stdout, "\nYou can reroute %s to these printers:\n\n",
X p->pr_name);
X for(i = 0; i < p->pr_pcount; ++ i)
X fprintf(stdout, "%s\n", p->pr_dest[i]);
X
X fprintf(stdout, "\nWhich one (^D to abort)? ");
X if( gets(fbuf) == (char *) NULL ) {
X fprintf(stderr, "Aborting.\n");
X goto loop;
X }
X if(strlen(fbuf) < 1) {
X fprintf(stderr, "Invalid response, aborting.\n");
X goto loop;
X }
X for(i = 0, r = -1; i < p->pr_pcount; i ++) {
X if(strcmp(fbuf, p->pr_dest[i]) == 0) {
X r = i;
X break;
X }
X }
X if(r < 0)
X fprintf(stderr, "No such printer.\n");
X } while(r < 0 && ++ tries < 3);
X
X if(tries > 3) {
X fprintf(stderr, "Please try again.\n");
X goto loop;
X }
X
X fprintf(stdout, "Rerouting %s to %s, o.k. (y/n/^D to abort)? ",
X p->pr_name, p->pr_dest[r]);
X if( gets(ans) == (char *) NULL ) {
X fprintf(stderr, "Aborting.\n");
X goto loop;
X }
X if(strlen(ans) < 1) {
X fprintf(stderr, "Invalid response, aborting.\n");
X goto loop;
X }
X if(ans[0] == 'y' || ans[0] == 'Y') {
X route(p->pr_name, p->pr_dest[r]);
X goto loop;
X }
X else {
X fprintf(stdout, "Please try again.\n");
X goto loop;
X }
X break;
X case 2:
X while(fgets(fbuf, 1024, f) != (char *) NULL) {
X if(strncmp("#<", fbuf, 2) == 0 && pfree <= &plist[MAXPTR])
X install(fbuf);
X }
X fclose(f);
X
X if(pfree == plist) {
X fprintf(stderr, "Sorry, no printers to un-reroute.\n");
X goto loop;
X }
X
X tries = 0;
X do {
X fprintf(stdout, "\nThese printers can be un-rerouted:\n\n");
X for(p = plist; p < pfree; ++ p)
X fprintf(stdout, "%s (-> %s)\n", p->pr_name, p->pr_dest[0]);
X fprintf(stdout, "\nWhich one (^D to abort)? ");
X if( gets(fbuf) == (char *) NULL ) {
X fprintf(stderr, "Aborting.\n");
X goto loop;
X }
X if(strlen(fbuf) < 1) {
X fprintf(stderr, "Invalid response, aborting.\n");
X goto loop;
X }
X for(p = plist; p < pfree; ++ p)
X if(strcmp(fbuf, p->pr_name) == 0)
X break;
X if(p >= pfree)
X fprintf(stderr, "\nNo such printer.\n");
X } while(p >= pfree && ++ tries < 3);
X
X if(tries > 3) {
X fprintf(stderr, "Please try again.\n");
X goto loop;
X }
X
X fprintf(stdout, "Un-rerouting %s from %s, o.k. (y/n/^D to abort)? ",
X p->pr_name, p->pr_dest[0]);
X if( gets(ans) == (char *) NULL ) {
X fprintf(stderr, "Aborting.\n");
X goto loop;
X }
X if(strlen(ans) < 1) {
X fprintf(stderr, "Invalid response, aborting.\n");
X goto loop;
X }
X if(ans[0] == 'y' || ans[0] == 'Y') {
X unroute(p->pr_name, p->pr_dest[0]);
X goto loop;
X }
X break;
X case 3:
X while(fgets(fbuf, 1024, f) != (char *) NULL) {
X if(strncmp("#<", fbuf, 2) == 0 && pfree <= &plist[MAXPTR])
X install(fbuf);
X }
X fclose(f);
X
X if(pfree == plist) {
X fprintf(stderr, "Sorry, no printers are routed.\n");
X goto loop;
X }
X
X fprintf(stdout, "\nThese printers are routed:\n\n");
X for(p = plist; p < pfree; ++ p)
X fprintf(stdout, "%s (-> %s)\n",
X p->pr_name, p->pr_dest[0]);
X break;
X case 4:
X return(0);
X default:
X fprintf(stderr, "Bad command %d.\n", resp);
X goto loop;
X break;
X }
X fclose(f);
X goto loop;
X}
X
install(s)
X char *s;
X{
X
X char *p1,
X *p2,
X *p3,
X *index(),
X *rindex();
X struct printer *p;
X
X p1 = s + 2;
X
X p2 = index(s, ':');
X if(p2 != rindex(s, ':'))
X return;
X p2 ++;
X
X p3 = index(s, ';');
X if(p3 != rindex(s, ';'))
X return;
X p3 ++;
X
X p2[-1] = '\0';
X p3[-1] = '\0';
X
X for(p = plist; p < pfree; p ++)
X if(strcmp(p1, p->pr_name) == 0)
X break;
X if(p == pfree) {
X pfree ++;
X strcpy(p->pr_name, p1);
X }
X/*###294 [lint] strcpy value declared inconsistently llib-lc(361) :: reroute_printer.c(294)%%%*/
X strcpy(p->pr_dest[p->pr_pcount], p2);
X p->pr_pri[p->pr_pcount] = atoi(p3);
X p->pr_pcount ++;
X}
X
route(a, b)
X char *a,
X *b;
X{
X char b1[256],
X b2[256],
X b3[256],
X b4[256];
X
X sprintf(b1, ROUT1SED, b, a);
X sprintf(b2, ROUT2SED, a, a);
X sprintf(b3, SWCH1SED, a, a);
X sprintf(b4, SWCH3SED, b, b);
X
X if(!fork()) {
X freopen(TMPCAP, "w+", stdout);
X execl("/bin/sed", "sed", "-e", b1, "-e", b2, "-e",
X b3, "-e", b4, PRINTCAP, 0);
X }
X else {
X/*###319 [lint] wait arg. 1 used inconsistently llib-lc(163) :: reroute_printer.c(319)%%%*/
X wait(0);
X rename(TMPCAP, PRINTCAP);
X chmod(PRINTCAP, 0644);
X }
X}
X
unroute(a, b)
X char *a,
X *b;
X{
X char b1[256],
X b2[256],
X b3[256],
X b4[256];
X
X sprintf(b1, UNDO1SED, a, a);
X sprintf(b2, UNDO2SED, a, a);
X sprintf(b3, SWCH2SED, a, a);
X sprintf(b4, SWCH4SED, b, b);
X
X if(!fork()) {
X freopen(TMPCAP, "w+", stdout);
X execl("/bin/sed", "sed", "-e", b1, "-e", b2,
X "-e", b3, "-e", b4, PRINTCAP, 0);
X }
X else {
X/*###345 [lint] wait arg. 1 used inconsistently llib-lc(163) :: reroute_printer.c(345)%%%*/
X wait(0);
X rename(TMPCAP, PRINTCAP);
X chmod(PRINTCAP, 0644);
X }
X}
END_OF_FILE
if test 8088 -ne `wc -c <'src/reroute_printer.c'`; then
echo shar: \"'src/reroute_printer.c'\" unpacked with wrong size!
fi
# end of 'src/reroute_printer.c'
fi
if test -f 'src/set_date.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/set_date.c'\"
else
echo shar: Extracting \"'src/set_date.c'\" \(2438 characters\)
sed "s/^X//" >'src/set_date.c' <<'END_OF_FILE'
X/*
X setdate: set the date on the machine.
X
X Author: Kenneth Ingham
X
X Thu Oct 24 16:26:59 MDT 1985
X*/
X
X#include "defs.h"
X
X#define year_in_range(y) (y > 80 && y < 100) /* must be 2 digits */
X#define month_in_range(m) (m >= 1 && m <= 12)
X#define date_in_range(d, m) (d >= 1 && \
X ((m == 1 && d <= 31) ||\
X (m == 2 && d <= 29) ||\
X (m == 3 && d <= 31) ||\
X (m == 4 && d <= 30) ||\
X (m == 5 && d <= 31) ||\
X (m == 6 && d <= 30) ||\
X (m == 7 && d <= 31) ||\
X (m == 8 && d <= 31) ||\
X (m == 9 && d <= 30) ||\
X (m == 10 && d <= 31) ||\
X (m == 11 && d <= 30) ||\
X (m == 12 && d <= 31)))
X#define hour_in_range(h) (h >= 0 && h <= 11)
X#define minute_in_range(m) (m >=0 && m <= 59)
X
void
set_date()
X{
X extern int remote_managed;
X int year, month, date, hour, minute, am;
X char line[MAX_STR];
X
X if ( remote_managed ) {
X printf("Since this host is remotely managed, please do not do this.\n");
X return;
X }
X
X do {
X printf("Enter the last two digits of the current year: ");
X year = atoi(gets(line));
X if (! year_in_range(year))
X printf("Try again, I want the >CURRENT< year.\n\n");
X } while (! year_in_range(year));
X
X do {
X printf("Enter the month as a number (ie May would be 5): ");
X month = atoi(gets(line));
X if (! month_in_range(month))
X printf("Last I checked, the months ran from 1 to 12.\n\n");
X } while (! month_in_range(month));
X
X do {
X printf("Enter today's date: ");
X date = atoi(gets(line));
X if (! date_in_range(date, month))
X printf("There are not %d days in the %dth month.\n\n",
X date, month);
X } while (! date_in_range(date, month));
X
X do {
X printf("Enter the hours past noon or midnight: ");
X hour = atoi(gets(line));
X if (! hour_in_range(hour))
X printf("I want a number from 0 to 11.\n\n");
X } while (! hour_in_range(hour));
X
X do {
X printf("Enter the number of minutes past the hour: ");
X minute = atoi(gets(line));
X if (! minute_in_range(minute))
X printf("I want a number from 0 to 59.\n\n");
X } while (! minute_in_range(minute));
X
X do {
X printf("is it morning still? [y/n] ");
X gets(line);
X if (line[0] != 'y' && line[0] != 'n')
X printf("Use either the 'n' or the 'y' key to answer the question.\n\n");
X } while (line[0] != 'y' && line[0] != 'n');
X am = line[0] == 'y';
X
X if (!am) hour += 12;
X
X sprintf(line, "date %02d%02d%02d%02d%02d", year, month, date, hour, minute);
X printf("%s\n", line);
X system(line);
X}
END_OF_FILE
if test 2438 -ne `wc -c <'src/set_date.c'`; then
echo shar: \"'src/set_date.c'\" unpacked with wrong size!
fi
# end of 'src/set_date.c'
fi
if test -f 'src/setdate.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/setdate.c'\"
else
echo shar: Extracting \"'src/setdate.c'\" \(2542 characters\)
sed "s/^X//" >'src/setdate.c' <<'END_OF_FILE'
X/*
X setdate: set the date on the machine.
X
X Author: Kenneth Ingham
X
X Thu Oct 24 16:26:59 MDT 1985
X*/
X
X#include "defs.h"
X
X#define year_in_range(y) (y > 80 && y < 90)
X#define month_in_range(m) (m >= 1 && m <= 12)
X#define date_in_range(d, m) (d >= 1 && \
X ((m == 1 && d <= 31) ||\
X (m == 2 && d <= 29) ||\
X (m == 3 && d <= 31) ||\
X (m == 4 && d <= 30) ||\
X (m == 5 && d <= 31) ||\
X (m == 6 && d <= 30) ||\
X (m == 7 && d <= 31) ||\
X (m == 8 && d <= 31) ||\
X (m == 9 && d <= 30) ||\
X (m == 10 && d <= 31) ||\
X (m == 11 && d <= 30) ||\
X (m == 12 && d <= 31)))
X#define hour_in_range(h) (h >= 0 && h <= 11)
X#define minute_in_range(m) (m >=0 && m <= 59)
X
extern int machine; /* the number of the machine i'm currently on */
extern int machflags[]; /* list of flags for all machines */
X
setdate()
X{
X int year, month, date, hour, minute, am;
X char line[MAX_STR];
X
X if ( (machflags[machine] & MF_RMANAGED) != 0 ) {
X printf("Since this host is remotely managed, please do not do this.\n");
X return( 0 );
X }
X
X do {
X printf("Enter the last two digits of the current year: ");
X year = atoi(gets(line));
X if (! year_in_range(year))
X printf("Try again, I want the >CURRENT< year.\n\n");
X } while (! year_in_range(year));
X
X do {
X printf("Enter the month as a number (ie May would be 5): ");
X month = atoi(gets(line));
X if (! month_in_range(month))
X printf("Last I checked, the months ran from 1 to 12.\n\n");
X } while (! month_in_range(month));
X
X do {
X printf("Enter today's date: ");
X date = atoi(gets(line));
X if (! date_in_range(date, month))
X printf("There are not %d days in the %dth month.\n\n",
X date, month);
X } while (! date_in_range(date, month));
X
X do {
X printf("Enter the hours past noon or midnight: ");
X hour = atoi(gets(line));
X if (! hour_in_range(hour))
X printf("I want a number from 0 to 11.\n\n");
X } while (! hour_in_range(hour));
X
X do {
X printf("Enter the number of minutes past the hour: ");
X minute = atoi(gets(line));
X if (! minute_in_range(minute))
X printf("I want a number from 0 to 59.\n\n");
X } while (! minute_in_range(minute));
X
X do {
X printf("is it morning still? [y/n] ");
X gets(line);
X if (line[0] != 'y' && line[0] != 'n')
X printf("Use either the 'n' or the 'y' key to answer the question.\n\n");
X } while (line[0] != 'y' && line[0] != 'n');
X am = line[0] == 'y';
X
X if (!am) hour += 12;
X
X sprintf(line, "date %02d%02d%02d%02d%02d", year, month, date, hour, minute);
X printf("%s\n", line);
X system(line);
X}
END_OF_FILE
if test 2542 -ne `wc -c <'src/setdate.c'`; then
echo shar: \"'src/setdate.c'\" unpacked with wrong size!
fi
# end of 'src/setdate.c'
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked both archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Steve. sfreed at ariel.unm.edu
More information about the Comp.unix.admin
mailing list