#include <getopt.h>
#include <assert.h>
#include <fcntl.h>
+#include <libgen.h>
+#define ENSC_WRAPPERS_PREFIX "chcontext: "
#define ENSC_WRAPPERS_VSERVER 1
#define ENSC_WRAPPERS_UNISTD 1
#define ENSC_WRAPPERS_FCNTL 1
static void
showHelp(int fd, char const *cmd, int res)
{
+ VSERVER_DECLARE_CMD(cmd);
+
WRITE_MSG(fd, "Usage: ");
WRITE_STR(fd, cmd);
WRITE_MSG(fd,
showVersion()
{
WRITE_MSG(1,
- "chcontext " VERSION " -- allocates/enters a security context\n"
+ "chcontext-compat " VERSION " -- allocates/enters a security context\n"
"This program is part of " PACKAGE_STRING "\n\n"
"Copyright (C) 2003,2004 Enrico Scholz\n"
VERSION_COPYRIGHT_DISCLAIMER);
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_list2flag_compat(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);
}
}
if (name == NULL) return;
if (sethostname(name, strlen(name))==-1) {
- perror("sethostname()");
+ perror("chcontext: sethostname()");
exit(255);
}
if (!global_args->do_silent) {
if (name == NULL) return;
if (setdomainname(name, strlen(name))==-1) {
- perror("setdomainname()");
+ perror("chcontext: setdomainname()");
exit(255);
}
if (!global_args->do_silent) {
args.domainname = "";
if (args.nbctx == 0)
- args.ctxs[args.nbctx++] = VC_RANDCTX;
+ args.ctxs[args.nbctx++] = VC_DYNAMIC_XID;
- 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]);
+ tellContext(args.ctxs[0]==VC_DYNAMIC_XID ? newctx : args.ctxs[0]);
doSyncStage1(p);
execvp (argv[optind],argv+optind);
doSyncStage2(p);
- perror("execvp()");
+ PERROR_Q("chcontext: execvp", argv[optind]);
exit(255);
}