Annotation of 43BSDReno/contrib/isode-beta/quipu/dsa.c, revision 1.1.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.