コード例 #1
0
ファイル: nameif.c プロジェクト: 915546302/busybox-osx
int nameif_main(int argc UNUSED_PARAM, char **argv)
{
	ethtable_t *clist = NULL;
	const char *fname = "/etc/mactab";
	int ctl_sk;
	ethtable_t *ch;
	parser_t *parser;
	char *token[2];

	if (1 & getopt32(argv, "sc:", &fname)) {
		openlog(applet_name, 0, LOG_LOCAL0);
		/* Why not just "="? I assume logging to stderr
		 * can't hurt. 2>/dev/null if you don't like it: */
		logmode |= LOGMODE_SYSLOG;
	}
	argv += optind;

	if (argv[0]) {
		do {
			if (!argv[1])
				bb_show_usage();
			prepend_new_eth_table(&clist, argv[0], argv[1]);
			argv += 2;
		} while (*argv);
	} else {
		parser = config_open(fname);
		while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL))
			prepend_new_eth_table(&clist, token[0], token[1]);
		config_close(parser);
	}

	ctl_sk = xsocket(PF_INET, SOCK_DGRAM, 0);
	parser = config_open2("/proc/net/dev", xfopen_for_read);

	while (clist && config_read(parser, token, 2, 2, "\0: \t", PARSE_NORMAL)) {
		struct ifreq ifr;
#if  ENABLE_FEATURE_NAMEIF_EXTENDED
		struct ethtool_drvinfo drvinfo;
		struct ethtool_cmd eth_settings;
#endif
		if (parser->lineno <= 2)
			continue; /* Skip the first two lines */

		/* Find the current interface name and copy it to ifr.ifr_name */
		memset(&ifr, 0, sizeof(struct ifreq));
		strncpy_IFNAMSIZ(ifr.ifr_name, token[0]);

#if ENABLE_FEATURE_NAMEIF_EXTENDED
		/* Check for phy address */
		memset(&eth_settings, 0, sizeof(eth_settings));
		eth_settings.cmd = ETHTOOL_GSET;
		ifr.ifr_data = (caddr_t) &eth_settings;
		ioctl(ctl_sk, SIOCETHTOOL, &ifr);

		/* Check for driver etc. */
		memset(&drvinfo, 0, sizeof(drvinfo));
		drvinfo.cmd = ETHTOOL_GDRVINFO;
		ifr.ifr_data = (caddr_t) &drvinfo;
		/* Get driver and businfo first, so we have it in drvinfo */
		ioctl(ctl_sk, SIOCETHTOOL, &ifr);
#endif
		ioctl(ctl_sk, SIOCGIFHWADDR, &ifr);

		/* Search the list for a matching device */
		for (ch = clist; ch; ch = ch->next) {
#if ENABLE_FEATURE_NAMEIF_EXTENDED
			if (ch->bus_info && strcmp(ch->bus_info, drvinfo.bus_info) != 0)
				continue;
			if (ch->driver && strcmp(ch->driver, drvinfo.driver) != 0)
				continue;
			if (ch->phy_address != -1 && ch->phy_address != eth_settings.phy_address)
				continue;
#endif
			if (ch->mac && memcmp(ch->mac, ifr.ifr_hwaddr.sa_data, ETH_ALEN) != 0)
				continue;
			/* if we came here, all selectors have matched */
			break;
		}
		/* Nothing found for current interface */
		if (!ch)
			continue;

		if (strcmp(ifr.ifr_name, ch->ifname) != 0) {
			strcpy(ifr.ifr_newname, ch->ifname);
			ioctl_or_perror_and_die(ctl_sk, SIOCSIFNAME, &ifr,
					"can't change ifname %s to %s",
					ifr.ifr_name, ch->ifname);
		}
		/* Remove list entry of renamed interface */
		if (ch->prev != NULL)
			ch->prev->next = ch->next;
		else
			clist = ch->next;
		if (ch->next != NULL)
			ch->next->prev = ch->prev;
		if (ENABLE_FEATURE_CLEAN_UP)
			delete_eth_table(ch);
	}
	if (ENABLE_FEATURE_CLEAN_UP) {
		for (ch = clist; ch; ch = ch->next)
			delete_eth_table(ch);
		config_close(parser);
	};

	return 0;
}
コード例 #2
0
ファイル: nameif.c プロジェクト: OPSF/uClinux
int nameif_main(int argc, char **argv)
{
    ethtable_t *clist = NULL;
    FILE *ifh;
    const char *fname = "/etc/mactab";
    char *line;
    char *line_ptr;
    int linenum;
    int ctl_sk;
    ethtable_t *ch;

    if (1 & getopt32(argv, "sc:", &fname)) {
        openlog(applet_name, 0, LOG_LOCAL0);
        logmode = LOGMODE_SYSLOG;
    }
    argc -= optind;
    argv += optind;

    if (argc & 1)
        bb_show_usage();

    if (argc) {
        while (*argv) {
            char *ifname = xstrdup(*argv++);
            prepend_new_eth_table(&clist, ifname, *argv++);
        }
    } else {
        ifh = xfopen(fname, "r");
        while ((line = xmalloc_fgets(ifh)) != NULL) {
            char *next;

            line_ptr = skip_whitespace(line);
            if ((line_ptr[0] == '#') || (line_ptr[0] == '\n'))
                goto read_next_line;
            next = skip_non_whitespace(line_ptr);
            if (*next)
                *next++ = '\0';
            prepend_new_eth_table(&clist, line_ptr, next);
read_next_line:
            free(line);
        }
        fclose(ifh);
    }

    ctl_sk = xsocket(PF_INET, SOCK_DGRAM, 0);
    ifh = xfopen("/proc/net/dev", "r");

    linenum = 0;
    while (clist) {
        struct ifreq ifr;
#if  ENABLE_FEATURE_NAMEIF_EXTENDED
        struct ethtool_drvinfo drvinfo;
#endif

        line = xmalloc_fgets(ifh);
        if (line == NULL)
            break; /* Seems like we're done */
        if (linenum++ < 2 )
            goto next_line; /* Skip the first two lines */

        /* Find the current interface name and copy it to ifr.ifr_name */
        line_ptr = skip_whitespace(line);
        *strpbrk(line_ptr, " \t\n:") = '\0';

        memset(&ifr, 0, sizeof(struct ifreq));
        strncpy(ifr.ifr_name, line_ptr, sizeof(ifr.ifr_name));

#if ENABLE_FEATURE_NAMEIF_EXTENDED
        /* Check for driver etc. */
        memset(&drvinfo, 0, sizeof(struct ethtool_drvinfo));
        drvinfo.cmd = ETHTOOL_GDRVINFO;
        ifr.ifr_data = (caddr_t) &drvinfo;
        /* Get driver and businfo first, so we have it in drvinfo */
        ioctl(ctl_sk, SIOCETHTOOL, &ifr);
#endif
        ioctl(ctl_sk, SIOCGIFHWADDR, &ifr);

        /* Search the list for a matching device */
        for (ch = clist; ch; ch = ch->next) {
#if ENABLE_FEATURE_NAMEIF_EXTENDED
            if (ch->bus_info && strcmp(ch->bus_info, drvinfo.bus_info) != 0)
                continue;
            if (ch->driver && strcmp(ch->driver, drvinfo.driver) != 0)
                continue;
#endif
            if (ch->mac && memcmp(ch->mac, ifr.ifr_hwaddr.sa_data, ETH_ALEN) != 0)
                continue;
            /* if we came here, all selectors have matched */
            goto found;
        }
        /* Nothing found for current interface */
        goto next_line;
found:
        if (strcmp(ifr.ifr_name, ch->ifname) != 0) {
            strcpy(ifr.ifr_newname, ch->ifname);
            ioctl_or_perror_and_die(ctl_sk, SIOCSIFNAME, &ifr,
                                    "cannot change ifname %s to %s",
                                    ifr.ifr_name, ch->ifname);
        }
        /* Remove list entry of renamed interface */
        if (ch->prev != NULL)
            ch->prev->next = ch->next;
        else
            clist = ch->next;
        if (ch->next != NULL)
            ch->next->prev = ch->prev;
        if (ENABLE_FEATURE_CLEAN_UP)
            delete_eth_table(ch);
next_line:
        free(line);
    }
    if (ENABLE_FEATURE_CLEAN_UP) {
        for (ch = clist; ch; ch = ch->next)
            delete_eth_table(ch);
        fclose(ifh);
    };

    return 0;
}