int main(int argc, char **argv) {

#line 3047 "ifupdown.nw"
    int (*cmds)(interface_defn *) = NULL;
#line 3141 "ifupdown.nw"
    struct option long_opts[] = {
        {"help",        no_argument,       NULL, 'h'},
        {"version",     no_argument,       NULL, 'V'},
        {"verbose",     no_argument,       NULL, 'v'},
        {"all",         no_argument,       NULL, 'a'},
        {"allow",	required_argument, NULL,  3 },
        {"interfaces",  required_argument, NULL, 'i'},
        {"exclude",     required_argument, NULL, 'e'},
        {"no-act",      no_argument,       NULL, 'n'},
        {"no-mappings", no_argument,       NULL,  1 },
        {"force",       no_argument,       NULL,  2 },
        {0,0,0,0}
    };
#line 3171 "ifupdown.nw"
    int do_all = 0;
    int run_mappings = 1;
    int force = 0;
    char *allow_class = NULL;
    char *interfaces = "/etc/network/interfaces";
    char *statefile = "/etc/network/run/ifstate";
    char *excludeint = NULL ;
#line 3338 "ifupdown.nw"
    interfaces_file *defn;
#line 3497 "ifupdown.nw"
    int n_target_ifaces;
    char **target_iface;
#line 3554 "ifupdown.nw"
    char **state = NULL; /* list of iface=liface */
    int n_state = 0;
    int max_state = 0;
#line 3628 "ifupdown.nw"
    static FILE *state_fp = NULL;

#line 2992 "ifupdown.nw"

#line 3016 "ifupdown.nw"
    {
        int i;
        for (i = 0; i <= 2; i++) {
            if (fcntl(i, F_GETFD) == -1) {
                if (errno == EBADF && open("/dev/null", 0) == -1) {
                    fprintf(stderr,
                            "%s: fd %d not available; aborting\n",
                            argv[0], i);
                    exit(2);
                } else if (errno == EBADF) {
                    errno = 0; /* no more problems */
                } else {
                    /* some other problem -- eeek */
                    perror(argv[0]);
                    exit(2);
                }
            }
        }
    }

#line 2994 "ifupdown.nw"

#line 3053 "ifupdown.nw"
    {
        char *command;


#line 3064 "ifupdown.nw"
        if ((command = strrchr(argv[0],'/'))) {
            command++; /* first char after / */
        } else {
            command = argv[0]; /* no /'s in argv[0] */
        }
#line 3057 "ifupdown.nw"

#line 3072 "ifupdown.nw"
        if (strcmp(command, "ifup")==0) {
            cmds = iface_up;
        } else if (strcmp(command, "ifdown")==0) {
            cmds = iface_down;
        } else {
            fprintf(stderr,"This command should be called as ifup or ifdown\n");
            exit(1);
        }
#line 3058 "ifupdown.nw"
    }
#line 2995 "ifupdown.nw"

#line 3234 "ifupdown.nw"
    for(;;) {
        int c;
        c = getopt_long(argc, argv, "e:s:i:hVvna", long_opts, NULL);
        if (c == EOF) break;

        switch(c) {

#line 3252 "ifupdown.nw"
        case 'i':
            interfaces = strdup(optarg);
            break;
#line 3257 "ifupdown.nw"
        case 'v':
            verbose = 1;
            break;
#line 3262 "ifupdown.nw"
        case 'a':
            do_all = 1;
            break;
#line 3267 "ifupdown.nw"
        case 3:
            allow_class = strdup(optarg);
            break;
#line 3272 "ifupdown.nw"
        case 'n':
            no_act = 1;
            break;
#line 3277 "ifupdown.nw"
        case 1:
            run_mappings = 0;
            break;
#line 3282 "ifupdown.nw"
        case 2:
            force = 1;
            break;
#line 3287 "ifupdown.nw"
        case 'e':
            excludeint = strdup(optarg);
            break;
#line 3295 "ifupdown.nw"
        case 'h':
            help(argv[0]);
            break;
#line 3300 "ifupdown.nw"
        case 'V':
            version(argv[0]);
            break;
#line 3309 "ifupdown.nw"
        default:
            usage(argv[0]);
            break;
#line 3241 "ifupdown.nw"
        }
    }

#line 3321 "ifupdown.nw"
    if (argc - optind > 0 && do_all) {
        usage(argv[0]);
    }
#line 3327 "ifupdown.nw"
    if (argc - optind == 0 && !do_all) {
        usage(argv[0]);
    }

#line 2997 "ifupdown.nw"

#line 3342 "ifupdown.nw"
    defn = read_interfaces(interfaces);
    if ( !defn ) {
        fprintf(stderr, "%s: couldn't read interfaces file \"%s\"\n",
                argv[0], interfaces);
        exit(1);
    }

#line 2999 "ifupdown.nw"

#line 3632 "ifupdown.nw"
    {
        state_fp = fopen(statefile, no_act ? "r" : "a+");
        if (state_fp == NULL && !no_act) {
            fprintf(stderr,
                    "%s: failed to open statefile %s: %s\n",
                    argv[0], statefile, strerror(errno));
            exit (1);
        }

        if (state_fp != NULL) {
            char buf[80];
            char *p;

            if (!no_act) {
                int flags;

                if ((flags = fcntl(fileno(state_fp), F_GETFD)) < 0
                        || fcntl(fileno(state_fp), F_SETFD, flags | FD_CLOEXEC) < 0) {
                    fprintf(stderr,
                            "%s: failed to set FD_CLOEXEC on statefile %s: %s\n",
                            argv[0], statefile, strerror(errno));
                    exit(1);
                }

                if (lock_fd (fileno(state_fp)) < 0) {
                    fprintf(stderr,
                            "%s: failed to lock statefile %s: %s\n",
                            argv[0], statefile, strerror(errno));
                    exit(1);
                }

            }

            rewind (state_fp);
            while((p = fgets(buf, sizeof buf, state_fp)) != NULL) {
                char *pch;

                pch = buf + strlen(buf) - 1;
                while(pch > buf && isspace(*pch)) pch--;
                *(pch+1) = '\0';

                pch = buf;
                while(isspace(*pch)) pch++;

                add_to_state(&state, &n_state, &max_state, strdup(pch));
            }
        }
    }
#line 3508 "ifupdown.nw"
    if (do_all) {
        if (
#line 3087 "ifupdown.nw"
            (cmds == iface_up)
#line 3509 "ifupdown.nw"
        ) {
            allowup_defn *autos = find_allowup(defn, "auto");
            target_iface = autos ? autos->interfaces : NULL;
            n_target_ifaces = autos ? autos->n_interfaces : 0;
        } else if (
#line 3091 "ifupdown.nw"
            (cmds == iface_down)
#line 3513 "ifupdown.nw"
        ) {
            target_iface = state;
            n_target_ifaces = n_state;
        } else {
            assert(0);
        }
    } else {
        target_iface = argv + optind;
        n_target_ifaces = argc - optind;
    }
#line 3357 "ifupdown.nw"
    {
        int i;
        for (
#line 3502 "ifupdown.nw"
            i = 0; i < n_target_ifaces; i++
#line 3359 "ifupdown.nw"
        ) {
            char iface[80], liface[80];


#line 3526 "ifupdown.nw"
            strncpy(iface, target_iface[i], sizeof(iface));
            iface[sizeof(iface)-1] = '\0';

            {
                char *pch;
                if ((pch = strchr(iface, '='))) {
                    *pch = '\0';
                    strncpy(liface, pch+1, sizeof(liface));
                    liface[sizeof(liface)-1] = '\0';
                } else {
                    strncpy(liface, iface, sizeof(liface));
                    liface[sizeof(liface)-1] = '\0';
                }
            }
#line 3363 "ifupdown.nw"
            if (!force) {

#line 3715 "ifupdown.nw"
                {
                    int already_up = lookfor_iface(state, n_state, iface);;

                    if (
#line 3087 "ifupdown.nw"
                        (cmds == iface_up)
#line 3718 "ifupdown.nw"
                    ) {
                        if (already_up != -1) {
                            fprintf(stderr,
                                    "%s: interface %s already configured\n",
                                    argv[0], iface);
                            continue;
                        }
                    } else if (
#line 3091 "ifupdown.nw"
                        (cmds == iface_down)
#line 3725 "ifupdown.nw"
                    ) {
                        if (already_up == -1) {
                            fprintf(stderr, "%s: interface %s not configured\n",
                                    argv[0], iface);
                            continue;
                        }
                        strncpy(liface, strchr(state[already_up], '=') + 1, 80);
                        liface[79] = 0;
                    } else {
                        assert(0);
                    }
                }
#line 3365 "ifupdown.nw"
            }

            if (
#line 3100 "ifupdown.nw"
                (allow_class != NULL)

#line 3367 "ifupdown.nw"
            ) {

#line 3103 "ifupdown.nw"
                {
                    int i;
                    allowup_defn *allowup = find_allowup(defn, allow_class);
                    if (allowup == NULL)
                        continue;

                    for (i = 0; i < allowup->n_interfaces; i++) {
                        if (strcmp(allowup->interfaces[i], iface) == 0)
                            break;
                    }
                    if (i >= allowup->n_interfaces)
                        continue;
                }
#line 3369 "ifupdown.nw"
            }

            if (
#line 3125 "ifupdown.nw"
                (excludeint != NULL && strstr(iface,excludeint) != NULL)
#line 3371 "ifupdown.nw"
            )
                continue;

            if (
#line 3087 "ifupdown.nw"
                (cmds == iface_up)
#line 3374 "ifupdown.nw"
                && run_mappings) {

#line 3392 "ifupdown.nw"
                {
                    mapping_defn *currmap;
                    for (currmap = defn->mappings; currmap; currmap = currmap->next) {
                        int i;
                        for (i = 0; i < currmap->n_matches; i++) {

#line 3413 "ifupdown.nw"
                            if (fnmatch(currmap->match[i], liface, 0) != 0)
                                continue;
#line 3398 "ifupdown.nw"

#line 3421 "ifupdown.nw"
                            if (verbose) {
                                fprintf(stderr, "Running mapping script %s on %s\n",
                                        currmap->script, liface);
                            }
                            run_mapping(iface, liface, sizeof(liface), currmap);
#line 3399 "ifupdown.nw"
                            break;
                        }
                    }
                }
#line 3376 "ifupdown.nw"
            }


#line 3431 "ifupdown.nw"
            {
                interface_defn *currif;
                int okay = 0;
                int failed = 0;
                for (currif = defn->ifaces; currif; currif = currif->next) {
                    if (strcmp(liface, currif->logical_iface) == 0) {
                        okay = 1;


#line 3457 "ifupdown.nw"
                        {
                            currif->real_iface = iface;

                            if (verbose) {
                                fprintf(stderr, "Configuring interface %s=%s (%s)\n",
                                        iface, liface, currif->address_family->name);
                            }

                            switch(cmds(currif)) {
                            case -1:
                                printf("Don't seem to be have all the variables for %s/%s.\n",
                                       liface, currif->address_family->name);
                                failed = 1;
                                break;
                            case 0:
                                failed = 1;
                                break;
                            /* not entirely successful */
                            case 1:
                                failed = 0;
                                break;
                            /* successful */
                            default:
                                printf("Internal error while configuring interface %s/%s (assuming it failed)\n",
                                       liface, currif->address_family->name);
                                failed = 1;
                                /* what happened here? */
                            }
                            currif->real_iface = NULL;
                        }

#line 3441 "ifupdown.nw"
                        if (failed) break;
                        /* Otherwise keep going: this interface may have
                         * match with other address families */
                    }
                }

                if (!okay && !force) {
                    fprintf(stderr, "Ignoring unknown interface %s=%s.\n",
                            iface, liface);
                } else {

#line 3743 "ifupdown.nw"
                    {
                        int already_up = lookfor_iface(state, n_state, iface);

                        if (
#line 3087 "ifupdown.nw"
                            (cmds == iface_up)
#line 3746 "ifupdown.nw"
                        ) {
                            char *newiface =
                                malloc(strlen(iface) + 1 + strlen(liface) + 1);
                            sprintf(newiface, "%s=%s", iface, liface);

                            if (already_up == -1) {
                                if (failed == 1) {
                                    printf("Failed to bring up %s.\n", liface);
                                } else {
                                    add_to_state(&state, &n_state, &max_state, newiface);
                                }
                            } else {
                                free(state[already_up]);
                                state[already_up] = newiface;
                            }
                        } else if (
#line 3091 "ifupdown.nw"
                            (cmds == iface_down)
#line 3761 "ifupdown.nw"
                        ) {
                            if (already_up != -1) {
                                state[already_up] = state[--n_state];
                            }
                        } else {
                            assert(0);
                        }
                    }
#line 3452 "ifupdown.nw"
                }
            }
#line 3379 "ifupdown.nw"

#line 3691 "ifupdown.nw"
            if (state_fp != NULL && !no_act) {
                int i;

                if (ftruncate(fileno(state_fp), 0) < 0)
                {
                    fprintf(stderr,
                            "%s: failed to truncate statefile %s: %s\n",
                            argv[0], statefile, strerror(errno));
                    exit(1);
                }

                rewind(state_fp);
                for (i = 0; i < n_state; i++) {
                    fprintf(state_fp, "%s\n", state[i]);
                }
                fflush(state_fp);
            }
#line 3380 "ifupdown.nw"
        }
    }
#line 3683 "ifupdown.nw"
    if (state_fp != NULL) {
        fclose(state_fp);
        state_fp = NULL;
    }

#line 3001 "ifupdown.nw"
    return 0;
}
Example #2
0
int port_init (void)
{
	read_interfaces ();

	return 0;
}
Example #3
0
int
main (int argc, char *argv[])
{
  char *prog;
  char *interfaces = NULL;
  char *ptr, *tail;
  char *ucarp_name;
  char *virt_addr, virt_name[80];
  int c;
  int cnt, optno;
  int res = 0;
  interfaces_file *iface_file = NULL;
  interface_defn *iface, *ifaces, *ucarp_iface;

  struct option long_opts[] = {
    {"help", no_argument, NULL, 'h'},
    {"version", no_argument, NULL, 'V'},
    {"interfaces", required_argument, NULL, 'i'},
    {0, 0, 0, 0}
  };

  if ((prog = strrchr (argv[0], '/')))
    prog++;
  else
    prog = argv[0];

  for (;;) {
    if ((c = getopt_long (argc, argv, "i:hV", long_opts, NULL)) == EOF)
      break;

    switch (c) {
      case 'h':
        help (prog);
        break; /* never reached */
      case 'V':
        version (prog, VERSION);
        break; /* never reached */
      case 'i':
        interfaces = strdup (optarg);
        break;
      default:
        usage (prog);
        break; /* never reached */
    }
  }

  if ((optind + 2) > argc)
    usage (prog);

  if (! interfaces)
    interfaces = strdup (INTERFACES);

  /* parse interfaces file */
  if (! (iface_file = read_interfaces (interfaces))) {
    fprintf (stderr, "%s: cannot read interfaces file \"%s\"\n",
      prog, interfaces);
    exit (1);
  }

  ucarp_iface = NULL;
  ucarp_name = argv[optind];
  virt_addr = argv[optind + 1];

  /* find interface ucarp binds to */
  ifaces = iface_file->ifaces;
  for (iface = ifaces; ! ucarp_iface && iface; iface = iface->next) {
    if (strcmp (iface->logical_iface, ucarp_name) == 0)
      ucarp_iface = iface;
  }

  ptr = NULL;
  tail = NULL;

  for (optno = 0; ! ptr && optno < ucarp_iface->n_options; optno++) {
    if (strncmp (ucarp_iface->option[optno].name, "ucarp-vip", 9) == 0 &&
        strcmp (ucarp_iface->option[optno].value, virt_addr) == 0)
      ptr = ucarp_iface->option[optno].name;
  }

  if (! ptr)
    goto cleanup;

  memset (virt_name, '\0', 80);
  if ((tail = strrchr (ptr, ':'))) {
    for (ptr = ++tail; isdigit (*ptr); ptr++)
      /* do noting */ ;
    if (*ptr)
      tail = NULL;
  }

  if (tail)
    cnt = snprintf (virt_name, 79, "%s:ucarp:%s", ucarp_name, tail);
  else
    cnt = snprintf (virt_name, 79, "%s:ucarp", ucarp_name);

  if (cnt < 0 || cnt > 79) {
    fprintf (stderr, "%s: snprintf: %s\n", prog, strerror (errno));
    goto error;
  }

  printf ("%s\n", virt_name);

  res = 0;
cleanup:
  if (interfaces)
    free (interfaces);
  if (iface_file)
    free_interfaces (iface_file);
  return res;
error:
  res = 1;
  goto cleanup;
}