int modinfo_main(int argc UNUSED_PARAM, char **argv) { struct modinfo_env env; char name[MODULE_NAME_LEN]; struct utsname uts; parser_t *parser; char *colon, *tokens[2]; unsigned opts; unsigned i; env.field = NULL; opt_complementary = "-1"; /* minimum one param */ opts = getopt32(argv, "fdalvpF:0", &env.field); env.tags = opts & OPT_TAGS ? opts & OPT_TAGS : OPT_TAGS; argv += optind; uname(&uts); parser = config_open2( xasprintf("%s/%s/%s", CONFIG_DEFAULT_MODULES_DIR, uts.release, CONFIG_DEFAULT_DEPMOD_FILE), fopen_for_read ); if (!parser) { parser = config_open2( xasprintf("%s/%s", CONFIG_DEFAULT_MODULES_DIR, CONFIG_DEFAULT_DEPMOD_FILE), xfopen_for_read ); } while (config_read(parser, tokens, 2, 1, "# \t", PARSE_NORMAL)) { colon = last_char_is(tokens[0], ':'); if (colon == NULL) continue; *colon = '\0'; filename2modname(tokens[0], name); for (i = 0; argv[i]; i++) { if (fnmatch(argv[i], name, 0) == 0) { modinfo(tokens[0], uts.release, &env); argv[i] = (char *) ""; } } } if (ENABLE_FEATURE_CLEAN_UP) config_close(parser); for (i = 0; argv[i]; i++) { if (argv[i][0]) { modinfo(argv[i], uts.release, &env); } } return 0; }
static int check_securetty(void) { char *buf = (char*)"/etc/securetty"; /* any non-NULL is ok */ parser_t *parser = config_open2("/etc/securetty", fopen_for_read); while (config_read(parser, &buf, 1, 1, "# \t", PARSE_NORMAL)) { if (strcmp(buf, short_tty) == 0) break; buf = NULL; } config_close(parser); /* buf != NULL here if config file was not found, empty * or line was found which equals short_tty */ return buf != NULL; }
static void rtnl_tab_initialize(const char *file, const char **tab, int size) { char *token[2]; parser_t *parser = config_open2(file, fopen_for_read); while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL)) { int id = bb_strtou(token[0], NULL, 0); if (id < 0 || id > size) { bb_error_msg("database %s is corrupted at line %d", file, parser->lineno); break; } tab[id] = xstrdup(token[1]); } config_close(parser); }
static void do_sethostname(char *s, int isfile) { // if (!s) // return; if (isfile) { parser_t *parser = config_open2(s, xfopen_for_read); while (config_read(parser, &s, 1, 1, "# \t", PARSE_NORMAL & ~PARSE_GREEDY)) { do_sethostname(s, 0); } if (ENABLE_FEATURE_CLEAN_UP) config_close(parser); } else if (sethostname(s, strlen(s))) { // if (errno == EPERM) // bb_error_msg_and_die("%s", bb_msg_perm_denied_are_you_root); bb_perror_msg_and_die("sethostname"); } }
static void parse_conf_file(const char *filename) { parser_t *parser; char *tokens[2]; parser = config_open2(filename, fopen_for_read); if (parser) { while (config_read(parser, tokens, 2, 2, "# \t", PARSE_NORMAL)) { act_tab = xrealloc_vector(act_tab, 1, n_act); act_tab[n_act].key = xstrdup(tokens[0]); act_tab[n_act].action = xstrdup(tokens[1]); n_act++; } config_close(parser); } else { act_tab = (void*)f_act_tab; n_act = ARRAY_SIZE(f_act_tab); } }
static void parse_map_file(const char *filename) { parser_t *parser; char *tokens[6]; parser = config_open2(filename, fopen_for_read); if (parser) { while (config_read(parser, tokens, 6, 6, "# \t", PARSE_NORMAL)) { evt_tab = xrealloc_vector(evt_tab, 1, n_evt); evt_tab[n_evt].s_type = xstrdup(tokens[0]); evt_tab[n_evt].n_type = xstrtou(tokens[1], 16); evt_tab[n_evt].s_code = xstrdup(tokens[2]); evt_tab[n_evt].n_code = xatou16(tokens[3]); evt_tab[n_evt].value = xatoi_positive(tokens[4]); evt_tab[n_evt].desc = xstrdup(tokens[5]); n_evt++; } config_close(parser); } else { evt_tab = (void*)f_evt_tab; n_evt = ARRAY_SIZE(f_evt_tab); } }
* PCI_SLOT_NAME PCI_CLASS: PCI_VID:PCI_DID [PCI_SUBSYS_VID:PCI_SUBSYS_DID] [DRIVER] */ static int FAST_FUNC fileAction( const char *fileName, struct stat *statbuf UNUSED_PARAM, void *userData UNUSED_PARAM, int depth UNUSED_PARAM) { parser_t *parser; char *tokens[3]; char *pci_slot_name = NULL, *driver = NULL; int pci_class = 0, pci_vid = 0, pci_did = 0; int pci_subsys_vid = 0, pci_subsys_did = 0; char *uevent_filename = concat_path_file(fileName, "/uevent"); parser = config_open2(uevent_filename, fopen_for_read); free(uevent_filename); while (config_read(parser, tokens, 3, 2, "\0:=", PARSE_NORMAL)) { if (strcmp(tokens[0], "DRIVER") == 0) { driver = xstrdup(tokens[1]); continue; } if (strcmp(tokens[0], "PCI_CLASS") == 0) { pci_class = xstrtou(tokens[1], 16)>>8; continue; } if (strcmp(tokens[0], "PCI_ID") == 0) { pci_vid = xstrtou(tokens[1], 16);
int rfkill_main(int argc UNUSED_PARAM, char **argv) { struct rfkill_event event; const char *rf_name; int rf_fd; int mode; int rf_type; int rf_idx; unsigned rf_opt = 0; argv++; /* Must have one or two params */ if (!argv[0] || (argv[1] && argv[2])) bb_show_usage(); mode = O_RDWR | O_NONBLOCK; rf_name = argv[1]; if (strcmp(argv[0], "list") == 0) { rf_opt |= OPT_l; mode = O_RDONLY | O_NONBLOCK; } else if (strcmp(argv[0], "block") == 0 && rf_name) { rf_opt |= OPT_b; } else if (strcmp(argv[0], "unblock") == 0 && rf_name) { rf_opt |= OPT_u; } else bb_show_usage(); rf_type = RFKILL_TYPE_ALL; rf_idx = -1; if (rf_name) { static const char rfkill_types[] ALIGN1 = "all\0wlan\0bluetooth\0uwb\0wimax\0wwan\0gps\0fm\0"; if (strcmp(rf_name, "wifi") == 0) rf_name = "wlan"; if (strcmp(rf_name, "ultrawideband") == 0) rf_name = "uwb"; rf_type = index_in_strings(rfkill_types, rf_name); if (rf_type < 0) { rf_idx = xatoi_positive(rf_name); } } rf_fd = device_open("/dev/rfkill", mode); if (rf_fd < 0) bb_perror_msg_and_die("/dev/rfkill"); if (rf_opt & OPT_l) { while (full_read(rf_fd, &event, sizeof(event)) == RFKILL_EVENT_SIZE_V1) { parser_t *parser; char *tokens[2]; char rf_sysfs[sizeof("/sys/class/rfkill/rfkill%u/uevent") + sizeof(int)*3]; char *name, *type; if (rf_type && rf_type != event.type && rf_idx < 0) { continue; } if (rf_idx >= 0 && event.idx != rf_idx) { continue; } name = NULL; type = NULL; sprintf(rf_sysfs, "/sys/class/rfkill/rfkill%u/uevent", event.idx); parser = config_open2(rf_sysfs, fopen_for_read); while (config_read(parser, tokens, 2, 2, "\n=", PARSE_NORMAL)) { if (strcmp(tokens[0], "RFKILL_NAME") == 0) { name = xstrdup(tokens[1]); continue; } if (strcmp(tokens[0], "RFKILL_TYPE") == 0) { type = xstrdup(tokens[1]); continue; } } config_close(parser); printf("%u: %s: %s\n", event.idx, name, type); printf("\tSoft blocked: %s\n", event.soft ? "yes" : "no"); printf("\tHard blocked: %s\n", event.hard ? "yes" : "no"); free(name); free(type); } } else { memset(&event, 0, sizeof(event)); if (rf_type >= 0) { event.type = rf_type; event.op = RFKILL_OP_CHANGE_ALL; } if (rf_idx >= 0) { event.idx = rf_idx; event.op = RFKILL_OP_CHANGE; } /* Note: OPT_b == 1 */ event.soft = (rf_opt & OPT_b); xwrite(rf_fd, &event, sizeof(event)); } return EXIT_SUCCESS; }
int man_main(int argc UNUSED_PARAM, char **argv) { parser_t *parser; const char *pager = ENABLE_LESS ? "less" : "more"; char *sec_list; char *cur_path, *cur_sect; char **man_path_list; int count_mp; int cur_mp; int opt, not_found; char *token[2]; opt_complementary = "-1"; /* at least one argument */ opt = getopt32(argv, "+aw"); argv += optind; sec_list = xstrdup("0p:1:1p:2:3:3p:4:5:6:7:8:9"); count_mp = 0; man_path_list = add_MANPATH(NULL, &count_mp, getenv("MANDATORY_MANPATH"+10) /* "MANPATH" */ ); if (!man_path_list) { /* default, may be overridden by /etc/man.conf */ man_path_list = xzalloc(2 * sizeof(man_path_list[0])); man_path_list[0] = (char*)"/usr/man"; /* count_mp stays 0. * Thus, man.conf will overwrite man_path_list[0] * if a path is defined there. */ } /* Parse man.conf[ig] or man_db.conf */ /* man version 1.6f uses man.config */ /* man-db implementation of man uses man_db.conf */ parser = config_open2("/etc/man.config", fopen_for_read); if (!parser) parser = config_open2("/etc/man.conf", fopen_for_read); if (!parser) parser = config_open2("/etc/man_db.conf", fopen_for_read); while (config_read(parser, token, 2, 0, "# \t", PARSE_NORMAL)) { if (!token[1]) continue; if (strcmp("DEFINE", token[0]) == 0) { if (strncmp("pager", token[1], 5) == 0) { pager = xstrdup(skip_whitespace(token[1]) + 5); } } else if (strcmp("MANDATORY_MANPATH"+10, token[0]) == 0 /* "MANPATH"? */ || strcmp("MANDATORY_MANPATH", token[0]) == 0 ) { man_path_list = add_MANPATH(man_path_list, &count_mp, token[1]); } if (strcmp("MANSECT", token[0]) == 0) { free(sec_list); sec_list = xstrdup(token[1]); } } config_close(parser); { /* environment overrides setting from man.config */ char *env_pager = getenv("MANPAGER"); if (!env_pager) env_pager = getenv("PAGER"); if (env_pager) pager = env_pager; } not_found = 0; do { /* for each argv[] */ int found = 0; cur_mp = 0; if (strchr(*argv, '/')) { found = show_manpage(pager, *argv, /*man:*/ 1, 0); goto check_found; } while ((cur_path = man_path_list[cur_mp++]) != NULL) { /* for each MANPATH */ cur_sect = sec_list; do { /* for each section */ char *next_sect = strchrnul(cur_sect, ':'); int sect_len = next_sect - cur_sect; char *man_filename; int cat0man1 = 0; /* Search for cat, then man page */ while (cat0man1 < 2) { int found_here; man_filename = xasprintf("%s/%s%.*s/%s.%.*s", cur_path, "cat\0man" + (cat0man1 * 4), sect_len, cur_sect, *argv, sect_len, cur_sect); found_here = show_manpage(pager, man_filename, cat0man1, 0); found |= found_here; cat0man1 += found_here + 1; free(man_filename); } if (found && !(opt & OPT_a)) goto next_arg; cur_sect = next_sect; while (*cur_sect == ':') cur_sect++; } while (*cur_sect); } check_found: if (!found) { bb_error_msg("no manual entry for '%s'", *argv); not_found = 1; } next_arg: argv++; } while (*argv); return not_found; }
int man_main(int argc UNUSED_PARAM, char **argv) { parser_t *parser; const char *pager; char **man_path_list; char *sec_list; char *cur_path, *cur_sect; int count_mp, cur_mp; int opt, not_found; char *token[2]; opt_complementary = "-1"; /* at least one argument */ opt = getopt32(argv, "+aw"); argv += optind; sec_list = xstrdup("1:2:3:4:5:6:7:8:9"); /* Last valid man_path_list[] is [0x10] */ count_mp = 0; man_path_list = xzalloc(0x11 * sizeof(man_path_list[0])); man_path_list[0] = getenv("MANPATH"); if (!man_path_list[0]) /* default, may be overridden by /etc/man.conf */ man_path_list[0] = (char*)"/usr/man"; else count_mp++; pager = getenv("MANPAGER"); if (!pager) { pager = getenv("PAGER"); if (!pager) pager = "more"; } /* Parse man.conf */ parser = config_open2("/etc/man.conf", fopen_for_read); while (config_read(parser, token, 2, 0, "# \t", PARSE_NORMAL)) { if (!token[1]) continue; if (strcmp("MANPATH", token[0]) == 0) { /* Do we already have it? */ char **path_element = man_path_list; while (*path_element) { if (strcmp(*path_element, token[1]) == 0) goto skip; path_element++; } man_path_list = xrealloc_vector(man_path_list, 4, count_mp); man_path_list[count_mp] = xstrdup(token[1]); count_mp++; /* man_path_list is NULL terminated */ /*man_path_list[count_mp] = NULL; - xrealloc_vector did it */ } if (strcmp("MANSECT", token[0]) == 0) { free(sec_list); sec_list = xstrdup(token[1]); } skip: ; } config_close(parser); not_found = 0; do { /* for each argv[] */ int found = 0; cur_mp = 0; if (strchr(*argv, '/')) { found = show_manpage(pager, *argv, /*man:*/ 1, 0); goto check_found; } while ((cur_path = man_path_list[cur_mp++]) != NULL) { /* for each MANPATH */ do { /* for each MANPATH item */ char *next_path = strchrnul(cur_path, ':'); int path_len = next_path - cur_path; cur_sect = sec_list; do { /* for each section */ char *next_sect = strchrnul(cur_sect, ':'); int sect_len = next_sect - cur_sect; char *man_filename; int cat0man1 = 0; /* Search for cat, then man page */ while (cat0man1 < 2) { int found_here; man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" Z_SUFFIX, path_len, cur_path, "cat\0man" + (cat0man1 * 4), sect_len, cur_sect, *argv, sect_len, cur_sect); found_here = show_manpage(pager, man_filename, cat0man1, 0); found |= found_here; cat0man1 += found_here + 1; free(man_filename); } if (found && !(opt & OPT_a)) goto next_arg; cur_sect = next_sect; while (*cur_sect == ':') cur_sect++; } while (*cur_sect); cur_path = next_path; while (*cur_path == ':') cur_path++; } while (*cur_path); } check_found: if (!found) { bb_error_msg("no manual entry for '%s'", *argv); not_found = 1; } next_arg: argv++; } while (*argv); return not_found; }
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(ð_settings, 0, sizeof(eth_settings)); eth_settings.cmd = ETHTOOL_GSET; ifr.ifr_data = (caddr_t) ð_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; }