X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fplanetlab.c;h=73ccfc3efa452c95dde704e8e5502e6609d7b001;hb=d35ef08a986920e31142f27cbe3de2a0836a0c25;hp=90ba4dd278cd912463cce36e7b18837fbd2b61e9;hpb=a4750b971298b0b51f8db259b7f8f5976ee461d5;p=util-vserver-pl.git diff --git a/src/planetlab.c b/src/planetlab.c index 90ba4dd..73ccfc3 100644 --- a/src/planetlab.c +++ b/src/planetlab.c @@ -43,6 +43,7 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include #define _GNU_SOURCE #include @@ -50,6 +51,9 @@ POSSIBILITY OF SUCH DAMAGE. #include "vserver.h" #include "planetlab.h" +/* defined in netns.c */ +extern uint32_t get_space_flag(xid_t); + #ifndef VC_NXC_RAW_SOCKET # define VC_NXC_RAW_SOCKET 0x00000200ull #endif @@ -89,8 +93,6 @@ tag: if (vc_tag_create(ctx) == VC_NOCTX) return -1; -process: - /* * Create context info - this sets the STATE_SETUP and STATE_INIT flags. */ @@ -259,8 +261,8 @@ enum { }; struct pl_resources { - char *name; - unsigned type; + char *name; + unsigned type; union { unsigned long long *limit; unsigned long int *personality; @@ -278,9 +280,8 @@ pl_get_limits(const char *context, struct sliver_resources *slr) { FILE *fb; int cwd; - size_t len = strlen(VSERVERCONF) + strlen(context) + NULLBYTE_SIZE; - char *conf = (char *)malloc(len + strlen("rlimits/openfd.hard")); struct pl_resources *r; + struct pl_resources sliver_list[] = { {"sched/fill-rate2", TYPE_LONG, &slr->vs_cpu}, @@ -296,9 +297,9 @@ pl_get_limits(const char *context, struct sliver_resources *slr) {"rlimits/as.soft", TYPE_LONG, &slr->vs_as.soft}, {"rlimits/as.min", TYPE_LONG, &slr->vs_as.min}, - {"rlimits/openfd.hard", TYPE_LONG, &slr->vs_openfd.hard}, - {"rlimits/openfd.soft", TYPE_LONG, &slr->vs_openfd.soft}, - {"rlimits/openfd.min", TYPE_LONG, &slr->vs_openfd.min}, + {"rlimits/nofile.hard", TYPE_LONG, &slr->vs_nofile.hard}, + {"rlimits/nofile.soft", TYPE_LONG, &slr->vs_nofile.soft}, + {"rlimits/nofile.min", TYPE_LONG, &slr->vs_nofile.min}, {"rlimits/memlock.hard", TYPE_LONG, &slr->vs_memlock.hard}, {"rlimits/memlock.soft", TYPE_LONG, &slr->vs_memlock.soft}, @@ -309,6 +310,8 @@ pl_get_limits(const char *context, struct sliver_resources *slr) {0,0} }; + size_t len = strlen(VSERVERCONF) + strlen(context) + NULLBYTE_SIZE; + char *conf = (char *)malloc(len); sprintf(conf, "%s%s", VSERVERCONF, context); slr->vs_rss.hard = VC_LIM_KEEP; @@ -323,9 +326,9 @@ pl_get_limits(const char *context, struct sliver_resources *slr) slr->vs_nproc.soft = VC_LIM_KEEP; slr->vs_nproc.min = VC_LIM_KEEP; - slr->vs_openfd.hard = VC_LIM_KEEP; - slr->vs_openfd.soft = VC_LIM_KEEP; - slr->vs_openfd.min = VC_LIM_KEEP; + slr->vs_nofile.hard = VC_LIM_KEEP; + slr->vs_nofile.soft = VC_LIM_KEEP; + slr->vs_nofile.min = VC_LIM_KEEP; slr->vs_memlock.hard = VC_LIM_KEEP; slr->vs_memlock.soft = VC_LIM_KEEP; @@ -356,8 +359,13 @@ pl_get_limits(const char *context, struct sliver_resources *slr) buf[len-1]='\0'; len --; } - if ( (r->type == TYPE_LONG) && isdigit(*buf)) { - *r->limit = atoi(buf); + if (r->type == TYPE_LONG) { + int val; + char *res=0; + errno=0; + val = strtol(buf,&res,0); + if ( !( (val==0 && res) || (errno!=0) ) ) + *r->limit = val; } else if ( (r->type == TYPE_PERS) && isalpha(*buf)) { unsigned long int res; res = vc_str2personalitytype(buf,len); @@ -370,7 +378,7 @@ pl_get_limits(const char *context, struct sliver_resources *slr) fclose(fb); } - fchdir(cwd); + (void)fchdir(cwd); out_fd: close(cwd); out: @@ -445,7 +453,7 @@ pl_set_ulimits(const struct sliver_resources *slr) set_one_ulimit(RLIMIT_RSS, &slr->vs_rss); set_one_ulimit(RLIMIT_AS, &slr->vs_as); set_one_ulimit(RLIMIT_NPROC, &slr->vs_nproc); - set_one_ulimit(RLIMIT_NOFILE, &slr->vs_openfd); + set_one_ulimit(RLIMIT_NOFILE, &slr->vs_nofile); set_one_ulimit(RLIMIT_MEMLOCK, &slr->vs_memlock); return set_personality(slr->personality); }