1*34915Sbostic /* 2*34915Sbostic * Copyright (c) 1988 Regents of the University of California. 3*34915Sbostic * All rights reserved. 4*34915Sbostic * 5*34915Sbostic * This code is derived from software contributed to Berkeley by 6*34915Sbostic * Rick Adams. 7*34915Sbostic * 8*34915Sbostic * Redistribution and use in source and binary forms are permitted 9*34915Sbostic * provided that the above copyright notice and this paragraph are 10*34915Sbostic * duplicated in all such forms and that any documentation, 11*34915Sbostic * advertising materials, and other materials related to such 12*34915Sbostic * distribution and use acknowledge that the software was developed 13*34915Sbostic * by the University of California, Berkeley. The name of the 14*34915Sbostic * University may not be used to endorse or promote products derived 15*34915Sbostic * from this software without specific prior written permission. 16*34915Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 17*34915Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 18*34915Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 19*34915Sbostic */ 20*34915Sbostic 2126211Skarels #ifndef lint 22*34915Sbostic char copyright[] = 23*34915Sbostic "@(#) Copyright (c) 1988 Regents of the University of California.\n\ 24*34915Sbostic All rights reserved.\n"; 25*34915Sbostic #endif /* not lint */ 26*34915Sbostic 27*34915Sbostic #ifndef lint 28*34915Sbostic static char sccsid[] = "@(#)slattach.c 4.3 (Berkeley) 06/30/88"; 29*34915Sbostic #endif /* not lint */ 30*34915Sbostic 3126206Skarels #include <stdio.h> 3226211Skarels #include <sys/param.h> 3326206Skarels #include <sgtty.h> 3426206Skarels #include <sys/socket.h> 3526206Skarels #include <netinet/in.h> 3626206Skarels #include <net/if.h> 3726206Skarels #include <netdb.h> 3826206Skarels #include <fcntl.h> 3926206Skarels 4026206Skarels #define DEFAULT_BAUD 9600 4126206Skarels int slipdisc = SLIPDISC; 4226206Skarels 4326206Skarels char devname[32]; 4426211Skarels char hostname[MAXHOSTNAMELEN]; 4526206Skarels 4626206Skarels main(argc, argv) 4726206Skarels int argc; 4826206Skarels char *argv[]; 4926206Skarels { 5026206Skarels register int fd; 5126206Skarels register char *dev = argv[1]; 5226206Skarels struct sgttyb sgtty; 5331988Sbostic int speed; 5426206Skarels 5526211Skarels if (argc < 2 || argc > 3) { 5626211Skarels fprintf(stderr, "usage: %s ttyname [baudrate]\n", argv[0]); 5726211Skarels exit(1); 5826211Skarels } 5926211Skarels speed = argc == 3 ? findspeed(atoi(argv[2])) : findspeed(DEFAULT_BAUD); 6026211Skarels if (speed == 0) { 6126211Skarels fprintf(stderr, "unknown speed %s", argv[2]); 6226211Skarels exit(1); 6326211Skarels } 6426206Skarels if (strncmp("/dev/", dev, 5)) { 6531988Sbostic (void)sprintf(devname, "/dev/%s", dev); 6626206Skarels dev = devname; 6726206Skarels } 6826211Skarels if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) { 6926211Skarels perror(dev); 7026211Skarels exit(1); 7126211Skarels } 7226206Skarels sgtty.sg_flags = RAW | ANYP; 7326206Skarels sgtty.sg_ispeed = sgtty.sg_ospeed = speed; 7426211Skarels if (ioctl(fd, TIOCSETP, &sgtty) < 0) { 7526211Skarels perror("ioctl(TIOCSETP)"); 7626211Skarels exit(1); 7726211Skarels } 7826211Skarels if (ioctl(fd, TIOCSETD, &slipdisc) < 0) { 7926211Skarels perror("ioctl(TIOCSETD)"); 8026211Skarels exit(1); 8126211Skarels } 8226206Skarels 8326211Skarels if (fork() > 0) 8426211Skarels exit(0); 8526206Skarels for (;;) 8631988Sbostic sigpause(0L); 8726206Skarels } 8826206Skarels 8926206Skarels struct sg_spds { 9026206Skarels int sp_val, sp_name; 9126206Skarels } spds[] = { 9226206Skarels #ifdef B50 9326206Skarels { 50, B50 }, 9426206Skarels #endif 9526206Skarels #ifdef B75 9626206Skarels { 75, B75 }, 9726206Skarels #endif 9826206Skarels #ifdef B110 9926206Skarels { 110, B110 }, 10026206Skarels #endif 10126206Skarels #ifdef B150 10226206Skarels { 150, B150 }, 10326206Skarels #endif 10426206Skarels #ifdef B200 10526206Skarels { 200, B200 }, 10626206Skarels #endif 10726206Skarels #ifdef B300 10826206Skarels { 300, B300 }, 10926206Skarels #endif 11026206Skarels #ifdef B600 11126206Skarels { 600, B600 }, 11226206Skarels #endif 11326206Skarels #ifdef B1200 11426206Skarels { 1200, B1200 }, 11526206Skarels #endif 11626206Skarels #ifdef B1800 11726206Skarels { 1800, B1800 }, 11826206Skarels #endif 11926206Skarels #ifdef B2000 12026206Skarels { 2000, B2000 }, 12126206Skarels #endif 12226206Skarels #ifdef B2400 12326206Skarels { 2400, B2400 }, 12426206Skarels #endif 12526206Skarels #ifdef B3600 12626206Skarels { 3600, B3600 }, 12726206Skarels #endif 12826206Skarels #ifdef B4800 12926206Skarels { 4800, B4800 }, 13026206Skarels #endif 13126206Skarels #ifdef B7200 13226206Skarels { 7200, B7200 }, 13326206Skarels #endif 13426206Skarels #ifdef B9600 13526206Skarels { 9600, B9600 }, 13626206Skarels #endif 13726206Skarels #ifdef EXTA 13826206Skarels { 19200, EXTA }, 13926206Skarels #endif 14026206Skarels #ifdef EXTB 14126206Skarels { 38400, EXTB }, 14226206Skarels #endif 14326206Skarels { 0, 0 } 14426206Skarels }; 14526206Skarels 14626206Skarels findspeed(speed) 14726206Skarels register int speed; 14826206Skarels { 14926206Skarels register struct sg_spds *sp; 15026206Skarels 15126206Skarels sp = spds; 15226206Skarels while (sp->sp_val && sp->sp_val != speed) 15326206Skarels sp++; 15426206Skarels return (sp->sp_name); 15526206Skarels } 156