Annotation of 43BSDReno/contrib/isode-beta/support/tsapd.c, revision 1.1

1.1     ! root        1: /* tsapd.c - OSI transport server */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/support/RCS/tsapd.c,v 7.2 90/07/09 14:51:00 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/support/RCS/tsapd.c,v 7.2 90/07/09 14:51:00 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       tsapd.c,v $
        !            12:  * Revision 7.2  90/07/09  14:51:00  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.1  90/02/19  13:09:53  mrose
        !            16:  * update
        !            17:  * 
        !            18:  * Revision 7.0  89/11/23  22:27:46  mrose
        !            19:  * Release 6.0
        !            20:  * 
        !            21:  */
        !            22: 
        !            23: /*
        !            24:  *                               NOTICE
        !            25:  *
        !            26:  *    Acquisition, use, and distribution of this module and related
        !            27:  *    materials are subject to the restrictions of a license agreement.
        !            28:  *    Consult the Preface in the User's Manual for the full terms of
        !            29:  *    this agreement.
        !            30:  *
        !            31:  */
        !            32: 
        !            33: 
        !            34: #include <errno.h>
        !            35: #include <signal.h>
        !            36: #include <stdio.h>
        !            37: #include <varargs.h>
        !            38: #include "manifest.h"
        !            39: #include <sys/ioctl.h>
        !            40: #include <sys/stat.h>
        !            41: #ifdef BSD42
        !            42: #include <sys/file.h>
        !            43: #endif
        !            44: #ifdef SYS5
        !            45: #include <fcntl.h>
        !            46: #endif
        !            47: #ifndef        X_OK
        !            48: #define        X_OK    1
        !            49: #endif
        !            50: 
        !            51: #ifndef        NOGOSIP
        !            52: #include "rosap.h"
        !            53: #include "rtsap.h"
        !            54: #include "psap2.h"
        !            55: #include "ssap.h"
        !            56: #endif
        !            57: #include "tpkt.h"
        !            58: 
        !            59: #ifdef TCP
        !            60: #include "internet.h"
        !            61: #endif
        !            62: #ifdef X25
        !            63: #include "x25.h"
        !            64: #endif
        !            65: #ifdef TP4
        !            66: #include "tp4.h"
        !            67: #endif
        !            68: #include "isoservent.h"
        !            69: #include "tailor.h"
        !            70: 
        !            71: /*  */
        !            72: 
        !            73: static int  debug = 0;
        !            74: static int  nbits = FD_SETSIZE;
        !            75: 
        !            76: static LLog _pgm_log = {
        !            77:     "tsapd.log", NULLCP, NULLCP, LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE,
        !            78:     LLOG_FATAL, -1, LLOGCLS | LLOGCRT | LLOGZER, NOTOK
        !            79: };
        !            80: LLog *pgm_log = &_pgm_log;
        !            81: 
        !            82: static char *myname = "tsapd";
        !            83: static char myhost[BUFSIZ];
        !            84: 
        !            85: static int     tcpservice = 1;
        !            86: static int     x25service = 1;
        !            87: static int     bridgeservice = 1;
        !            88: static int     tp4service = 1;
        !            89: 
        !            90: 
        !            91: #define        NTADDRS FD_SETSIZE
        !            92: 
        !            93: static struct TSAPaddr *tz;
        !            94: static struct TSAPaddr  tas[NTADDRS];
        !            95: 
        !            96: 
        !            97: 
        !            98: 
        !            99: void   adios (), advise ();
        !           100: void   ts_advise ();
        !           101: 
        !           102: #ifdef NOGOSIP
        !           103: #define        ssapd   NULLIFP
        !           104: #else
        !           105: int    ssapd (), psapd ();
        !           106: #endif
        !           107: 
        !           108: 
        !           109: 
        !           110: extern int  errno;
        !           111: 
        !           112: /*  */
        !           113: 
        !           114: /* ARGSUSED */
        !           115: 
        !           116: main (argc, argv, envp)
        !           117: int     argc;
        !           118: char  **argv,
        !           119:       **envp;
        !           120: {
        !           121:     int            failed,
        !           122:            listening,
        !           123:            vecp;
        !           124:     char   *vec[4];
        !           125:     register struct NSAPaddr  *na;
        !           126:     register struct TSAPaddr  *ta;
        !           127:     struct TSAPdisconnect   tds;
        !           128:     register struct TSAPdisconnect  *td = &tds;
        !           129: 
        !           130:     arginit (argv);
        !           131:     envinit ();
        !           132: 
        !           133:     failed = listening = 0;
        !           134: 
        !           135:     for (ta = tas; ta < tz; ta++) {
        !           136:        if (ta -> ta_naddr == 0) {
        !           137:            if (!tp4service)
        !           138:                continue;
        !           139:        }
        !           140:        else {
        !           141:            na = ta -> ta_addrs;
        !           142:            
        !           143:            switch (na -> na_stack) {
        !           144:                case NA_TCP:
        !           145:                    if (!tcpservice)
        !           146:                        continue;
        !           147:                    break;
        !           148: 
        !           149:                case NA_X25:
        !           150:                    if (!x25service)
        !           151:                        continue;
        !           152:                    break;
        !           153: 
        !           154:                case NA_BRG:
        !           155:                    if (!bridgeservice)
        !           156:                        continue;
        !           157:                    break;
        !           158: 
        !           159:                case NA_NSAP:
        !           160:                    if (!tp4service)
        !           161:                        continue;
        !           162:                    break;
        !           163: 
        !           164:                default:
        !           165:                    adios (NULLCP, "unknown network type 0x%x", na -> na_stack);
        !           166:                    /* NOTREACHED */
        !           167:            }
        !           168:        }
        !           169: 
        !           170:        advise (LLOG_NOTICE, NULLCP, "listening on %s", taddr2str (ta));
        !           171: 
        !           172:        if (TNetListen (ta, td) == NOTOK) {
        !           173:            ts_advise (td, LLOG_EXCEPTIONS, "TNetListen failed");
        !           174:            failed++;
        !           175:        }
        !           176:        else
        !           177:            listening++;
        !           178:     }
        !           179: 
        !           180:     if (!listening)
        !           181:        adios (NULLCP, failed ? "no successful listens"
        !           182:                              : "no network services selected");
        !           183: 
        !           184:     for (;;) {
        !           185:        if (TNetAccept (&vecp, vec, 0, NULLFD, NULLFD, NULLFD, NOTOK, td)
        !           186:                == NOTOK) {
        !           187:            ts_advise (td, LLOG_EXCEPTIONS, "TNetAccept failed");
        !           188:            continue;
        !           189:        }
        !           190: 
        !           191:        if (vecp <= 0)
        !           192:            continue;
        !           193: 
        !           194:        switch (TNetFork (vecp, vec, td)) {
        !           195:            case OK:
        !           196:                ll_hdinit (pgm_log, myname);
        !           197:                tsapd (vecp, vec);
        !           198:                exit (1);
        !           199:                /* NOTREACHED */
        !           200: 
        !           201:            case NOTOK:
        !           202:                ts_advise (td, LLOG_EXCEPTIONS, "TNetFork failed");
        !           203:            default:
        !           204:                break;
        !           205:        }
        !           206:     }
        !           207: }
        !           208: 
        !           209: /*  */
        !           210: 
        !           211: static char buffer1[4096];
        !           212: static char buffer2[32768];
        !           213: 
        !           214: 
        !           215: static int  tsapd (vecp, vec)
        !           216: int    vecp;
        !           217: char  **vec;
        !           218: {
        !           219:     char    buffer[BUFSIZ];
        !           220:     register struct isoservent *is;
        !           221:     struct tsapblk *tb;
        !           222:     struct TSAPstart   tss;
        !           223:     register struct TSAPstart *ts = &tss;
        !           224:     struct TSAPdisconnect   tds;
        !           225:     register struct TSAPdisconnect  *td = &tds;
        !           226:     IFP            hook;
        !           227: 
        !           228: /* begin UGLY */
        !           229:     (void) strcpy (buffer1, vec[1]);
        !           230:     (void) strcpy (buffer2, vec[2]);
        !           231: /* end UGLY */
        !           232: 
        !           233:     if (TInit (vecp, vec, ts, td) == NOTOK) {
        !           234:        ts_advise (td, LLOG_EXCEPTIONS, "T-CONNECT.INDICATION");
        !           235:        return;
        !           236:     }
        !           237: 
        !           238: /* used to print this in ssapd()... */
        !           239:     advise (LLOG_NOTICE, NULLCP,
        !           240:            "T-CONNECT.INDICATION: <%d, %s, %s, %d, %d>",
        !           241:            ts -> ts_sd,
        !           242:            taddr2str (&ts -> ts_calling), taddr2str (&ts -> ts_called),
        !           243:            ts -> ts_expedited, ts -> ts_tsdusize);
        !           244: 
        !           245: 
        !           246:     hook = ssapd;
        !           247:     if (ts -> ts_called.ta_selectlen) {
        !           248:        if ((is = getisoserventbyselector ("tsap", ts -> ts_called.ta_selector,
        !           249:                                           ts -> ts_called.ta_selectlen))
        !           250:                == NULL) {
        !           251:            (void) sprintf (buffer, "OSI service tsap/%s not found",
        !           252:                            sel2str (ts -> ts_called.ta_selector,
        !           253:                                     ts -> ts_called.ta_selectlen, 1));
        !           254:            goto out;
        !           255:        }
        !           256:     }
        !           257:     else
        !           258:        if (hook == NULLIFP
        !           259:                || (is = getisoserventbyname ("session", "tsap")) == NULL) {
        !           260:            (void) strcpy (buffer, "default session service not found");
        !           261:            goto out;
        !           262:        }
        !           263: 
        !           264:     *is -> is_tail++ = buffer1;
        !           265:     *is -> is_tail++ = buffer2;
        !           266:     *is -> is_tail = NULL;
        !           267: 
        !           268:     if (tb = findtblk (ts -> ts_sd))
        !           269:        tb -> tb_fd = NOTOK;
        !           270:     switch (hook ? (*hook) (is, td) : OK) {
        !           271:        case NOTOK:
        !           272:            ts_advise (td, LLOG_EXCEPTIONS, "service not started at tsap");
        !           273:        case DONE:
        !           274:            exit (1);
        !           275:            /* NOTREACHED */
        !           276: 
        !           277:        case OK:
        !           278:        default:
        !           279:            (void) setperms (is);
        !           280:            (void) execv (*is -> is_vec, is -> is_vec);
        !           281:            (void) sprintf (buffer, "unable to exec %s: %s",
        !           282:                            *is -> is_vec, sys_errname (errno));
        !           283:            SLOG (pgm_log, LLOG_FATAL, NULLCP, ("%s", buffer));
        !           284:            break;
        !           285:     }
        !           286: 
        !           287: out: ;
        !           288:     advise (LLOG_EXCEPTIONS, NULLCP, "%s", buffer);
        !           289:     if (strlen (buffer) >= TD_SIZE)
        !           290:        buffer[0] = NULL;
        !           291:     (void) TDiscRequest (ts -> ts_sd, buffer, strlen (buffer) + 1, td);
        !           292: 
        !           293:     exit (1);
        !           294: }
        !           295: 
        !           296: /*  */
        !           297: 
        !           298: static int  setperms (is)
        !           299: register struct isoservent *is;
        !           300: {
        !           301:     struct stat st;
        !           302: 
        !           303:     if (stat (*is -> is_vec, &st) == NOTOK) {
        !           304:        (void) setgid (1);
        !           305:        (void) setuid (1);
        !           306:     }
        !           307:     else {
        !           308:        (void) setgid (st.st_gid);
        !           309:        (void) setuid (st.st_uid);
        !           310:     }
        !           311: }
        !           312: 
        !           313: /*  */
        !           314: 
        !           315: static void  ts_advise (td, code, event)
        !           316: register struct TSAPdisconnect *td;
        !           317: int    code;
        !           318: char   *event;
        !           319: {
        !           320:     char    buffer[BUFSIZ];
        !           321: 
        !           322:     if (td -> td_cc > 0)
        !           323:        (void) sprintf (buffer, "[%s] %*.*s",
        !           324:                TErrString (td -> td_reason),
        !           325:                td -> td_cc, td -> td_cc, td -> td_data);
        !           326:     else
        !           327:        (void) sprintf (buffer, "[%s]", TErrString (td -> td_reason));
        !           328: 
        !           329:     advise (code, NULLCP, "%s: %s", event, buffer);
        !           330: }
        !           331: 
        !           332: /*  */
        !           333: 
        !           334: #ifndef        NOGOSIP
        !           335: static int  ssapd (is, td)
        !           336: register struct isoservent *is;
        !           337: register struct TSAPdisconnect *td;
        !           338: {
        !           339:     int            sd;
        !           340:     struct TSAPstart    tss;
        !           341:     register struct TSAPstart  *ts = &tss;
        !           342:     struct SSAPindication sis;
        !           343:     register struct SSAPabort *sa = &sis.si_abort;
        !           344: 
        !           345:     if (strcmp (is -> is_entity, "session")
        !           346:            || strcmp (is -> is_provider, "tsap"))
        !           347:        return OK;
        !           348: 
        !           349:     if (TInit (is -> is_tail - is -> is_vec, is -> is_vec, ts, td) == NOTOK)
        !           350:        return NOTOK;
        !           351: 
        !           352:     sd = ts -> ts_sd;
        !           353: 
        !           354:     if (TConnResponse (sd, &ts -> ts_called, ts -> ts_expedited, NULLCP, 0,
        !           355:                       NULLQOS, td) == NOTOK)
        !           356:        return NOTOK;
        !           357: 
        !           358:     if (SExec (ts, &sis, psapd, setperms) == NOTOK) {
        !           359:        advise (LLOG_EXCEPTIONS, NULLCP, "service not started at ssap: %s",
        !           360:                SErrString (sa -> sa_reason));
        !           361:        if (sa -> sa_cc > 0)
        !           362:            advise (LLOG_EXCEPTIONS, NULLCP, "   %*.*s",
        !           363:                    sa -> sa_cc, sa -> sa_cc, sa -> sa_data);
        !           364: 
        !           365:        SAFREE (sa);
        !           366:     }
        !           367:                
        !           368:     return DONE;
        !           369: }
        !           370: 
        !           371: /*  */
        !           372: 
        !           373: #define        RMASK \
        !           374:     "\020\01HALFDUPLEX\02DUPLEX\03EXPEDITED\04MINORSYNC\05MAJORSYNC\06RESYNC\
        !           375: \07ACTIVITY\010NEGOTIATED\011CAPABILITY\012EXCEPTIONS\013TYPEDATA"
        !           376: 
        !           377: 
        !           378: static int  psapd (is, si)
        !           379: register struct isoservent *is;
        !           380: register struct SSAPindication *si;
        !           381: {
        !           382:     struct SSAPstart    sss;
        !           383:     register struct SSAPstart  *ss = &sss;
        !           384:     struct PSAPindication  pis;
        !           385:     register struct PSAPabort *pa = &pis.pi_abort;
        !           386:     struct RtSAPindication  rtis;
        !           387:     register struct RtSAPabort *rta = &rtis.rti_abort;
        !           388:     struct RoSAPindication  rois;
        !           389:     register struct RoSAPpreject   *rop = &rois.roi_preject;
        !           390: 
        !           391:     if (strcmp (is -> is_provider, "ssap"))
        !           392:        return OK;
        !           393: 
        !           394:     if (strcmp (is -> is_entity, "presentation")
        !           395:            && strcmp (is -> is_entity, "rts")
        !           396:            && strcmp (is -> is_entity, "ros"))
        !           397:        return OK;
        !           398: 
        !           399: /* begin UGLY */
        !           400:     (void) strcpy (buffer1, *(is -> is_tail - 2));
        !           401:     (void) strcpy (buffer2, *(is -> is_tail - 1));
        !           402: /* end UGLY */
        !           403:     if (SInit (is -> is_tail - is -> is_vec, is -> is_vec, ss, si) == NOTOK)
        !           404:        return NOTOK;
        !           405:     advise (LLOG_NOTICE, NULLCP,
        !           406:            "S-CONNECT.INDICATION: <%d, %s, %s, %s, %s, %ld, %d>",
        !           407:            ss -> ss_sd, sprintref (&ss -> ss_connect),
        !           408:            saddr2str (&ss -> ss_calling), saddr2str (&ss -> ss_called),
        !           409:            sprintb (ss -> ss_requirements, RMASK), ss -> ss_isn,
        !           410:            ss -> ss_ssdusize);
        !           411: 
        !           412:     if (strcmp (is -> is_entity, "presentation") == 0) {
        !           413:        if (PExec (ss, &pis, buffer1, buffer2, NULLIFP, setperms) == NOTOK) {
        !           414:                advise (LLOG_EXCEPTIONS, NULLCP,
        !           415:                        "service not started at psap: %s",
        !           416:                        PErrString (pa -> pa_reason));
        !           417:                if (pa -> pa_cc > 0)
        !           418:                    advise (LLOG_EXCEPTIONS, NULLCP, "   %*.*s",
        !           419:                        pa -> pa_cc, pa -> pa_cc, pa -> pa_data);
        !           420:        }
        !           421: 
        !           422:        return DONE;
        !           423:     }
        !           424: 
        !           425:     if (strcmp (is -> is_entity, "rts") == 0) {
        !           426:        if (RtExec (ss, &rtis, buffer1, buffer2, NULLIFP, setperms) == NOTOK) {
        !           427:            advise (LLOG_EXCEPTIONS, NULLCP,
        !           428:                    "service not started at rtsap: %s",
        !           429:                    RtErrString (rta -> rta_reason));
        !           430:            if (rta -> rta_cc > 0)
        !           431:                advise (LLOG_EXCEPTIONS, NULLCP, "   %*.*s",
        !           432:                        rta -> rta_cc, rta -> rta_cc, rta -> rta_data);
        !           433:        }
        !           434:     }
        !           435:     else {
        !           436:        if (RoExec (ss, &rois, buffer1, buffer2, NULLIFP, setperms) == NOTOK) {
        !           437:            advise (LLOG_EXCEPTIONS, NULLCP,
        !           438:                    "service not started at rosap: %s",
        !           439:                    RoErrString (rop -> rop_reason));
        !           440:            if (rop -> rop_cc > 0)
        !           441:                advise (LLOG_EXCEPTIONS, NULLCP, "   %*.*s",
        !           442:                        rop -> rop_cc, rop -> rop_cc, rop -> rop_data);
        !           443:        }
        !           444:     }
        !           445: 
        !           446:     return DONE;
        !           447: }
        !           448: #endif
        !           449: 
        !           450: /*  */
        !           451: 
        !           452: static arginit (vec)
        !           453: char   **vec;
        !           454: {
        !           455:     int            rflag;
        !           456:     register char  *ap;
        !           457: #ifdef TCP
        !           458:     int            port;
        !           459:     struct NSAPaddr *tcp_na;
        !           460:     register struct servent *sp;
        !           461: #endif
        !           462: #ifdef X25
        !           463:     struct NSAPaddr *x25_na;
        !           464: #endif
        !           465: #ifdef BRIDGE_X25
        !           466:     struct NSAPaddr *bridge_na;
        !           467: #endif
        !           468: #ifdef TP4
        !           469:     register struct isoservent *is;
        !           470: #endif
        !           471:     struct stat st;
        !           472: 
        !           473:     if (myname = rindex (*vec, '/'))
        !           474:        myname++;
        !           475:     if (myname == NULL || *myname == NULL)
        !           476:        myname = *vec;
        !           477: 
        !           478:     isodetailor (myname, 0);
        !           479:     ll_hdinit (pgm_log, myname);
        !           480: 
        !           481:     rflag = 0;
        !           482: 
        !           483:     (void) strcpy (myhost, TLocalHostName ());
        !           484: 
        !           485:     bzero ((char *) tas, sizeof tas);
        !           486:     tz = tas;
        !           487: 
        !           488: #ifdef TCP
        !           489:     if (!(ts_stacks & TS_TCP))
        !           490:        tcpservice = 0;
        !           491:     if ((sp = getservbyname ("tsap", "tcp")) == NULL
        !           492:            && (sp = getservbyname ("iso-tsap", "tcp")) == NULL)
        !           493:        advise (LLOG_EXCEPTIONS, NULLCP, "tcp/tsap: unknown service");
        !           494: 
        !           495:     tcp_na = tz -> ta_addrs;
        !           496:     tcp_na -> na_stack = NA_TCP;
        !           497:     tcp_na -> na_community = ts_comm_tcp_default;
        !           498:     tcp_na -> na_domain[0] = NULL;
        !           499:     tcp_na -> na_port = sp ? sp -> s_port : htons ((u_short) 102);
        !           500:     tz -> ta_naddr = 1;
        !           501: 
        !           502:     tz++;
        !           503: #endif
        !           504: 
        !           505: #ifdef X25
        !           506:     if (!(ts_stacks & TS_X25))
        !           507:        x25service = 0;
        !           508: 
        !           509:     x25_na = tz -> ta_addrs;
        !           510:     x25_na -> na_stack = NA_X25;
        !           511:     x25_na -> na_community = ts_comm_x25_default;
        !           512:     if (x25_local_dte && *x25_local_dte) {
        !           513:        (void) strcpy (x25_na -> na_dte, x25_local_dte);
        !           514:        x25_na -> na_dtelen = strlen (x25_na -> na_dte);
        !           515:     }
        !           516:     if (x25_local_pid && *x25_local_pid)
        !           517:        x25_na -> na_pidlen =
        !           518:            str2sel (x25_local_pid, -1, x25_na -> na_pid, NPSIZE);
        !           519:     tz -> ta_naddr = 1;
        !           520: 
        !           521:     tz++;
        !           522: #endif
        !           523: 
        !           524: #ifdef BRIDGE_X25
        !           525:     if (!(ts_stacks & TS_BRG))
        !           526:        bridgeservice = 0;
        !           527: 
        !           528:     bridge_na = tz -> ta_addrs;
        !           529:     bridge_na -> na_stack = NA_BRG;
        !           530:     bridge_na -> na_community = ts_comm_x25_default;
        !           531:     if (x25_bridge_listen && *x25_bridge_listen) {
        !           532:        (void) strcpy (bridge_na -> na_dte, x25_bridge_listen);
        !           533:        bridge_na -> na_dtelen = strlen (bridge_na -> na_dte);
        !           534:     }
        !           535:     if (x25_bridge_pid && *x25_bridge_pid)
        !           536:        bridge_na -> na_pidlen =
        !           537:            str2sel (x25_bridge_pid, -1, bridge_na -> na_pid, NPSIZE);
        !           538:     tz -> ta_naddr = 1;
        !           539: 
        !           540:     tz++;
        !           541: #endif
        !           542: 
        !           543: #ifdef TP4
        !           544:     if (!(ts_stacks & TS_TP4))
        !           545:        tp4service = 0;
        !           546: 
        !           547:     (void) setisoservent (0);
        !           548:     while (is = getisoservent ())
        !           549:        if (strcmp (is -> is_provider, "tsap") == 0
        !           550:                && (strcmp (*is -> is_vec, "tsapd-bootstrap") == 0
        !           551:                        || access (*is -> is_vec, X_OK) != NOTOK)) {
        !           552:            if (strcmp (is -> is_entity, "isore") == 0)
        !           553:                continue;
        !           554: 
        !           555:            if (tz >= tas + NTADDRS) {
        !           556:                advise (LLOG_EXCEPTIONS, NULLCP,
        !           557:                        "too many services, starting with %s",
        !           558:                        is -> is_entity);
        !           559:                break;
        !           560:            }
        !           561: 
        !           562:            bcopy (is -> is_selector, tz -> ta_selector,
        !           563:                   tz -> ta_selectlen = is -> is_selectlen);
        !           564:            tz -> ta_naddr = 0;
        !           565: 
        !           566:            tz++;
        !           567:        }
        !           568:     (void) endisoservent ();
        !           569: #endif
        !           570: 
        !           571:     for (vec++; ap = *vec; vec++) {
        !           572:        if (*ap == '-')
        !           573:            switch (*++ap) {
        !           574:                case 'd':
        !           575:                    debug++;
        !           576:                    continue;
        !           577:                
        !           578:                case 't': 
        !           579:                    ts_stacks = TS_TCP;
        !           580:                    tcpservice = 1;
        !           581:                    x25service = bridgeservice = tp4service = 0;
        !           582:                    continue;
        !           583: 
        !           584:                case 'x': 
        !           585:                    ts_stacks = TS_X25;
        !           586:                    x25service = 1;
        !           587:                    tcpservice = bridgeservice = tp4service = 0;
        !           588:                    continue;
        !           589: 
        !           590:                case 'z': 
        !           591:                    ts_stacks = TS_TP4;
        !           592:                    tp4service = 1;
        !           593:                    tcpservice = x25service = bridgeservice = 0;
        !           594:                    continue;
        !           595: 
        !           596:                case 'b':
        !           597:                    ts_stacks = TS_BRG;
        !           598:                    bridgeservice = 1;
        !           599:                    tcpservice = x25service = tp4service = 0;
        !           600:                    continue;
        !           601: 
        !           602:                case 'r':
        !           603:                    rflag = 1;
        !           604:                    continue;
        !           605: 
        !           606: #ifdef TCP
        !           607:                case 'p': 
        !           608:                    if ((ap = *++vec) == NULL
        !           609:                            || *ap == '-'
        !           610:                            || (port = atoi (ap)) <= 0)
        !           611:                        adios (NULLCP, "usage: %s -p portno", myname);
        !           612:                    tcp_na -> na_port = htons ((u_short) port);
        !           613:                    continue;
        !           614: #endif
        !           615: 
        !           616: #ifdef X25
        !           617:                /* This permits listening on a specific subaddress. */
        !           618:                case 'a':
        !           619:                    if ((ap = *++vec) == NULL || *ap == '-')
        !           620:                        adios (NULLCP, "usage: %s -a x121address", myname);
        !           621:                    (void) strcpy (x25_na -> na_dte, ap);
        !           622:                    x25_na -> na_dtelen = strlen (ap);
        !           623:                    continue;
        !           624: 
        !           625:                /* This permits listening on a specific protocol id.
        !           626:                   In fact, SunLink X.25 lets you listen on a protocol
        !           627:                   id mask, but let's keep it simple. */
        !           628:                case 'i':
        !           629:                    if ((ap = *++vec) == NULL || *ap == '-' )
        !           630:                        adios (NULLCP, "usage: %s -i pid", myname);
        !           631:                    x25_na -> na_pidlen =
        !           632:                        str2sel (ap, -1, x25_na -> na_pid, NPSIZE);
        !           633:                    continue;
        !           634: #endif
        !           635: 
        !           636: #ifdef BRIDGE_X25
        !           637:                case 'A':
        !           638:                    if ((ap = *++vec) == NULL ||
        !           639:                        *ap == '-')
        !           640:                        adios (NULLCP, "usage: %s -A x121address", myname);
        !           641:                    (void) strcpy (bridge_na -> na_dte, ap);
        !           642:                    bridge_na -> na_dtelen = strlen (ap);
        !           643:                    continue;
        !           644: 
        !           645:                case 'I':
        !           646:                    if ((ap = *++vec) == NULL || *ap == '-')
        !           647:                        adios (NULLCP, "usage: %s -I pid", myname);
        !           648:                    bridge_na -> na_pidlen =
        !           649:                        str2sel (ap, -1, bridge_na -> na_pid, NPSIZE);
        !           650:                    continue;
        !           651: #endif
        !           652: 
        !           653:                default: 
        !           654:                    adios (NULLCP, "-%s: unknown switch", ap);
        !           655:            }
        !           656: 
        !           657:        adios (NULLCP, "usage: %s [switches]", myname);
        !           658:     }
        !           659: 
        !           660:     if (!rflag
        !           661:            && getuid () == 0
        !           662:            && stat (ap = isodefile ("isoservices", 0), &st) != NOTOK
        !           663:            && st.st_uid != 0)
        !           664:        adios (NULLCP, "%s not owned by root", ap);
        !           665: }
        !           666: 
        !           667: /*  */
        !           668: 
        !           669: static  envinit () {
        !           670:     int     i,
        !           671:             sd;
        !           672: 
        !           673:     nbits = getdtablesize ();
        !           674: 
        !           675:     if (debug == 0 && !(debug = isatty (2))) {
        !           676:        for (i = 0; i < 5; i++) {
        !           677:            switch (fork ()) {
        !           678:                case NOTOK: 
        !           679:                    sleep (5);
        !           680:                    continue;
        !           681: 
        !           682:                case OK: 
        !           683:                    break;
        !           684: 
        !           685:                default: 
        !           686:                    _exit (0);
        !           687:            }
        !           688:            break;
        !           689:        }
        !           690: 
        !           691:        (void) chdir ("/");
        !           692: 
        !           693:        if ((sd = open ("/dev/null", O_RDWR)) == NOTOK)
        !           694:            adios ("/dev/null", "unable to read");
        !           695:        if (sd != 0)
        !           696:            (void) dup2 (sd, 0), (void) close (sd);
        !           697:        (void) dup2 (0, 1);
        !           698:        (void) dup2 (0, 2);
        !           699: 
        !           700: #ifdef SETSID
        !           701:        if (setsid () == NOTOK)
        !           702:            advise (LLOG_EXCEPTIONS, "failed", "setsid");
        !           703: #endif
        !           704: #ifdef TIOCNOTTY
        !           705:        if ((sd = open ("/dev/tty", O_RDWR)) != NOTOK) {
        !           706:            (void) ioctl (sd, TIOCNOTTY, NULLCP);
        !           707:            (void) close (sd);
        !           708:        }
        !           709: #else
        !           710: #ifdef SYS5
        !           711:        (void) setpgrp ();
        !           712:        (void) signal (SIGINT, SIG_IGN);
        !           713:        (void) signal (SIGQUIT, SIG_IGN);
        !           714: #endif
        !           715: #endif
        !           716:     }
        !           717:     else
        !           718:        ll_dbinit (pgm_log, myname);
        !           719: 
        !           720: #ifndef        sun             /* damn YP... */
        !           721:     for (sd = 3; sd < nbits; sd++)
        !           722:        if (pgm_log -> ll_fd != sd)
        !           723:            (void) close (sd);
        !           724: #endif
        !           725: 
        !           726:     (void) signal (SIGPIPE, SIG_IGN);
        !           727: 
        !           728:     ll_hdinit (pgm_log, myname);
        !           729:     advise (LLOG_NOTICE, NULLCP, "starting");
        !           730: }
        !           731: 
        !           732: /*    ERRORS */
        !           733: 
        !           734: #ifndef        lint
        !           735: void   adios (va_alist)
        !           736: va_dcl
        !           737: {
        !           738:     va_list ap;
        !           739: 
        !           740:     va_start (ap);
        !           741:     
        !           742:     _ll_log (pgm_log, LLOG_FATAL, ap);
        !           743: 
        !           744:     va_end (ap);
        !           745: 
        !           746:     _exit (1);
        !           747: }
        !           748: #else
        !           749: /* VARARGS */
        !           750: 
        !           751: void   adios (what, fmt)
        !           752: char   *what,
        !           753:        *fmt;
        !           754: {
        !           755:     adios (what, fmt);
        !           756: }
        !           757: #endif
        !           758: 
        !           759: 
        !           760: #ifndef        lint
        !           761: void   advise (va_alist)
        !           762: va_dcl
        !           763: {
        !           764:     int            code;
        !           765:     va_list ap;
        !           766: 
        !           767:     va_start (ap);
        !           768:     
        !           769:     code = va_arg (ap, int);
        !           770: 
        !           771:     _ll_log (pgm_log, code, ap);
        !           772: 
        !           773:     va_end (ap);
        !           774: }
        !           775: #else
        !           776: /* VARARGS */
        !           777: 
        !           778: void   advise (code, what, fmt)
        !           779: char   *what,
        !           780:        *fmt;
        !           781: int    code;
        !           782: {
        !           783:     advise (code, what, fmt);
        !           784: }
        !           785: #endif

unix.superglobalmegacorp.com

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