V10/cmd/ether/netconfig.c

Compare this file to the similar file:
Show the results in this format:

/*
 *	       N E T  C O N F I G
 *
 * Ethernet network setup procedure.
 *
 * Usage: netconfig device unit { protocol }
 *
 *	  where	    device is the ethernet device type (ec, il, etc.)
 *		    unit is the physical unit number of the device
 *		    protocol is a protocol name (ip, chaos, arp, etc.),
 *			 optionally followed by protocol-specific arguments
 *
 *
 * (c) Copyright 1985  Nirvonics, Inc.
 *
 * Written by Kurt Gollhardt
 * Last update Thu Mar 14 11:40:10 1985
 *
 * This software is the property of Nirvonics, Inc.
 * All rights reserved.
 *
 */

#include <stdio.h>
#include <ctype.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/ethernet.h>

#define CONFIG_DIR  "/usr/ether"

extern int dump_ld;

#define MAX_ARGS 10

char *argv[MAX_ARGS];


main(ac,av)
     char **av;
{
     int       fd, unit, min_minor, max_minor, c, usage, dumping;
     char      *dev, devfile[40], prog[40], name[40];
     extern int	    optind;
     extern char    *optarg;

     while ((c = getopt(ac, av, "d")) != EOF)
	  switch (c) {
	       case 'd':
		    dumping++;
		    break;
	       case '?':
		    usage++;
		    break;
	  }

     if (ac - optind < 3)
	  usage++;

     if (usage) {
	  fprintf(stderr,
	       "Usage: netconfig [-options] ether_device unit {protocol}\n",
	       av[0]);
	  fprintf(stderr,
	       "Options: -d: insert a dump line-discipline\n");
	  exit(1);
     }

     dev = av[optind++];
     if (strncmp(dev, "/dev/", 5) == 0)
	  dev += 5;
     sprintf(devfile, "/dev/%s", dev);
     unit = atoi(av[optind++]);
     min_minor = unit * CHANS_PER_UNIT;
     max_minor = min_minor + CHANS_PER_UNIT - 1;

     signal(SIGHUP, SIG_IGN);

     while (optind < ac) {
	  if ((fd = findslot(devfile, min_minor, max_minor, 2)) < 0) {
	       fprintf(stderr,
			 "Can't open %s unit %d for address resolution\n",
			 devfile, unit);
	       exit(1);
	  }
	  dup2(fd, 0);
	  close(fd);

	  if (dumping && ioctl(0, FIOPUSHLD, &dump_ld) < 0)
		    fprintf(stderr, "Can't push dump line discipline\n");

	  makeargv(av[optind++]);
	  sprintf(prog, "%s/%sconfig", CONFIG_DIR, argv[0]);
	  sprintf(name, "%s %s%d", argv[0], dev, unit);
	  argv[0] = name;

	  switch (fork()) {
	       case -1:
		    fprintf(stderr, "netconfig: fork failed\n");
		    exit(1);
	       case 0:
		    break;
	       default:	 /* child */
		    execv(prog, argv);
		    fprintf(stderr, "%s: exec failed\n", prog);
		    _exit(1);
	  }
     }
}


makeargv(s)
     char *s;
{
     register int   argc;

     for (argc = 0; *s && argc < MAX_ARGS-1; ++argc) {
	  argv[argc] = s;
	  while (*s && !isspace(*s))
	       ++s;
	  if (*s)
	       *s++ = '\0';
	  while (*s && isspace(*s))
	       ++s;
     }

     argv[argc] = 0;
}