From 3cf26507111b7886b74cee48c27c15b758e8cfb0 Mon Sep 17 00:00:00 2001 From: Enrico Scholz Date: Mon, 9 Feb 2004 23:36:46 +0000 Subject: [PATCH] setFlags(): use vc_textlist2flag() function rearranged code to avoid unremovable zombie processes git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@850 94cd875c-1c1d-0410-91d2-eb244daf1a30 --- util-vserver/src/chcontext.c | 45 +++++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/util-vserver/src/chcontext.c b/util-vserver/src/chcontext.c index 8f40ad3..e6e7425 100644 --- a/util-vserver/src/chcontext.c +++ b/util-vserver/src/chcontext.c @@ -191,34 +191,23 @@ setCap(char const *str, uint32_t *add_caps, uint32_t *remove_caps) WRITE_MSG(2, "Unknown capability '"); WRITE_STR(2, str); WRITE_MSG(2, "'\n"); - exit(255); + exit(wrapper_exit_code); } } static inline void setFlags(char const *str, uint32_t *flags) { - for (;;) { - char const *ptr = strchr(str, ','); - size_t cnt = ptr ? (size_t)(ptr-str) : strlen(str); - - if (strncmp(str, "lock", cnt)==0) *flags |= S_CTX_INFO_LOCK; - else if (strncmp(str, "sched", cnt)==0) *flags |= S_CTX_INFO_SCHED; - else if (strncmp(str, "nproc", cnt)==0) *flags |= S_CTX_INFO_NPROC; - else if (strncmp(str, "private", cnt)==0) *flags |= S_CTX_INFO_PRIVATE; - else if (strncmp(str, "fakeinit", cnt)==0) *flags |= S_CTX_INFO_INIT; - else if (strncmp(str, "hideinfo", cnt)==0) *flags |= S_CTX_INFO_HIDEINFO; - else if (strncmp(str, "ulimit", cnt)==0) *flags |= S_CTX_INFO_ULIMIT; - else { - WRITE_MSG(2, "Unknown flag '"); - write(2, str, cnt); - WRITE_MSG(2, "'\n"); - exit(255); - } + char const *err_ptr; + size_t err_len; + + *flags = vc_textlist2flag(str, 0, &err_ptr, &err_len); - - if (ptr==0) break; - str = ptr+1; + if (err_ptr!=0) { + WRITE_MSG(2, "Unknown flag '"); + write(2, err_ptr, err_len); + WRITE_MSG(2, "'\n"); + exit(wrapper_exit_code); } } @@ -389,16 +378,16 @@ int main (int argc, char *argv[]) if (args.nbctx == 0) args.ctxs[args.nbctx++] = VC_RANDCTX; - xflags = args.flags & 16; - - newctx = Evc_new_s_context(args.ctxs[0],0,args.flags&~16); - args.remove_caps &= (~args.add_caps); - setHostname(args.hostname); - setDomainname(args.domainname); + xflags = args.flags & S_CTX_INFO_INIT; + args.flags &= ~S_CTX_INFO_INIT; pid = initSync(p); - if (pid==0) { + newctx = Evc_new_s_context(args.ctxs[0],0,args.flags); + args.remove_caps &= (~args.add_caps); + setHostname(args.hostname); + setDomainname(args.domainname); + if (args.remove_caps!=0 || xflags!=0) Evc_new_s_context (VC_SAMECTX,args.remove_caps,xflags); tellContext(args.ctxs[0]==VC_RANDCTX ? newctx : args.ctxs[0]); -- 1.8.1.5