Annotation of 43BSDReno/contrib/isode-beta/quipu/dsa.c, revision 1.1

1.1     ! root        1: /* dsa.c - Main routine for QUIPU DSA process */
        !             2: 
        !             3: #ifndef lint
        !             4: static char *rcsid = "$Header: /f/osi/quipu/RCS/dsa.c,v 7.5 90/07/09 14:45:56 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/quipu/RCS/dsa.c,v 7.5 90/07/09 14:45:56 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       dsa.c,v $
        !            12:  * Revision 7.5  90/07/09  14:45:56  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.4  90/03/15  11:18:57  mrose
        !            16:  * quipu-sync
        !            17:  * 
        !            18:  * Revision 7.3  90/01/11  23:55:57  mrose
        !            19:  * lint
        !            20:  * 
        !            21:  * Revision 7.2  90/01/11  18:37:21  mrose
        !            22:  * real-sync
        !            23:  * 
        !            24:  * Revision 7.1  89/12/19  16:53:08  mrose
        !            25:  * dgram
        !            26:  * 
        !            27:  * Revision 7.0  89/11/23  22:17:19  mrose
        !            28:  * Release 6.0
        !            29:  * 
        !            30:  */
        !            31: 
        !            32: /*
        !            33:  *                                NOTICE
        !            34:  *
        !            35:  *    Acquisition, use, and distribution of this module and related
        !            36:  *    materials are subject to the restrictions of a license agreement.
        !            37:  *    Consult the Preface in the User's Manual for the full terms of
        !            38:  *    this agreement.
        !            39:  *
        !            40:  */
        !            41: 
        !            42: 
        !            43: #include <signal.h>
        !            44: #include <stdio.h>
        !            45: #include <varargs.h>
        !            46: #include "rosap.h"
        !            47: #include "tsap.h"
        !            48: #include "logger.h"
        !            49: #include "tailor.h"
        !            50: #include "quipu/util.h"
        !            51: #include "quipu/connection.h"
        !            52: #include <sys/ioctl.h>
        !            53: #include <sys/stat.h>
        !            54: #ifdef  BSD42
        !            55: #include <sys/file.h>
        !            56: #endif
        !            57: #ifdef  SYS5
        !            58: #include <fcntl.h>
        !            59: #endif
        !            60: 
        !            61: #include "dgram.h"
        !            62: #ifdef TCP
        !            63: #include "internet.h"
        !            64: #endif
        !            65: 
        !            66: PS      opt;
        !            67: static  int   debug = 1;
        !            68: static  int   nbits = FD_SETSIZE;
        !            69: 
        !            70: extern LLog * log_dsap;
        !            71: 
        !            72: static  char *myname;
        !            73: 
        !            74: void    adios (), advise ();
        !            75: static  envinit (), setdsauid();
        !            76: SFD attempt_restart();
        !            77: extern int print_parse_errors;
        !            78: extern int parse_line;
        !            79: struct task_act        * task_select();
        !            80: 
        !            81: extern SFP abort_vector;
        !            82: 
        !            83: #ifndef NO_STATS
        !            84: extern LLog    *log_stat;
        !            85: #endif
        !            86: 
        !            87: /*
        !            88: * Basic data structure of the DSA server.
        !            89: */
        !            90: char                   * mydsaname = "undefined";
        !            91: struct PSAPaddr                * mydsaaddr = NULLPA;
        !            92: struct connection      * connlist;
        !            93: int                      conns_used;
        !            94: struct connection      * connwaitlist;
        !            95: struct di_block                * deferred_dis = NULL_DI_BLOCK;
        !            96: struct oper_act                * get_edb_ops;
        !            97: OID                      acse_pci;
        !            98: OID                      x500_da_ac;
        !            99: OID                      x500_da_as;
        !           100: OID                      x500_ds_ac;
        !           101: OID                      x500_ds_as;
        !           102: OID                      quipu_ds_ac;
        !           103: OID                      quipu_ds_as;
        !           104: struct PSAPctxlist         x500_da_pcdl_s;
        !           105: struct PSAPctxlist     * x500_da_pcdl = &x500_da_pcdl_s;
        !           106: struct PSAPctxlist         x500_ds_pcdl_s;
        !           107: struct PSAPctxlist     * x500_ds_pcdl = &x500_ds_pcdl_s;
        !           108: struct PSAPctxlist         quipu_ds_pcdl_s;
        !           109: struct PSAPctxlist     * quipu_ds_pcdl = &quipu_ds_pcdl_s;
        !           110: 
        !           111: 
        !           112: char ** sargv;
        !           113: 
        !           114: main(argc, argv)
        !           115: int    argc;
        !           116: char    **argv;
        !           117: {
        !           118: #ifdef DEBUG
        !           119:     unsigned proc_size = 0;
        !           120:     unsigned new_size;
        !           121:     extern caddr_t sbrk();
        !           122: #endif
        !           123:     extern char        * mydsaname;
        !           124:     extern char          startup_update;
        !           125:     extern  struct PSAPaddr * mydsaaddr;
        !           126:     struct task_act    * task;
        !           127:     int                  secs;
        !           128:     char start_buf [LINESIZE];
        !           129:     /*
        !           130:     * Function to stop DSA server.
        !           131:     */
        !           132:     SFD          stop_dsa();
        !           133: 
        !           134:     sargv = argv;
        !           135: 
        !           136:     if (myname = rindex (argv[0], '/'))
        !           137:        myname++;
        !           138:     if (myname == NULL || *myname == NULL)
        !           139:        myname = argv[0];
        !           140: 
        !           141:     isodetailor (myname,0);
        !           142: 
        !           143:     envinit();  /* detach */
        !           144: 
        !           145:     quipu_syntaxes ();
        !           146:     dsa_sys_init(&argc, &argv);
        !           147:     setdsauid();
        !           148: 
        !           149:     print_parse_errors = FALSE;
        !           150: 
        !           151: #ifndef NO_STATS
        !           152:     ll_hdinit (log_stat,myname);
        !           153: #endif
        !           154: 
        !           155:     if ((opt = ps_alloc (std_open)) == NULLPS)
        !           156:             fatal (-12,"ps_alloc failed");
        !           157:     if (std_setup (opt,stdout) == NOTOK)
        !           158:             fatal (-13,"std_setup failed");
        !           159: 
        !           160:     DLOG (log_dsap,LLOG_DEBUG,( "About to dsa_init()"));
        !           161: 
        !           162:     if(dsa_init() == NOTOK)
        !           163:     {
        !           164:        fatal(-14,"Couldn't initialise the DSA!!");
        !           165:     }
        !           166: 
        !           167: 
        !           168:     if(net_init() == NOTOK)
        !           169:     {
        !           170:        fatal(-15,"Couldn't start the DSA!!");
        !           171:     }
        !           172: 
        !           173: 
        !           174:     if (startup_update) 
        !           175:     {
        !           176:        /* Will generate a list of EDB operations! */
        !           177:        slave_update();
        !           178:     }
        !           179: 
        !           180:     {
        !           181:        extern char *treedir;
        !           182:        char    filebuf[BUFSIZ];
        !           183:        FILE   *fp;
        !           184: 
        !           185:        (void) sprintf (filebuf, "%s/PID", treedir);
        !           186:        if (fp = fopen (filebuf, "w")) {
        !           187:            (void) fprintf (fp, "%d\n", getpid ());
        !           188:            (void) fclose (fp);
        !           189:        }
        !           190:        else
        !           191:            LLOG (log_dsap,LLOG_EXCEPTIONS,("Can't open PID file %s",filebuf));
        !           192:     }
        !           193: 
        !           194:     /*
        !           195:     * Do stop_dsa() on receiving a Ctrl-C
        !           196:     */
        !           197: 
        !           198:     (void) signal (SIGINT, stop_dsa);
        !           199:     (void) signal (SIGTERM,stop_dsa);
        !           200:     (void) signal (SIGHUP, stop_dsa);
        !           201: 
        !           202:     /* now started don't stop on core dumps !!! */
        !           203:     (void) signal (SIGQUIT, attempt_restart);
        !           204:     (void) signal (SIGILL,  attempt_restart);
        !           205:     (void) signal (SIGBUS,  attempt_restart);
        !           206:     (void) signal (SIGSEGV, attempt_restart);
        !           207:     (void) signal (SIGSYS,  attempt_restart);
        !           208: 
        !           209:     abort_vector = attempt_restart;
        !           210:     parse_line = 0;
        !           211: 
        !           212:     (void) sprintf (start_buf,"DSA %s has started on %s",mydsaname,paddr2str(mydsaaddr,NULLNA));
        !           213:     LLOG (log_dsap,LLOG_NOTICE,(start_buf));
        !           214: #ifndef NO_STATS
        !           215:     LLOG (log_stat,LLOG_NOTICE,(start_buf));
        !           216: #endif
        !           217: 
        !           218:      if (debug)
        !           219:        (void) fprintf (stderr,"%s\n",start_buf);
        !           220: 
        !           221:     start_malloc_trace (NULLCP);
        !           222: 
        !           223: #ifdef DEBUG
        !           224:     proc_size = (unsigned) sbrk(0);
        !           225: #endif
        !           226: 
        !           227:     for(;;)
        !           228:     {
        !           229:        if((task = task_select(&secs)) == NULLTASK)
        !           230:        {
        !           231: #ifdef DEBUG
        !           232:           if (secs > 0) {
        !           233:                /* Only if we are idle ! */
        !           234:                new_size = (unsigned) sbrk(0);
        !           235:                if ( new_size > proc_size) {
        !           236:                        LLOG (log_dsap, LLOG_NOTICE, ("Process grown by %d bytes", new_size - proc_size));
        !           237:                        proc_size = new_size;
        !           238:                }
        !           239:            }
        !           240: #endif
        !           241:            dsa_wait(secs);     /* Check network with timeout of secs */
        !           242:        }
        !           243:        else
        !           244:        {
        !           245:            dsa_work(task);     /* Process the DSA task selected */
        !           246:            dsa_wait(0);
        !           247:        }
        !           248:     } /* forever */
        !           249: } /* main */
        !           250: 
        !           251: dsa_abort(isfatal)
        !           252: int    isfatal;
        !           253: {
        !           254:     struct connection          * cn;
        !           255:     struct DSAPindication        di_s;
        !           256:     struct DSAPindication      * di = &di_s;
        !           257: 
        !           258:     for(cn=connlist; cn!=NULLCONN; cn=cn->cn_next)
        !           259:        if (cn -> cn_ad != NOTOK) {
        !           260:            if (isfatal || (! cn -> cn_initiator))
        !           261:                (void) close (cn -> cn_ad);
        !           262:            else {
        !           263:                watch_dog ("DUAbortRequest quit");
        !           264:                (void) DUAbortRequest(cn->cn_ad, di);
        !           265:                watch_dog_reset ();
        !           266:            }
        !           267:        }
        !           268: 
        !           269:     watch_dog ("stop_listeners");
        !           270:     stop_listeners();
        !           271:     watch_dog_reset();
        !           272: }
        !           273: 
        !           274: SFD stop_dsa (sig)
        !           275: int sig;
        !           276: {
        !           277:        (void) signal (sig, SIG_DFL); /* to stop recursion */
        !           278:        LLOG (log_dsap,LLOG_FATAL,("*** Stopping on signal %d ***",sig));
        !           279:        if (debug)
        !           280:                (void) fprintf (stderr,"DSA %s has Stopped\n",mydsaname);
        !           281:        dsa_abort(0);
        !           282:        exit (0);
        !           283: }
        !           284: 
        !           285: static  envinit () {
        !           286:     int     i,
        !           287:            sd;
        !           288: 
        !           289:     nbits = getdtablesize ();
        !           290: 
        !           291:     if (!(debug = isatty (2))) {
        !           292:        for (i = 0; i < 5; i++) {
        !           293:            switch (fork ()) {
        !           294:                case NOTOK:
        !           295:                    sleep (5);
        !           296:                    continue;
        !           297: 
        !           298:                case OK:
        !           299:                    goto fork_ok;
        !           300: 
        !           301:                default:
        !           302:                    _exit (0);
        !           303:            }
        !           304:            break;
        !           305:        }
        !           306: 
        !           307: fork_ok:;
        !           308:        (void) chdir ("/");
        !           309: 
        !           310:        if ((sd = open ("/dev/null", O_RDWR)) == NOTOK)
        !           311:            adios ("/dev/null", "unable to read");
        !           312:        if (sd != 0)
        !           313:            (void) dup2 (sd, 0), (void) close (sd);
        !           314:        (void) dup2 (0, 1);
        !           315:        (void) dup2 (0, 2);
        !           316: 
        !           317: #ifdef SETSID
        !           318:        if (setsid () == NOTOK)
        !           319:            advise (LLOG_EXCEPTIONS, "failed", "setsid");
        !           320: #endif
        !           321: #ifdef  TIOCNOTTY
        !           322:        if ((sd = open ("/dev/tty", O_RDWR)) != NOTOK) {
        !           323:            (void) ioctl (sd, TIOCNOTTY, NULLCP);
        !           324:            (void) close (sd);
        !           325:        }
        !           326: #else
        !           327: #ifdef  SYS5
        !           328:        (void) setpgrp ();
        !           329:        (void) signal (SIGINT, SIG_IGN);
        !           330:        (void) signal (SIGQUIT, SIG_IGN);
        !           331: #endif
        !           332: #endif
        !           333:     }
        !           334: #ifndef        DEBUG
        !           335:     /* "Normal" ISODE behavior of full logging only without DEBUG */
        !           336:     else
        !           337:        ll_dbinit (log_dsap, myname);
        !           338: #endif
        !           339: 
        !           340: #ifndef        sun             /* damn YP... */
        !           341:     for (sd = 3; sd < nbits; sd++) {
        !           342:        if (log_dsap -> ll_fd == sd)
        !           343:            continue;
        !           344: #ifdef NO_STATS
        !           345:        if (log_stats -> ll_fd == sd)
        !           346:            continue;
        !           347: #endif
        !           348:        (void) close (sd);
        !           349:     }
        !           350: #endif
        !           351: 
        !           352:     (void) signal (SIGPIPE, SIG_IGN);
        !           353: 
        !           354:     ll_hdinit (log_dsap, myname);
        !           355: #ifdef DEBUG
        !           356:     advise (LLOG_TRACE, NULLCP, "starting");
        !           357: #endif
        !           358: }
        !           359: 
        !           360: 
        !           361: /*    ERRORS */
        !           362: 
        !           363: #ifndef        lint
        !           364: void    adios (va_alist)
        !           365: va_dcl
        !           366: {
        !           367:     va_list ap;
        !           368: 
        !           369:     va_start (ap);
        !           370: 
        !           371:     _ll_log (log_dsap, LLOG_FATAL, ap);
        !           372: 
        !           373:     va_end (ap);
        !           374: 
        !           375:     if (debug)
        !           376:        (void) fprintf (stderr,"adios exit - see dsap.log\n");
        !           377:     dsa_abort(1);
        !           378:     _exit (-18);
        !           379: }
        !           380: #else
        !           381: /* VARARGS */
        !           382: 
        !           383: void    adios (what, fmt)
        !           384: char   *what,
        !           385:        *fmt;
        !           386: {
        !           387:     adios (what, fmt);
        !           388: }
        !           389: #endif
        !           390: 
        !           391: #ifndef        lint
        !           392: void    advise (va_alist)
        !           393: va_dcl
        !           394: {
        !           395:     int     code;
        !           396:     va_list ap;
        !           397: 
        !           398:     va_start (ap);
        !           399: 
        !           400:     code = va_arg (ap, int);
        !           401: 
        !           402:     (void) _ll_log (log_dsap, code, ap);
        !           403: 
        !           404:     va_end (ap);
        !           405: }
        !           406: #else
        !           407: /* VARARGS */
        !           408: 
        !           409: void   advise (code, what, fmt)
        !           410: char   *what,
        !           411:        *fmt;
        !           412: int     code;  
        !           413: {
        !           414:     advise (code, what, fmt);
        !           415: }
        !           416: #endif
        !           417: 
        !           418: 
        !           419: 
        !           420: static setdsauid ()
        !           421: {
        !           422: struct stat buf;
        !           423: extern char * treedir;
        !           424: 
        !           425:        (void) stat (treedir,&buf);
        !           426: 
        !           427:        if (setgid (buf.st_gid) == -1)
        !           428:                LLOG (log_dsap,LLOG_EXCEPTIONS,("Can't set gid %d (database directory \"%s\")",buf.st_uid,treedir));
        !           429: 
        !           430:        if (setuid (buf.st_uid) == -1)
        !           431:                LLOG (log_dsap,LLOG_EXCEPTIONS,("Can't set uid %d (database directory \"%s\")",buf.st_uid,treedir));
        !           432: }
        !           433: 
        !           434: #define        RESTART_TIME    30              /* for connections to clear... */
        !           435: #define        CLEAR_TIME      300             /*   .. */
        !           436: 
        !           437: SFD attempt_restart (sig)
        !           438: int     sig;
        !           439: {
        !           440: int fpid, sd;
        !           441: unsigned int secs;
        !           442: extern char * mydsaname;
        !           443: 
        !           444:        if (sig > 0)
        !           445:                (void) signal (sig, SIG_DFL); /* to stop recursion */
        !           446: 
        !           447:        if (sig >= 0 && debug)
        !           448:                (void) fprintf (stderr,"DSA %s has a problem\n",mydsaname);
        !           449: 
        !           450:        dsa_abort(sig != NOTOK);
        !           451:        secs = sig != NOTOK ? CLEAR_TIME : RESTART_TIME;
        !           452: 
        !           453:        for (sd = 3; sd < nbits; sd++) {
        !           454:            if (log_dsap -> ll_fd == sd)
        !           455:                continue;
        !           456: #ifdef NO_STATS
        !           457:            if (log_stats -> ll_fd == sd)
        !           458:                continue;
        !           459: #endif
        !           460:            (void) close (sd);
        !           461:        }
        !           462: 
        !           463:        if ( sig == -2 || (fpid = fork()) == 0) {
        !           464:                if (sig == -2) {                    /* restart due to congestion... */
        !           465:                        LLOG (log_dsap,LLOG_FATAL, ("*** in-situ restart attempted ***"));
        !           466: #ifndef NO_STATS
        !           467:                        LLOG (log_stat,LLOG_NOTICE,("RESTARTING (%s)",mydsaname));
        !           468: #endif
        !           469:                }
        !           470: 
        !           471:                sleep (secs);   /* give connections time to clear */
        !           472:                execv (isodefile(sargv[0], 1),sargv);
        !           473:                exit (-19);
        !           474:        }
        !           475: 
        !           476:        if (sig >= 0)
        !           477:                LLOG (log_dsap,LLOG_FATAL,("*** Process dying on signal %d ***",sig));
        !           478: 
        !           479:        if (fpid != -1) {
        !           480:                LLOG (log_dsap,LLOG_FATAL,("*** restart attempted in %d seconds ***", secs));
        !           481: #ifndef NO_STATS
        !           482:                LLOG (log_stat,LLOG_NOTICE,("RESTARTING with pid %d (%s)",fpid,mydsaname));
        !           483:        } else {
        !           484:                LLOG (log_stat,LLOG_NOTICE,("PANIC (%s)",mydsaname));
        !           485: #endif
        !           486:        }
        !           487: 
        !           488:        (void) signal (SIGIOT, SIG_DFL);
        !           489:        abort ();
        !           490:        exit (-20);  /* abort should not return */
        !           491: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.