From: Christian Seiler Date: Sat, 3 May 2014 18:57:45 +0000 (+0200) Subject: Factor out capability parsing logic X-Git-Tag: lxc-1.1.0.alpha1~114 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bab88e68940f5acc451b0d0e9450292fcc9ef44c;p=thirdparty%2Flxc.git Factor out capability parsing logic Currently, setup_caps and dropcaps_except both use the same parsing logic for parsing capabilities (try to identify by name, but allow numerical specification). Since this is a common routine, separate it out to improve maintainability and reuseability. Signed-off-by: Christian Seiler Signed-off-by: Serge Hallyn --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index d765f0da5..716fcad09 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -2160,42 +2160,49 @@ static int setup_mount_entries(const struct lxc_rootfs *rootfs, struct lxc_list return ret; } +static int parse_cap(const char *cap) +{ + char *ptr = NULL; + int i, capid = -1; + + for (i = 0; i < sizeof(caps_opt)/sizeof(caps_opt[0]); i++) { + + if (strcmp(cap, caps_opt[i].name)) + continue; + + capid = caps_opt[i].value; + break; + } + + if (capid < 0) { + /* try to see if it's numeric, so the user may specify + * capabilities that the running kernel knows about but + * we don't */ + errno = 0; + capid = strtol(cap, &ptr, 10); + if (!ptr || *ptr != '\0' || errno != 0) + /* not a valid number */ + capid = -1; + else if (capid > lxc_caps_last_cap()) + /* we have a number but it's not a valid + * capability */ + capid = -1; + } + + return capid; +} + static int setup_caps(struct lxc_list *caps) { struct lxc_list *iterator; char *drop_entry; - char *ptr; - int i, capid; + int capid; lxc_list_for_each(iterator, caps) { drop_entry = iterator->elem; - capid = -1; - - for (i = 0; i < sizeof(caps_opt)/sizeof(caps_opt[0]); i++) { - - if (strcmp(drop_entry, caps_opt[i].name)) - continue; - - capid = caps_opt[i].value; - break; - } - - if (capid < 0) { - /* try to see if it's numeric, so the user may specify - * capabilities that the running kernel knows about but - * we don't */ - errno = 0; - capid = strtol(drop_entry, &ptr, 10); - if (!ptr || *ptr != '\0' || errno != 0) - /* not a valid number */ - capid = -1; - else if (capid > lxc_caps_last_cap()) - /* we have a number but it's not a valid - * capability */ - capid = -1; - } + capid = parse_cap(drop_entry); if (capid < 0) { ERROR("unknown capability %s", drop_entry); @@ -2220,7 +2227,6 @@ static int dropcaps_except(struct lxc_list *caps) { struct lxc_list *iterator; char *keep_entry; - char *ptr; int i, capid; int numcaps = lxc_caps_last_cap() + 1; INFO("found %d capabilities", numcaps); @@ -2236,31 +2242,7 @@ static int dropcaps_except(struct lxc_list *caps) keep_entry = iterator->elem; - capid = -1; - - for (i = 0; i < sizeof(caps_opt)/sizeof(caps_opt[0]); i++) { - - if (strcmp(keep_entry, caps_opt[i].name)) - continue; - - capid = caps_opt[i].value; - break; - } - - if (capid < 0) { - /* try to see if it's numeric, so the user may specify - * capabilities that the running kernel knows about but - * we don't */ - capid = strtol(keep_entry, &ptr, 10); - if (!ptr || *ptr != '\0' || - capid == INT_MIN || capid == INT_MAX) - /* not a valid number */ - capid = -1; - else if (capid > lxc_caps_last_cap()) - /* we have a number but it's not a valid - * capability */ - capid = -1; - } + capid = parse_cap(keep_entry); if (capid < 0) { ERROR("unknown capability %s", keep_entry);