Annotation of cci/usr/src/etc/slconfig.c, revision 1.1.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.