|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.