#include <string.h>
#include <unistd.h>
-#include "libbb.h"
+#include "busybox.h"
#define MAX_OPT_DEPTH 10
#define EUNBALBRACK 10001
}
#endif
-#if ENABLE_FEATURE_IFUPDOWN_IPV4 || ENABLE_FEATURE_IFUPDOWN_IPV6 || \
- ENABLE_FEATURE_IFUPDOWN_IPX
+#if ENABLE_FEATURE_IFUPDOWN_IPV4 || ENABLE_FEATURE_IFUPDOWN_IPV6
static void addstr(char **buf, size_t *len, size_t *pos, char *str, size_t str_length)
{
if (*pos + str_length >= *len) {
varvalue = get_var(command, nextpercent - command, ifd);
if (varvalue) {
- addstr(&result, &len, &pos, varvalue, bb_strlen(varvalue));
+ addstr(&result, &len, &pos, varvalue, strlen(varvalue));
} else {
#ifdef CONFIG_FEATURE_IFUPDOWN_IP
/* Sigh... Add a special case for 'ip' to convert from
if (varvalue && (res=count_netmask_bits(varvalue)) > 0) {
char argument[255];
sprintf(argument, "%d", res);
- addstr(&result, &len, &pos, argument, bb_strlen(argument));
+ addstr(&result, &len, &pos, argument, strlen(argument));
command = nextpercent + 1;
break;
}
}
#endif
-#ifdef CONFIG_FEATURE_IFUPDOWN_IPX
-static int static_up_ipx(struct interface_defn_t *ifd, execfn *exec)
-{
- return(execute("ipx_interface add %iface% %frame% %netnum%", ifd, exec));
-}
-
-static int static_down_ipx(struct interface_defn_t *ifd, execfn *exec)
-{
- return(execute("ipx_interface del %iface% %frame%", ifd, exec));
-}
-
-static int dynamic_up(struct interface_defn_t *ifd, execfn *exec)
-{
- return(execute("ipx_interface add %iface% %frame%", ifd, exec));
-}
-
-static int dynamic_down(struct interface_defn_t *ifd, execfn *exec)
-{
- return(execute("ipx_interface del %iface% %frame%", ifd, exec));
-}
-
-static struct method_t methods_ipx[] = {
- { "dynamic", dynamic_up, dynamic_down, },
- { "static", static_up_ipx, static_down_ipx, },
-};
-
-static struct address_family_t addr_ipx = {
- "ipx",
- sizeof(methods_ipx) / sizeof(struct method_t),
- methods_ipx
-};
-#endif /* IFUP_FEATURE_IPX */
-
#ifdef CONFIG_FEATURE_IFUPDOWN_IPV6
static int loopback_up6(struct interface_defn_t *ifd, execfn *exec)
{
enum { NONE, IFACE, MAPPING } currently_processing = NONE;
- defn = xmalloc(sizeof(struct interfaces_file_t));
- defn->autointerfaces = NULL;
- defn->mappings = NULL;
- defn->ifaces = NULL;
+ defn = xzalloc(sizeof(struct interfaces_file_t));
f = bb_xfopen(filename, "r");
if (strcmp(firstword, "mapping") == 0) {
#ifdef CONFIG_FEATURE_IFUPDOWN_MAPPING
- currmap = xmalloc(sizeof(struct mapping_defn_t));
- currmap->max_matches = 0;
- currmap->n_matches = 0;
- currmap->match = NULL;
+ currmap = xzalloc(sizeof(struct mapping_defn_t));
while ((firstword = next_word(&buf_ptr)) != NULL) {
if (currmap->max_matches == currmap->n_matches) {
#endif
#ifdef CONFIG_FEATURE_IFUPDOWN_IPV6
&addr_inet6,
-#endif
-#ifdef CONFIG_FEATURE_IFUPDOWN_IPX
- &addr_ipx,
#endif
NULL
};
- currif = xmalloc(sizeof(struct interface_defn_t));
+ currif = xzalloc(sizeof(struct interface_defn_t));
iface_name = next_word(&buf_ptr);
address_family_name = next_word(&buf_ptr);
method_name = next_word(&buf_ptr);
return NULL;
}
- currif->max_options = 0;
- currif->n_options = 0;
- currif->option = NULL;
{
llist_t *iface_list;
for (iface_list = defn->ifaces; iface_list; iface_list = iface_list->link) {
struct interface_defn_t *tmp = (struct interface_defn_t *) iface_list->data;
- if ((strcmp(tmp->iface, currif->iface) == 0) ||
+ if ((strcmp(tmp->iface, currif->iface) == 0) &&
(tmp->address_family == currif->address_family)) {
bb_error_msg("duplicate interface \"%s\"", tmp->iface);
return NULL;
}
}
- defn->ifaces = llist_add_to_end(defn->ifaces, (char*)currif);
+ llist_add_to_end(&(defn->ifaces), (char*)currif);
}
debug_noise("iface %s %s %s\n", currif->iface, address_family_name, method_name);
}
}
/* Add the interface to the list */
- defn->autointerfaces = llist_add_to_end(defn->autointerfaces, bb_xstrdup(firstword));
+ llist_add_to_end(&(defn->autointerfaces), bb_xstrdup(firstword));
debug_noise("\nauto %s\n", firstword);
}
currently_processing = NONE;
{
int i;
- if (bb_strlen(buf_ptr) == 0) {
+ if (strlen(buf_ptr) == 0) {
bb_error_msg("option with empty value \"%s\"", buf);
return NULL;
}
char *here;
char *there;
- result = xmalloc(bb_strlen(format) + bb_strlen(name) + bb_strlen(value) + 1);
-
- sprintf(result, format, name, value);
+ result = bb_xasprintf(format, name, value);
for (here = there = result; *there != '=' && *there; there++) {
if (*there == '-')
here++;
}
}
- memmove(here, there, bb_strlen(there) + 1);
+ memmove(here, there, strlen(there) + 1);
return result;
}
*ppch = NULL;
}
free(__myenviron);
- __myenviron = NULL;
}
- __myenviron = xmalloc(sizeof(char *) * (n_env_entries + 1 /* for final NULL */ ));
+ __myenviron = xzalloc(sizeof(char *) * (n_env_entries + 1 /* for final NULL */ ));
environend = __myenviron;
- *environend = NULL;
for (i = 0; i < iface->n_options; i++) {
if (strcmp(iface->option[i].name, "up") == 0
continue;
}
*(environend++) = setlocalenv("IF_%s=%s", iface->option[i].name, iface->option[i].value);
- *environend = NULL;
}
*(environend++) = setlocalenv("%s=%s", "IFACE", iface->iface);
- *environend = NULL;
*(environend++) = setlocalenv("%s=%s", "ADDRFAM", iface->address_family->name);
- *environend = NULL;
*(environend++) = setlocalenv("%s=%s", "METHOD", iface->method->name);
- *environend = NULL;
*(environend++) = setlocalenv("%s=%s", "MODE", mode);
- *environend = NULL;
*(environend++) = setlocalenv("%s=%s", "PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");
- *environend = NULL;
}
static int doit(char *str)
/* If we are able to read a line of output from the script,
* remove any trailing whitespace and use this value
* as the name of the logical interface. */
- char *pch = new_logical + bb_strlen(new_logical) - 1;
+ char *pch = new_logical + strlen(new_logical) - 1;
while (pch >= new_logical && isspace(*pch))
*(pch--) = '\0';
free(logical);
logical = new_logical;
} else {
- /* If we are UNABLE to read a line of output, discard are
+ /* If we are UNABLE to read a line of output, discard our
* freshly allocated memory. */
free(new_logical);
}
static llist_t *find_iface_state(llist_t *state_list, const char *iface)
{
- unsigned short iface_len = bb_strlen(iface);
+ unsigned short iface_len = strlen(iface);
llist_t *search = state_list;
while (search) {
return(NULL);
}
-extern int ifupdown_main(int argc, char **argv)
+int ifupdown_main(int argc, char **argv)
{
int (*cmds) (struct interface_defn_t *) = NULL;
struct interfaces_file_t *defn;
if (cmds == iface_up) {
target_list = defn->autointerfaces;
} else {
-#if 0
/* iface_down */
- llist_t *new_item;
const llist_t *list = state_list;
while (list) {
- new_item = xmalloc(sizeof(llist_t));
- new_item->data = bb_xstrdup(list->data);
- new_item->link = NULL;
- list = target_list;
- if (list == NULL)
- target_list = new_item;
- else {
- while (list->link) {
- list = list->link;
- }
- list = new_item;
- }
+ llist_add_to_end(&target_list, bb_xstrdup(list->data));
list = list->link;
}
target_list = defn->autointerfaces;
-#else
-
- /* iface_down */
- const llist_t *list = state_list;
- while (list) {
- target_list = llist_add_to_end(target_list, bb_xstrdup(list->data));
- list = list->link;
- }
- target_list = defn->autointerfaces;
-#endif
}
} else {
- target_list = llist_add_to_end(target_list, argv[optind]);
+ llist_add_to_end(&target_list, argv[optind]);
}
llist_t *iface_state = find_iface_state(state_list, iface);
if (cmds == iface_up) {
- char *newiface = xmalloc(bb_strlen(iface) + 1 + bb_strlen(liface) + 1);
- sprintf(newiface, "%s=%s", iface, liface);
+ char *newiface = bb_xasprintf("%s=%s", iface, liface);
if (iface_state == NULL) {
- state_list = llist_add_to_end(state_list, newiface);
+ llist_add_to_end(&state_list, newiface);
} else {
free(iface_state->data);
iface_state->data = newiface;
}
} else {
/* Remove an interface from the linked list */
- if (iface_state) {
- llist_t *l = iface_state->link;
- free(iface_state->data);
- iface_state->data = NULL;
- iface_state->link = NULL;
- if (l) {
- iface_state->data = l->data;
- iface_state->link = l->link;
- }
- free(l);
- }
+ free(llist_pop(&iface_state));
}
}
}