Annotation of cci/usr/src/etc/slconfig.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <sys/types.h>
        !             3: #include <sgtty.h>
        !             4: #include <sys/socket.h>
        !             5: #include <signal.h>
        !             6: #include <netinet/in.h>
        !             7: #include <net/if.h>
        !             8: #include <netdb.h>
        !             9: #include <fcntl.h>
        !            10: 
        !            11: struct ifreq ifr;
        !            12: struct sockaddr_in sin = { AF_INET };
        !            13: 
        !            14: int speed = B9600;     /* default speed */
        !            15: int slipdisc = SLIPDISC;
        !            16: 
        !            17: char devname[32];
        !            18: char hostname[32];
        !            19: char *pname;
        !            20: char *dev;
        !            21: 
        !            22: /*
        !            23:  * Changes:
        !            24:  *     fix format printing in perror()
        !            25:  */
        !            26:        
        !            27: main(argc, argv)
        !            28: int argc;
        !            29: char *argv[];
        !            30: {
        !            31:        pname = argv[0];
        !            32:        if ((argc < 2) || (argv[1][0] != '-')) {
        !            33:                usage();
        !            34:                exit(1);
        !            35:        }
        !            36:        argc--;
        !            37:        switch (argv[1][1]) {
        !            38:                case 'a' :
        !            39:                case 'A' :
        !            40:                        attach(argc,&argv[1]);
        !            41:                        break;
        !            42:                case 'd' :
        !            43:                case 'D' :
        !            44:                        detach(argc,&argv[1]);
        !            45:                        break;
        !            46:                default:
        !            47:                        usage();
        !            48:                        exit(1);
        !            49:        }
        !            50: }
        !            51: 
        !            52: attach(argc, argv)
        !            53: int argc;
        !            54: char *argv[];
        !            55: {
        !            56:        register FILE *fp;
        !            57:        register int fd;
        !            58:        struct sgttyb sgtty;
        !            59:        int n, catch_alarm();
        !            60: 
        !            61:        dev = argv[1];
        !            62:        if (argc != 4 && argc != 5) {
        !            63:                usage();
        !            64:                exit(1);
        !            65:        }
        !            66: 
        !            67:        if (argc == 5) {
        !            68:                speed = findspeed(argv[4]);
        !            69:                if (speed == 0) {
        !            70:                        fprintf(stderr, "%s: %s: Unknown speed\n",pname, argv[4]);
        !            71:                        usage();
        !            72:                        exit(1);
        !            73:                }
        !            74:        }
        !            75:        if (strncmp("/dev/", dev, 5)) {
        !            76:                sprintf(devname, "/dev/%s", dev);
        !            77:                dev = devname;
        !            78:        }
        !            79:        signal(SIGALRM, catch_alarm);
        !            80:        alarm(60);
        !            81:        if ((fd = open(dev, O_RDWR|O_NDELAY)) < 0 ) {
        !            82:                perror(dev);
        !            83:                exit(1);
        !            84:        }
        !            85:        alarm(0);
        !            86: 
        !            87:        if (ioctl(fd, TIOCGETP, &sgtty) < 0) {
        !            88:                perror(dev);
        !            89:                exit(1);
        !            90:        }
        !            91:        sgtty.sg_ispeed  = sgtty.sg_ospeed = speed;
        !            92:        if (ioctl(fd, TIOCSETP, &sgtty) < 0) {
        !            93:                perror(dev);
        !            94:                exit(1);
        !            95:        }
        !            96: 
        !            97:        if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
        !            98:                fprintf(stderr,"%s: ",pname);
        !            99:                perror("Can't set line discipline");
        !           100:                exit(1);
        !           101:        }
        !           102: 
        !           103:        if (ioctl(fd, TIOCGETD, &n) < 0) {
        !           104:                fprintf(stderr,"%s: ",pname);
        !           105:                perror("Can't get line discipline");
        !           106:                exit(1);
        !           107:        }
        !           108: 
        !           109:        close(fd);
        !           110: 
        !           111:        fd = socket(AF_INET, SOCK_DGRAM, 0);
        !           112:        if (fd < 0) {
        !           113:                fprintf(stderr,"%s: ",pname);
        !           114:                perror("Can't get socket");
        !           115:                exit(1);
        !           116:        }
        !           117:        sprintf(ifr.ifr_name, "sl%d", n);
        !           118: 
        !           119:        getaddr(argv[3], (struct sockaddr_in *)&ifr.ifr_dstaddr);
        !           120:        if (ioctl(fd, SIOCSIFDSTADDR, (caddr_t)&ifr) < 0) {
        !           121:                fprintf(stderr,"%s: ",pname);
        !           122:                perror("Can't do ioctl (SIOCSIFDSTADDR)");
        !           123:                exit(1);
        !           124:        }
        !           125:        getaddr(argv[2], (struct sockaddr_in *)&ifr.ifr_addr);
        !           126:        if (ioctl(fd, SIOCSIFADDR, (caddr_t)&ifr) < 0) {
        !           127:                fprintf(stderr,"%s: ",pname);
        !           128:                perror("Can't do ioctl (SIOCSIFADDR)");
        !           129:                exit(1);
        !           130:        }
        !           131: }
        !           132: 
        !           133: catch_alarm()
        !           134: {
        !           135:        fprintf(stderr,"open failed on \"%s\" -- timed out after 60 seconds.\n",dev);
        !           136:        exit(1);
        !           137: }
        !           138: 
        !           139: struct speedtab {
        !           140:        char    *sp_name;
        !           141:        int     sp_val;
        !           142: } spds[] = {
        !           143: #ifdef B50
        !           144:        {  "50",  B50},
        !           145: #endif
        !           146: #ifdef B75
        !           147:        {  "75",  B75},
        !           148: #endif
        !           149: #ifdef B110
        !           150:        { "110", B110},
        !           151: #endif
        !           152: #ifdef B150
        !           153:        { "150", B150},
        !           154: #endif
        !           155: #ifdef B200
        !           156:        { "200", B200},
        !           157: #endif
        !           158: #ifdef B300
        !           159:        { "300", B300},
        !           160: #endif
        !           161: #ifdef B600
        !           162:        { "600", B600},
        !           163: #endif
        !           164: #ifdef B1200
        !           165:        {"1200", B1200},
        !           166: #endif
        !           167: #ifdef B1800
        !           168:        {"1800", B1800},
        !           169: #endif
        !           170: #ifdef B2000
        !           171:        {"2000", B2000},
        !           172: #endif
        !           173: #ifdef B2400
        !           174:        {"2400", B2400},
        !           175: #endif
        !           176: #ifdef B3600
        !           177:        {"3600", B3600},
        !           178: #endif
        !           179: #ifdef B4800
        !           180:        {"4800", B4800},
        !           181: #endif
        !           182: #ifdef B7200
        !           183:        {"7200", B7200},
        !           184: #endif
        !           185: #ifdef B9600
        !           186:        {"9600", B9600},
        !           187: #endif
        !           188: #ifdef EXTA
        !           189:        {"19200",EXTA},
        !           190:        {"exta" ,EXTA},
        !           191: #endif
        !           192:        {0, 0}
        !           193: };
        !           194: 
        !           195: usage()
        !           196: {
        !           197: fprintf(stderr,
        !           198:        "usage: %s -a ttyname source-hostname destination-hostname [baudrate]\n",pname);
        !           199:        fprintf(stderr,"       Attach an serial interface.\n");
        !           200:        fprintf(stderr,"Or\n");
        !           201:        fprintf(stderr,"       %s -d interface-name\n",pname);
        !           202:        fprintf(stderr,"       Detach an serial interface.\n");
        !           203: }
        !           204: 
        !           205: 
        !           206: findspeed(wantbaud)
        !           207: char *wantbaud;
        !           208: {
        !           209:        register struct speedtab *sp;
        !           210: 
        !           211:        for (sp = spds; sp->sp_name != 0; sp++) {
        !           212:                if (strcmp(sp->sp_name, wantbaud) == 0)
        !           213:                        return(sp->sp_val);
        !           214:        }
        !           215:        return(0);
        !           216: }
        !           217: 
        !           218: struct in_addr inet_makeaddr();
        !           219: 
        !           220: getaddr(s, sin)
        !           221:        char *s;
        !           222:        struct sockaddr_in *sin;
        !           223: {
        !           224:        struct hostent *hp;
        !           225:        struct netent *np;
        !           226:        int val;
        !           227: 
        !           228:        hp = gethostbyname(s);
        !           229:        if (hp) {
        !           230:                sin->sin_family = hp->h_addrtype;
        !           231:                bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
        !           232:                return;
        !           233:        }
        !           234:        np = getnetbyname(s);
        !           235:        if (np) {
        !           236:                sin->sin_family = np->n_addrtype;
        !           237:                sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
        !           238:                return;
        !           239:        }
        !           240:        sin->sin_family = AF_INET;
        !           241:        val = inet_addr(s);
        !           242:        if (val != -1) {
        !           243:                sin->sin_addr.s_addr = val;
        !           244:                return;
        !           245:        }
        !           246:        val = inet_network(s);
        !           247:        if (val != -1) {
        !           248:                sin->sin_addr = inet_makeaddr(val, INADDR_ANY);
        !           249:                return;
        !           250:        }
        !           251:        fprintf(stderr, "%s: %s: bad value\n",pname, s);
        !           252:        exit(1);
        !           253: }
        !           254: 
        !           255: /* ************** */
        !           256: 
        !           257: detach(argc, argv)
        !           258: int argc;
        !           259: char *argv[];
        !           260: {
        !           261:        register int fd;
        !           262: 
        !           263:        if (argc != 2) {
        !           264:                fprintf(stderr, "usage: sldetach interface-name\n");
        !           265:                exit(1);
        !           266:        }
        !           267: 
        !           268:        fd = socket(AF_INET, SOCK_DGRAM, 0);
        !           269:        if (fd < 0) {
        !           270:                perror("sldetach: socket");
        !           271:                exit(1);
        !           272:        }
        !           273: 
        !           274:        strcpy(ifr.ifr_name, argv[1]);
        !           275:        if (ioctl(fd, SIOCIFDETACH, (caddr_t)&ifr) < 0) {
        !           276:                perror("sldetach: Can't do ioctl (SIOCIFDETACH)");
        !           277:                exit(1);
        !           278:        }
        !           279: }

unix.superglobalmegacorp.com

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