bool in_ctx;
char const * pid_file;
char const * chroot;
+ uint32_t caps;
+ int flags;
};
static struct option const
parseArgs(struct ArgInfo *args, int argc, char *argv[])
{
while (1) {
- int c = getopt_long(argc, argv, "c:u:g:r:ns", CMDLINE_OPTIONS, 0);
+ int c = getopt_long(argc, argv, "F:C:c:u:g:r:ns", CMDLINE_OPTIONS, 0);
if (c==-1) break;
switch (c) {
case 'h' : showHelp(1, argv[0], 0);
case 'v' : showVersion();
- case 'c' : args->ctx = atoi(optarg); break;
- case 'u' : args->uid = atoi(optarg); break;
- case 'g' : args->gid = atoi(optarg); break;
+ case 'c' : args->ctx = atoi(optarg); break;
+ case 'u' : args->uid = atoi(optarg); break;
+ case 'g' : args->gid = atoi(optarg); break;
+ case 'F' : args->flags = atoi(optarg); break;
+ case 'C' : args->caps = atoi(optarg); break;
case 'r' : args->chroot = optarg; break;
case 'n' : args->do_fork = false; break;
case 's' : args->in_ctx = true; break;
}
static void
-activateContext(xid_t xid, bool in_ctx)
+activateContext(xid_t xid, bool in_ctx,
+ uint32_t xid_caps, int xid_flags)
{
if (in_ctx) {
struct vc_ctx_flags flags = {
.mask = VC_VXF_STATE_SETUP,
};
- Evc_set_flags(xid, &flags);
+ Evc_set_cflags(xid, &flags);
}
else if (vc_isSupported(vcFEATURE_MIGRATE))
- Evc_migrate_context(xid);
- else
- Evc_new_s_context(xid, 0, S_CTX_INFO_LOCK);
- //Evc_new_s_context(args.ctx, ~(VC_CAP_SETGID|VC_CAP_SETUID), S_CTX_INFO_LOCK);
+ Evc_ctx_migrate(xid);
+ else {
+#ifdef VC_ENABLE_API_COMPAT
+ Evc_new_s_context(xid, xid_caps, xid_flags);
+#else
+ WRITE_MSG(2, ENSC_WRAPPERS_PREFIX "can not change context: migrate kernel feature missing and 'compat' API disabled\n");
+ exit(wrapper_exit_code);
+#endif
+ }
}
int main(int argc, char * argv[])
.pid_file = 0,
.chroot = 0,
.in_ctx = false,
+ .flags = S_CTX_INFO_LOCK,
};
int pid_fd = -1;
if (args.chroot) Echroot(args.chroot);
Echdir("/");
- activateContext(args.ctx, args.in_ctx);
+ activateContext(args.ctx, args.in_ctx, args.caps, args.flags);
Esetgroups(0, &args.gid);
Esetgid(args.gid);
Esetuid(args.uid);