134915Sbostic /* 234915Sbostic * Copyright (c) 1988 Regents of the University of California. 334915Sbostic * All rights reserved. 434915Sbostic * 534915Sbostic * This code is derived from software contributed to Berkeley by 634915Sbostic * Rick Adams. 734915Sbostic * 834915Sbostic * Redistribution and use in source and binary forms are permitted 934915Sbostic * provided that the above copyright notice and this paragraph are 1034915Sbostic * duplicated in all such forms and that any documentation, 1134915Sbostic * advertising materials, and other materials related to such 1234915Sbostic * distribution and use acknowledge that the software was developed 1334915Sbostic * by the University of California, Berkeley. The name of the 1434915Sbostic * University may not be used to endorse or promote products derived 1534915Sbostic * from this software without specific prior written permission. 1634915Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1734915Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1834915Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1934915Sbostic */ 2034915Sbostic 2126211Skarels #ifndef lint 2234915Sbostic char copyright[] = 2334915Sbostic "@(#) Copyright (c) 1988 Regents of the University of California.\n\ 2434915Sbostic All rights reserved.\n"; 2534915Sbostic #endif /* not lint */ 2634915Sbostic 2734915Sbostic #ifndef lint 28*37690Sbostic static char sccsid[] = "@(#)slattach.c 4.5 (Berkeley) 05/08/89"; 2934915Sbostic #endif /* not lint */ 3034915Sbostic 3126211Skarels #include <sys/param.h> 3226206Skarels #include <sgtty.h> 3326206Skarels #include <sys/socket.h> 3426206Skarels #include <netinet/in.h> 3526206Skarels #include <net/if.h> 3626206Skarels #include <netdb.h> 3726206Skarels #include <fcntl.h> 3837467Sbostic #include <stdio.h> 39*37690Sbostic #include <paths.h> 4026206Skarels 4126206Skarels #define DEFAULT_BAUD 9600 4226206Skarels int slipdisc = SLIPDISC; 4326206Skarels 4426206Skarels char devname[32]; 4526211Skarels char hostname[MAXHOSTNAMELEN]; 4626206Skarels 4726206Skarels main(argc, argv) 4826206Skarels int argc; 4926206Skarels char *argv[]; 5026206Skarels { 5126206Skarels register int fd; 5226206Skarels register char *dev = argv[1]; 5326206Skarels struct sgttyb sgtty; 5431988Sbostic int speed; 5526206Skarels 5626211Skarels if (argc < 2 || argc > 3) { 5726211Skarels fprintf(stderr, "usage: %s ttyname [baudrate]\n", argv[0]); 5826211Skarels exit(1); 5926211Skarels } 6026211Skarels speed = argc == 3 ? findspeed(atoi(argv[2])) : findspeed(DEFAULT_BAUD); 6126211Skarels if (speed == 0) { 6226211Skarels fprintf(stderr, "unknown speed %s", argv[2]); 6326211Skarels exit(1); 6426211Skarels } 6537467Sbostic if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) { 6637467Sbostic (void)sprintf(devname, "%s/%s", _PATH_DEV, dev); 6726206Skarels dev = devname; 6826206Skarels } 6926211Skarels if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) { 7026211Skarels perror(dev); 7126211Skarels exit(1); 7226211Skarels } 7326206Skarels sgtty.sg_flags = RAW | ANYP; 7426206Skarels sgtty.sg_ispeed = sgtty.sg_ospeed = speed; 7526211Skarels if (ioctl(fd, TIOCSETP, &sgtty) < 0) { 7626211Skarels perror("ioctl(TIOCSETP)"); 7726211Skarels exit(1); 7826211Skarels } 7926211Skarels if (ioctl(fd, TIOCSETD, &slipdisc) < 0) { 8026211Skarels perror("ioctl(TIOCSETD)"); 8126211Skarels exit(1); 8226211Skarels } 8326206Skarels 8426211Skarels if (fork() > 0) 8526211Skarels exit(0); 8626206Skarels for (;;) 8731988Sbostic sigpause(0L); 8826206Skarels } 8926206Skarels 9026206Skarels struct sg_spds { 9126206Skarels int sp_val, sp_name; 9226206Skarels } spds[] = { 9326206Skarels #ifdef B50 9426206Skarels { 50, B50 }, 9526206Skarels #endif 9626206Skarels #ifdef B75 9726206Skarels { 75, B75 }, 9826206Skarels #endif 9926206Skarels #ifdef B110 10026206Skarels { 110, B110 }, 10126206Skarels #endif 10226206Skarels #ifdef B150 10326206Skarels { 150, B150 }, 10426206Skarels #endif 10526206Skarels #ifdef B200 10626206Skarels { 200, B200 }, 10726206Skarels #endif 10826206Skarels #ifdef B300 10926206Skarels { 300, B300 }, 11026206Skarels #endif 11126206Skarels #ifdef B600 11226206Skarels { 600, B600 }, 11326206Skarels #endif 11426206Skarels #ifdef B1200 11526206Skarels { 1200, B1200 }, 11626206Skarels #endif 11726206Skarels #ifdef B1800 11826206Skarels { 1800, B1800 }, 11926206Skarels #endif 12026206Skarels #ifdef B2000 12126206Skarels { 2000, B2000 }, 12226206Skarels #endif 12326206Skarels #ifdef B2400 12426206Skarels { 2400, B2400 }, 12526206Skarels #endif 12626206Skarels #ifdef B3600 12726206Skarels { 3600, B3600 }, 12826206Skarels #endif 12926206Skarels #ifdef B4800 13026206Skarels { 4800, B4800 }, 13126206Skarels #endif 13226206Skarels #ifdef B7200 13326206Skarels { 7200, B7200 }, 13426206Skarels #endif 13526206Skarels #ifdef B9600 13626206Skarels { 9600, B9600 }, 13726206Skarels #endif 13826206Skarels #ifdef EXTA 13926206Skarels { 19200, EXTA }, 14026206Skarels #endif 14126206Skarels #ifdef EXTB 14226206Skarels { 38400, EXTB }, 14326206Skarels #endif 14426206Skarels { 0, 0 } 14526206Skarels }; 14626206Skarels 14726206Skarels findspeed(speed) 14826206Skarels register int speed; 14926206Skarels { 15026206Skarels register struct sg_spds *sp; 15126206Skarels 15226206Skarels sp = spds; 15326206Skarels while (sp->sp_val && sp->sp_val != speed) 15426206Skarels sp++; 15526206Skarels return (sp->sp_name); 15626206Skarels } 157