1 /* 2 * Copyright (c) 1988 Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Adams. 7 * 8 * Redistribution and use in source and binary forms are permitted 9 * provided that the above copyright notice and this paragraph are 10 * duplicated in all such forms and that any documentation, 11 * advertising materials, and other materials related to such 12 * distribution and use acknowledge that the software was developed 13 * by the University of California, Berkeley. The name of the 14 * University may not be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 19 */ 20 21 #ifndef lint 22 char copyright[] = 23 "@(#) Copyright (c) 1988 Regents of the University of California.\n\ 24 All rights reserved.\n"; 25 #endif /* not lint */ 26 27 #ifndef lint 28 static char sccsid[] = "@(#)slattach.c 4.3 (Berkeley) 06/30/88"; 29 #endif /* not lint */ 30 31 #include <stdio.h> 32 #include <sys/param.h> 33 #include <sgtty.h> 34 #include <sys/socket.h> 35 #include <netinet/in.h> 36 #include <net/if.h> 37 #include <netdb.h> 38 #include <fcntl.h> 39 40 #define DEFAULT_BAUD 9600 41 int slipdisc = SLIPDISC; 42 43 char devname[32]; 44 char hostname[MAXHOSTNAMELEN]; 45 46 main(argc, argv) 47 int argc; 48 char *argv[]; 49 { 50 register int fd; 51 register char *dev = argv[1]; 52 struct sgttyb sgtty; 53 int speed; 54 55 if (argc < 2 || argc > 3) { 56 fprintf(stderr, "usage: %s ttyname [baudrate]\n", argv[0]); 57 exit(1); 58 } 59 speed = argc == 3 ? findspeed(atoi(argv[2])) : findspeed(DEFAULT_BAUD); 60 if (speed == 0) { 61 fprintf(stderr, "unknown speed %s", argv[2]); 62 exit(1); 63 } 64 if (strncmp("/dev/", dev, 5)) { 65 (void)sprintf(devname, "/dev/%s", dev); 66 dev = devname; 67 } 68 if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) { 69 perror(dev); 70 exit(1); 71 } 72 sgtty.sg_flags = RAW | ANYP; 73 sgtty.sg_ispeed = sgtty.sg_ospeed = speed; 74 if (ioctl(fd, TIOCSETP, &sgtty) < 0) { 75 perror("ioctl(TIOCSETP)"); 76 exit(1); 77 } 78 if (ioctl(fd, TIOCSETD, &slipdisc) < 0) { 79 perror("ioctl(TIOCSETD)"); 80 exit(1); 81 } 82 83 if (fork() > 0) 84 exit(0); 85 for (;;) 86 sigpause(0L); 87 } 88 89 struct sg_spds { 90 int sp_val, sp_name; 91 } spds[] = { 92 #ifdef B50 93 { 50, B50 }, 94 #endif 95 #ifdef B75 96 { 75, B75 }, 97 #endif 98 #ifdef B110 99 { 110, B110 }, 100 #endif 101 #ifdef B150 102 { 150, B150 }, 103 #endif 104 #ifdef B200 105 { 200, B200 }, 106 #endif 107 #ifdef B300 108 { 300, B300 }, 109 #endif 110 #ifdef B600 111 { 600, B600 }, 112 #endif 113 #ifdef B1200 114 { 1200, B1200 }, 115 #endif 116 #ifdef B1800 117 { 1800, B1800 }, 118 #endif 119 #ifdef B2000 120 { 2000, B2000 }, 121 #endif 122 #ifdef B2400 123 { 2400, B2400 }, 124 #endif 125 #ifdef B3600 126 { 3600, B3600 }, 127 #endif 128 #ifdef B4800 129 { 4800, B4800 }, 130 #endif 131 #ifdef B7200 132 { 7200, B7200 }, 133 #endif 134 #ifdef B9600 135 { 9600, B9600 }, 136 #endif 137 #ifdef EXTA 138 { 19200, EXTA }, 139 #endif 140 #ifdef EXTB 141 { 38400, EXTB }, 142 #endif 143 { 0, 0 } 144 }; 145 146 findspeed(speed) 147 register int speed; 148 { 149 register struct sg_spds *sp; 150 151 sp = spds; 152 while (sp->sp_val && sp->sp_val != speed) 153 sp++; 154 return (sp->sp_name); 155 } 156