File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / usr / src / etc / slconfig.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:24:26 2019 UTC (7 years ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
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);
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.