// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// Protocol:
+// 1. startup
+// 2. initialize (setuid, ctx-migrate, chroot, ...)
+// 3. send "." token to fd 3
+// 4. wait one character on fd 1
+// 5. process this character and consume further characters from fd 1 as far
+// as needed
+// 6. go to 3) (or exit)
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
uid_t uid;
gid_t gid;
bool do_fork;
+ bool in_ctx;
char const * pid_file;
char const * chroot;
+ uint32_t caps;
+ int flags;
};
static struct option const
WRITE_MSG(fd, "Usage: ");
WRITE_STR(fd, cmd);
WRITE_MSG(fd,
- " [-c <ctx>] [-u <uid>] [-g <gid>] [-r <chroot>] [-n]\n"
+ " [-c <ctx>] [-u <uid>] [-g <gid>] [-r <chroot>] [-s] [-n]\n"
"Please report bugs to " PACKAGE_BUGREPORT "\n");
exit(res);
}
parseArgs(struct ArgInfo *args, int argc, char *argv[])
{
while (1) {
- int c = getopt_long(argc, argv, "c:u:g:r:n", 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;
default :
WRITE_MSG(2, "Try '");
WRITE_STR(2, argv[0]);
Eclose(p[0]);
}
+static void
+activateContext(xid_t xid, bool in_ctx,
+ uint32_t xid_caps, int xid_flags)
+{
+ if (in_ctx) {
+ struct vc_ctx_flags flags = {
+ .flagword = 0,
+ .mask = VC_VXF_STATE_SETUP,
+ };
+
+ Evc_set_cflags(xid, &flags);
+ }
+ else if (vc_isSupported(vcFEATURE_MIGRATE))
+ 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[])
{
struct ArgInfo args = {
- .ctx = VC_RANDCTX,
+ .ctx = VC_DYNAMIC_XID,
.uid = 99,
.gid = 99,
.do_fork = true,
.pid_file = 0,
- .chroot = 0
+ .chroot = 0,
+ .in_ctx = false,
+ .flags = S_CTX_INFO_LOCK,
};
int pid_fd = -1;
parseArgs(&args, argc, argv);
if (args.pid_file && args.do_fork)
- pid_fd = Eopen(args.pid_file, O_CREAT|O_WRONLY, 0644);
+ pid_fd = EopenD(args.pid_file, O_CREAT|O_WRONLY, 0644);
if (args.chroot) Echroot(args.chroot);
Echdir("/");
- //Evc_new_s_context(args.ctx, ~(VC_CAP_SETGID|VC_CAP_SETUID), S_CTX_INFO_LOCK);
- Evc_new_s_context(args.ctx, 0, S_CTX_INFO_LOCK);
+ activateContext(args.ctx, args.in_ctx, args.caps, args.flags);
Esetgroups(0, &args.gid);
Esetgid(args.gid);
Esetuid(args.uid);