DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T m

⟦f91a69556⟧ TextFile

    Length: 4050 (0xfd2)
    Types: TextFile
    Names: »main.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec8/mcp/src/main.c« 

TextFile

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <setjmp.h>
#include <signal.h>
#include "sysdep.h"
#include "macros.h"
#include "mem.h"
#include "command.h"

#define		ROOT_PROMPT	"\r(mcp) "
#define		PROMPT		"\r(   ) "
#define		CARGS		32	   /* # command line args allowed */

#ifdef sun
#define	sighandler	(void (*)())
#else
#define	sighandler	(int (*)())
#endif

extern	int scommcmp(), kids, root, ModBits, NCommands, goodbye(), DevTty;
extern	struct command Ctable[];
extern	char Working_Directory[];
extern	int ReportGoop();
extern	Summarize();
extern	char *sprintf();

jmp_buf interrupt, in_continue;			/* setjmp vectors */

main(argc, argv)
int argc;
char **argv;

{
	static char *prompt;
	static addr v[CARGS+1];
	int sjval, index, c, found, goop = 0;
	int buildit, checkem, summary, listem, printversion;
	char errmsg[MEDIUM_BUF];

	(void) umask(022);

	/*
	 * Find out if this is the superuser, what the current working 
	 * directory is, seed random number generator.
	 * For Sun systems, also find out about file server, etc.
	 */
	init_identities();

	buildit = checkem = summary = listem = printversion = 0;
	while (--argc && **++argv == '-')
	    for (++*argv; **argv; ++*argv)
		switch (**argv) {
		case 'v':
		    printversion++; break;
		case 'l':
		    listem++;	break;
		case 'B':
		    buildit++;	break;
		case 'c':
		    checkem++;	break;
		case 's':
		    summary++;	break;
		default:
		    (void) sprintf(errmsg, "mcp: bad option '%c' (ignored)",
					**argv);
		    err(errmsg);
		    break;
		}
	/*
	 * Set up descriptor for /dev/tty or just attached to stderr
	 * if not running interactively.
	 */
	init_tty(buildit || (!checkem && !summary && !listem));

	if (buildit && (checkem || summary || listem))
		fatal("mcp: can't use -B with any other option.");
	if (buildit && !root)
		fatal("mcp: must be the super-user to use -B");
	if (argc)
		err("mcp: extra arguments ignored");
	if (printversion && !buildit) {
	    ShowVersion();
	    if (!(checkem || summary || listem))
	      goodbye(0);
	}
	/*
	 * Must set up some sort of quick 'n dirty signal handling lest
	 * an interrupt cause the program to exit with the password
	 * file locked.  So we block all signals except SIGINT, and trap
	 * SIGINT to goodbye().
	 */
	(void) sigsetmask(~mask(SIGINT));
	(void) signal(SIGINT, sighandler goodbye);

	if ( root && !(checkem || summary || listem)) {
		msg("Locking password file...");
		if (!lockpw())
			fatal("mcp: password file busy");
		prompt = ROOT_PROMPT;
	}
	else
		prompt = PROMPT;

	if (buildit) Build();	/* Build() doesn't return */

	/*
	 * Pass a flag to init_lists() to indicate whether all or
	 * or only some of the global lists need be initialized.
	 */
	init_lists(!(checkem || summary || listem));

	if (checkem) goop = ReportGoop();
	if (listem) ListThemThangs();
	if (summary) Summarize();
	if (checkem || summary || listem) goodbye(goop ? 1 : 0);

#if CKPTIME > 0
	if (root)
	    (void) alarm(CKPTIME * 60);	/* start checkpointing timer */
#endif
	/*
	 * Trap interrupts back to the main command interpreter.
	 */
	sjval = setjmp(interrupt);
	if (sjval)
		msg("\r\n");

	setsignals();		/* connect signal handlers */

	/*
	 * Main command line interpreting loop
	 */
	for (;;) {
		if (kids) reapchild();
		closefiles();
		freeargv(v);
		free_gpa();
		freetmplists();
		(void) chdir(Working_Directory);
		GetCommandLine(prompt, CARGS, &c, v);
		if (c == 0)
			continue;
		index = search_array((char *)Ctable, (char *)v[0], NCommands,
				sizeof (struct command), scommcmp, &found);
		if (!found) {
			err1("%s: unknown command", (char *)v[0]);
			continue;
		}
		(*Ctable[index].c_func)(c, v);
	}
}

reapchild()

{
	if (wait3((union wait *)0, WNOHANG, (struct rusage *)0) > 0)
		kids--;
	return;
}

#if CKPTIME > 0
wakeup()

{
	kids && reapchild();
	ModBits && ckpchanges();
	(void) alarm(CKPTIME * 60);
	return;
}
#endif

closefiles()

{
	register int i, nd = getdtablesize();

	for (i=3; i < nd; i++)
		if (i != DevTty)
			(void) close(i);
	return;
}