Annotation of researchv8dc/dk/libc/tdkdial.c, revision 1.1

1.1     ! root        1: #define DKMSGS 1
        !             2: #include <dk.h>
        !             3: #include <dkerr.h>
        !             4: #include <sgtty.h>
        !             5: #include <stdio.h>
        !             6: #include <signal.h>
        !             7: #include <errno.h>
        !             8: #include "dkdial.h"
        !             9: 
        !            10: #define SUBR "/etc/dkdialsub"
        !            11: 
        !            12: int    dkverbose;
        !            13: int    dkrchan;
        !            14: char   *dkerror;
        !            15: 
        !            16: static char *msgs[] = {
        !            17:        NULL,                                   /* NORM */
        !            18:        "bad call to dk dialler",               /* ILLEG */
        !            19:        "can't tell who you are",               /* NOUID */
        !            20:        "remote system doesn't respond",        /* NOREP */
        !            21:        "can't find dial program",              /* NODIAL */
        !            22:        "can't find outgoing channel",          /* NOOCHAN */
        !            23:        "can't open manager channel",           /* NOMGR */
        !            24:        "can't get dial tone",                  /* NODIALT */
        !            25:        "DK controller system error",
        !            26:        "destination busy",
        !            27:        "remote node not answering",
        !            28:        "destination not answering",
        !            29:        "unassigned destination",
        !            30:        "DK system overload",
        !            31:        "server already exists",
        !            32: };
        !            33: 
        !            34: static char    *argbuf;
        !            35: static char    **bufptr;
        !            36: extern int     rdk_ld;
        !            37: extern         int     errno ;
        !            38: 
        !            39: int
        !            40: tdkdial(dialstr, traffic)
        !            41: int traffic ;
        !            42: char * dialstr ;
        !            43: {
        !            44:        return (_tdkdial(1, traffic, dialstr)) ;
        !            45: }
        !            46: 
        !            47: int
        !            48: tdkserv(srvname, maxtraf)
        !            49: int maxtraf ;
        !            50: char * srvname ;
        !            51: {
        !            52:        return (_tdkdial(2, maxtraf, srvname)) ;
        !            53: }
        !            54: 
        !            55: 
        !            56: int
        !            57: _tdkdial (type, traffic, dialstr)
        !            58: int type ;
        !            59: int traffic ;
        !            60: char * dialstr ;
        !            61: {
        !            62:        register int fd, pid, rc;
        !            63:        char args[100];
        !            64:        char *argptrs[10];
        !            65:        int status;
        !            66:        struct dialout reply;
        !            67:        int pipefd[2];
        !            68:        register i;
        !            69:        char outname[64];
        !            70:        int popld ;
        !            71:        int oldchdie ;
        !            72:        int n3dig = 0, n2dig = 0;
        !            73:        extern errno;
        !            74:        static char alph[] = "0123456789abcdefghijklmnopqrstuvwxyz";
        !            75: 
        !            76:        /* establish the initial connection */
        !            77:        if (traffic)
        !            78:                traffic = 2;
        !            79:        for (i=3; i<256; i+=2) {
        !            80:                if (n3dig<3) {
        !            81:                        sprintf(outname, "/dev/dk/dk%d%c%d", traffic,
        !            82:                           alph[i/10], i%10);
        !            83:                        if ((fd = open(outname, 2)) >= 0)
        !            84:                                break;
        !            85:                        if (errno==ENOENT)
        !            86:                                n3dig++;
        !            87:                }
        !            88:                if (n2dig < 5) {
        !            89:                        sprintf(outname, "/dev/dk/dk%c%d", alph[i/10], i%10);
        !            90:                        if ((fd = open(outname, 2)) >= 0)
        !            91:                                break;
        !            92:                        if (errno==ENOENT)
        !            93:                                ++n2dig;
        !            94:                }
        !            95:        }
        !            96:        if (fd < 0) {
        !            97:                dkerror = msgs[NOOCHAN];
        !            98:                return fd;
        !            99:        }
        !           100:        ioctl(fd, FIOPUSHLD, &rdk_ld) ;
        !           101: 
        !           102:        /* create a pipe to the sub-process */
        !           103:        if (pipe (pipefd) < 0) {
        !           104:                dkerror =  "Can't pipe to dialler";
        !           105:                close (fd);
        !           106:                return -1;
        !           107:        }
        !           108: 
        !           109:        /* build the arg list for the sub-process */
        !           110:        arginit (args, argptrs);
        !           111:        strarg ("tdkdial");
        !           112:        intarg (fd);
        !           113:        intarg (pipefd[1]);
        !           114:        intarg (type);
        !           115:        intarg(traffic) ;
        !           116:        strarg(dialstr) ;
        !           117:        argend();
        !           118:        oldchdie = (int)signal(SIGCHLD, SIG_IGN) ;
        !           119: 
        !           120:        /* start up a sub-process */
        !           121:        switch (pid = fork()) {
        !           122: 
        !           123:                /* child */
        !           124:        case 0:
        !           125:                close (pipefd[0]);
        !           126:                setuid (geteuid());
        !           127:                execv (SUBR, argptrs);
        !           128:                exit (NODIAL);
        !           129: 
        !           130:                /* error */
        !           131:        case -1:
        !           132:                close (pipefd[0]);
        !           133:                close (pipefd[1]);
        !           134:                close(fd);
        !           135:                dkerror = "DK dialler can't fork";
        !           136:                signal(SIGCHLD, oldchdie) ;
        !           137:                return -1;
        !           138: 
        !           139:                /* parent */
        !           140:        default:
        !           141:                close (pipefd[1]);
        !           142: 
        !           143:                /* wait for the child to complete */
        !           144:                do 
        !           145:                        rc = wait (&status);
        !           146:                while (rc > 0 && rc != pid);
        !           147:                signal(SIGCHLD, oldchdie) ;
        !           148:                /* figure out what happened */
        !           149:                if (rc < 0 || status&0xff) {
        !           150:                        dkerror = "DK dialler exited abnormally";
        !           151:                        goto bad;
        !           152:                }
        !           153:                /* read the reply */
        !           154:                rc = read (pipefd[0], &reply, sizeof (reply));
        !           155:                if (rc != sizeof (reply)) {
        !           156:                        dkerror = "Bad reply from DK dialler";
        !           157:                        goto bad;
        !           158:                }
        !           159:                close (pipefd[0]);
        !           160:                if ((status & 0xFF00) == 0) {
        !           161:                        ioctl(fd, FIOPOPLD, 0) ;
        !           162:                        return fd;
        !           163:                }
        !           164:                status >>= 8;
        !           165:                if (status < sizeof(msgs)/sizeof(msgs[0]))
        !           166:                        dkerror = msgs[status];
        !           167:                else {
        !           168:                        static char msg[32];
        !           169:                        sprintf(msg, "DK dial error %d", status-8);
        !           170:                        dkerror = msg;
        !           171:                }
        !           172:                goto bad;
        !           173:        }
        !           174: bad:
        !           175:        close (pipefd[0]);
        !           176:        close (fd);
        !           177:        return -1;
        !           178: }
        !           179: 
        !           180: 
        !           181: tdkerrmess (s)
        !           182:        register char   *s;
        !           183: {
        !           184:        if (dkverbose)
        !           185:                write (2, s, strlen(s));
        !           186: }
        !           187: 
        !           188: 
        !           189: /*
        !           190:  *     The following subroutines help build argument lists
        !           191:  */
        !           192: 
        !           193: static
        !           194: arginit (x, y)
        !           195:        char    *x;
        !           196:        char    **y;
        !           197: {
        !           198:        argbuf = x;
        !           199:        bufptr = y;
        !           200: }
        !           201: 
        !           202: 
        !           203: static
        !           204: strarg (x)
        !           205:        register char   *x;
        !           206: {
        !           207:        *bufptr++ = x;
        !           208: }
        !           209: 
        !           210: 
        !           211: static
        !           212: intarg (x)
        !           213:        int     x;
        !           214: {
        !           215:        *bufptr++ = argbuf;
        !           216:        if (x < 0)
        !           217:                *argbuf++ = '-';
        !           218:        else
        !           219:                x = -x;
        !           220:        convint (x);
        !           221:        *argbuf++ = '\0';
        !           222: }
        !           223: 
        !           224: 
        !           225: static
        !           226: convint (x)
        !           227:        register int    x;
        !           228: {
        !           229:        if (x <= -10)
        !           230:                convint (x / 10);
        !           231:        *argbuf++ = '0' - x % 10;
        !           232: }
        !           233: 
        !           234: 
        !           235: static
        !           236: argend()
        !           237: {
        !           238:        *bufptr++ = 0;
        !           239: }
        !           240: 
        !           241: 

unix.superglobalmegacorp.com

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