|
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 d
Length: 7908 (0x1ee4) Types: TextFile Names: »dsa.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/quipu/dsa.c«
/* dsa.c - Main routine for QUIPU DSA process */ #ifndef lint static char *rcsid = "$Header: /f/osi/quipu/RCS/dsa.c,v 6.1 89/03/23 22:27:53 mrose Exp $"; #endif /* * $Header: /f/osi/quipu/RCS/dsa.c,v 6.1 89/03/23 22:27:53 mrose Exp $ * * * $Log: dsa.c,v $ * Revision 6.1 89/03/23 22:27:53 mrose * out-the-door * * Revision 6.0 89/03/18 23:41:25 mrose * Release 5.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ #include <signal.h> #include <stdio.h> #include <varargs.h> #include <sys/types.h> #include <sys/stat.h> #include "rosap.h" #include "tsap.h" #include "logger.h" #include "tailor.h" #include "quipu/util.h" #include "quipu/connection.h" #ifdef BSD42 #include <sys/file.h> #endif #ifdef SYS5 #include <fcntl.h> #endif #ifdef lint #define ETCDIR "/etc" #endif PS opt; static int debug = 1; static int nbits = FD_SETSIZE; extern LLog * log_dsap; static char *myname; void adios (), advise (); static envinit (), setdsauid(); SFD attempt_restart(); extern int start_nameserver; #ifdef DSAP extern int nameservice; #endif #ifndef NO_STATS static LLog lstat_log = { "quipu.log", NULLCP, NULLCP, LLOG_NOTICE, LLOG_NONE, 50, LLOGCLS | LLOGCRT | LLOGZER, NOTOK, }; LLog *log_stat = &lstat_log; #endif /* * Basic data structure of the DSA server. */ struct quipu_dsa_state id_st; extern char *isodepath; char ** sargv; main(argc, argv) int argc; char **argv; { extern char * mydsaname; struct activity * act; extern int quipu_nofree_malloc; extern char startup_update; extern char * sbrk(); /* * Function to stop DSA server. */ SFD stop_dsa(); isodepath = ETCDIR; sargv = argv; if (myname = rindex (argv[0], '/')) myname++; if (myname == NULL || *myname == NULL) myname = argv[0]; isodetailor (myname,0); envinit(); /* detach */ dsa_sys_init(&argc, &argv); setdsauid(); #ifndef NO_STATS ll_hdinit (log_stat,myname); #endif if ((opt = ps_alloc (std_open)) == NULLPS) fatal (-12,"ps_alloc failed"); if (std_setup (opt,stdout) == NOTOK) fatal (-13,"std_setup failed"); DLOG (log_dsap,LLOG_DEBUG,( "About to dsa_init()")); #ifdef QUIPU_MALLOC quipu_nofree_malloc = TRUE; /* database will rarely have components freed so use this optimisation */ #endif if(dsa_init(NULLCP) == NOTOK) { fatal(-14,"Couldn't initialise the DSA!!"); } #ifdef QUIPU_MALLOC quipu_nofree_malloc = FALSE; #endif if (startup_update) { slave_update(); } if(net_init() == NOTOK) { fatal(15,"Couldn't initialise the network monitor!!"); } #ifdef DSAP if (start_nameserver) ns_init (); #endif /* * Do stop_dsa() on receiving a Ctrl-C */ (void) signal (SIGINT,stop_dsa); (void) signal (SIGTERM,stop_dsa); /* now started don't stop on core dumps !!! */ (void) signal (SIGQUIT, attempt_restart); (void) signal (SIGILL, attempt_restart); (void) signal (SIGTRAP, attempt_restart); (void) signal (SIGIOT, attempt_restart); (void) signal (SIGBUS, attempt_restart); (void) signal (SIGSEGV, attempt_restart); (void) signal (SIGSYS, attempt_restart); LLOG (log_dsap,LLOG_NOTICE,( "DSA Started...")); (void) fprintf (stderr,"DSA Started\n"); #ifndef NO_STATS LLOG (log_stat,LLOG_NOTICE,("DSA started (%s)",mydsaname)); #endif for(;;) { DLOG (log_dsap,LLOG_DEBUG,("sbrk %x",sbrk(0))); if(conn_select(&act) == ACTIVITY_NET_WAIT) { if(act == NULLACTIVITY) net_monitor(NOTOK); /* Block until something happens */ else net_monitor(1); /* Poll the network for 1 sec */ } else { dsa_schedule(act); } } /* forever */ } /* main */ dsa_abort() { struct connection * cn; struct AcSAPindication aci_s; struct AcSAPindication *aci = &aci_s; #ifdef DSAP if(start_nameserver) { (void) close_udp_socket(nameservice); } #endif for(cn=id_st.connlist; cn!=NULLCONN; cn=cn->cn_next) { if(cn->cn_ad != 0) (void) AcUAbortRequest(cn->cn_ad, NULLPEP, 0, aci); } } SFD stop_dsa () { LLOG (log_dsap,LLOG_FATAL,("*** SIGINT ***")); dsa_abort(); stop_listeners (); exit (0); } static envinit () { int i, sd; nbits = getdtablesize (); if (!(debug = isatty (2))) { for (i = 0; i < 5; i++) { switch (fork ()) { case NOTOK: sleep (5); continue; case OK: goto fork_ok; default: _exit (0); } break; } fork_ok:; (void) chdir ("/"); if ((sd = open ("/dev/null", O_RDWR)) == NOTOK) adios ("/dev/null", "unable to read"); if (sd != 0) (void) dup2 (sd, 0), (void) close (sd); (void) dup2 (0, 1); (void) dup2 (0, 2); #ifdef TIOCNOTTY if ((sd = open ("/dev/tty", O_RDWR)) != NOTOK) { (void) ioctl (sd, TIOCNOTTY, NULLCP); (void) close (sd); } #else #ifdef SYS5 (void) setpgrp (); (void) signal (SIGINT, SIG_IGN); (void) signal (SIGQUIT, SIG_IGN); #endif #endif } #ifndef DEBUG /* "Normal" ISODE behavior of full logging only without DEBUG */ else ll_dbinit (log_dsap, myname); #endif #ifndef sun /* damn YP... */ for (sd = 3; sd < nbits; sd++) (void) close (sd); #endif (void) signal (SIGPIPE, SIG_IGN); ll_hdinit (log_dsap, myname); #ifdef DEBUG advise (LLOG_TRACE, NULLCP, "starting"); #endif } /* \f ERRORS */ #ifndef lint void adios (va_alist) va_dcl { va_list ap; va_start (ap); _ll_log (log_dsap, LLOG_FATAL, ap); va_end (ap); (void) fprintf (stderr,"adios exit - see dsap.log\n"); _exit (-18); } #else /* VARARGS */ void adios (what, fmt) char *what, *fmt; { adios (what, fmt); } #endif #ifndef lint void advise (va_alist) va_dcl { int code; va_list ap; va_start (ap); code = va_arg (ap, int); (void) _ll_log (log_dsap, code, ap); va_end (ap); } #else /* VARARGS */ void advise (code, what, fmt) char *what, *fmt; int code; { advise (code, what, fmt); } #endif static setdsauid () { struct stat buf; char filebuf [BUFSIZ]; FILE * fptr; extern char * treedir; (void) stat (treedir,&buf); if (setgid (buf.st_gid) == -1) LLOG (log_dsap,LLOG_EXCEPTIONS,("Can't set gid %d (database directory \"%s\")",buf.st_uid,treedir)); if (setuid (buf.st_uid) == -1) LLOG (log_dsap,LLOG_EXCEPTIONS,("Can't set uid %d (database directory \"%s\")",buf.st_uid,treedir)); (void) sprintf (filebuf,"%s/PID",treedir); if ((fptr = fopen (filebuf,"w")) == NULL ) { LLOG (log_dsap,LLOG_EXCEPTIONS,("Cant open PID file %s",filebuf)); return; } (void) fprintf (fptr,"%d",getpid()); (void) fclose (fptr); } /* ARGSUSED */ SFD attempt_restart (sig, code, context) int sig, code; struct sigcontext *context; { int fpid; extern char * mydsaname; extern char *sys_siglist[]; dsa_abort(); stop_listeners(); if ( (fpid =fork ()) == 0) { /* restart !!! */ sleep (5); /* give connections time to clear */ execv (isodefile(sargv[0]),sargv); exit (-19); } (void) signal (sig, SIG_DFL); /* to stop recursion */ (void) signal (SIGILL, SIG_DFL); /* for abort */ (void) signal (SIGIOT, SIG_DFL); /* for abort */ LLOG (log_dsap,LLOG_FATAL,("*** Process dying on signal %d (%s) ***", sig, sys_siglist[sig])); if (fpid != -1) LLOG (log_dsap,LLOG_FATAL,("*** restart attempted ***")); #ifndef NO_STATS if (fpid != -1) LLOG (log_stat,LLOG_NOTICE,("RESTARTING (%s)",mydsaname)); else LLOG (log_stat,LLOG_NOTICE,("PANIC (%s)",mydsaname)); #endif (void) fprintf (stderr,"%s - core dumped\n",sys_siglist[sig]); abort (); exit (-20); /* abort may return */ }