|
|
Power 6/32 Unix version 1.21
#include <stdio.h>
#include <sys/types.h>
#include <sgtty.h>
#include <sys/socket.h>
#include <signal.h>
#include <netinet/in.h>
#include <net/if.h>
#include <netdb.h>
#include <fcntl.h>
struct ifreq ifr;
struct sockaddr_in sin = { AF_INET };
int speed = B9600; /* default speed */
int slipdisc = SLIPDISC;
char devname[32];
char hostname[32];
char *pname;
char *dev;
/*
* Changes:
* fix format printing in perror()
*/
main(argc, argv)
int argc;
char *argv[];
{
pname = argv[0];
if ((argc < 2) || (argv[1][0] != '-')) {
usage();
exit(1);
}
argc--;
switch (argv[1][1]) {
case 'a' :
case 'A' :
attach(argc,&argv[1]);
break;
case 'd' :
case 'D' :
detach(argc,&argv[1]);
break;
default:
usage();
exit(1);
}
}
attach(argc, argv)
int argc;
char *argv[];
{
register FILE *fp;
register int fd;
struct sgttyb sgtty;
int n, catch_alarm();
dev = argv[1];
if (argc != 4 && argc != 5) {
usage();
exit(1);
}
if (argc == 5) {
speed = findspeed(argv[4]);
if (speed == 0) {
fprintf(stderr, "%s: %s: Unknown speed\n",pname, argv[4]);
usage();
exit(1);
}
}
if (strncmp("/dev/", dev, 5)) {
sprintf(devname, "/dev/%s", dev);
dev = devname;
}
signal(SIGALRM, catch_alarm);
alarm(60);
if ((fd = open(dev, O_RDWR|O_NDELAY)) < 0 ) {
perror(dev);
exit(1);
}
alarm(0);
if (ioctl(fd, TIOCGETP, &sgtty) < 0) {
perror(dev);
exit(1);
}
sgtty.sg_ispeed = sgtty.sg_ospeed = speed;
if (ioctl(fd, TIOCSETP, &sgtty) < 0) {
perror(dev);
exit(1);
}
if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
fprintf(stderr,"%s: ",pname);
perror("Can't set line discipline");
exit(1);
}
if (ioctl(fd, TIOCGETD, &n) < 0) {
fprintf(stderr,"%s: ",pname);
perror("Can't get line discipline");
exit(1);
}
close(fd);
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
fprintf(stderr,"%s: ",pname);
perror("Can't get socket");
exit(1);
}
sprintf(ifr.ifr_name, "sl%d", n);
getaddr(argv[3], (struct sockaddr_in *)&ifr.ifr_dstaddr);
if (ioctl(fd, SIOCSIFDSTADDR, (caddr_t)&ifr) < 0) {
fprintf(stderr,"%s: ",pname);
perror("Can't do ioctl (SIOCSIFDSTADDR)");
exit(1);
}
getaddr(argv[2], (struct sockaddr_in *)&ifr.ifr_addr);
if (ioctl(fd, SIOCSIFADDR, (caddr_t)&ifr) < 0) {
fprintf(stderr,"%s: ",pname);
perror("Can't do ioctl (SIOCSIFADDR)");
exit(1);
}
}
catch_alarm()
{
fprintf(stderr,"open failed on \"%s\" -- timed out after 60 seconds.\n",dev);
exit(1);
}
struct speedtab {
char *sp_name;
int sp_val;
} spds[] = {
#ifdef B50
{ "50", B50},
#endif
#ifdef B75
{ "75", B75},
#endif
#ifdef B110
{ "110", B110},
#endif
#ifdef B150
{ "150", B150},
#endif
#ifdef B200
{ "200", B200},
#endif
#ifdef B300
{ "300", B300},
#endif
#ifdef B600
{ "600", B600},
#endif
#ifdef B1200
{"1200", B1200},
#endif
#ifdef B1800
{"1800", B1800},
#endif
#ifdef B2000
{"2000", B2000},
#endif
#ifdef B2400
{"2400", B2400},
#endif
#ifdef B3600
{"3600", B3600},
#endif
#ifdef B4800
{"4800", B4800},
#endif
#ifdef B7200
{"7200", B7200},
#endif
#ifdef B9600
{"9600", B9600},
#endif
#ifdef EXTA
{"19200",EXTA},
{"exta" ,EXTA},
#endif
{0, 0}
};
usage()
{
fprintf(stderr,
"usage: %s -a ttyname source-hostname destination-hostname [baudrate]\n",pname);
fprintf(stderr," Attach an serial interface.\n");
fprintf(stderr,"Or\n");
fprintf(stderr," %s -d interface-name\n",pname);
fprintf(stderr," Detach an serial interface.\n");
}
findspeed(wantbaud)
char *wantbaud;
{
register struct speedtab *sp;
for (sp = spds; sp->sp_name != 0; sp++) {
if (strcmp(sp->sp_name, wantbaud) == 0)
return(sp->sp_val);
}
return(0);
}
struct in_addr inet_makeaddr();
getaddr(s, sin)
char *s;
struct sockaddr_in *sin;
{
struct hostent *hp;
struct netent *np;
int val;
hp = gethostbyname(s);
if (hp) {
sin->sin_family = hp->h_addrtype;
bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
return;
}
np = getnetbyname(s);
if (np) {
sin->sin_family = np->n_addrtype;
sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
return;
}
sin->sin_family = AF_INET;
val = inet_addr(s);
if (val != -1) {
sin->sin_addr.s_addr = val;
return;
}
val = inet_network(s);
if (val != -1) {
sin->sin_addr = inet_makeaddr(val, INADDR_ANY);
return;
}
fprintf(stderr, "%s: %s: bad value\n",pname, s);
exit(1);
}
/* ************** */
detach(argc, argv)
int argc;
char *argv[];
{
register int fd;
if (argc != 2) {
fprintf(stderr, "usage: sldetach interface-name\n");
exit(1);
}
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
perror("sldetach: socket");
exit(1);
}
strcpy(ifr.ifr_name, argv[1]);
if (ioctl(fd, SIOCIFDETACH, (caddr_t)&ifr) < 0) {
perror("sldetach: Can't do ioctl (SIOCIFDETACH)");
exit(1);
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.