#define ENSC_WRAPPERS_PREFIX "rpm-fake-resolver: "
#define ENSC_WRAPPERS_VSERVER 1
#define ENSC_WRAPPERS_UNISTD 1
+#define ENSC_WRAPPERS_IO 1
#define ENSC_WRAPPERS_FCNTL 1
#include <wrappers.h>
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;
do_getpwnam()
{
uint32_t len;
- Eread(0, &len, sizeof len);
- if (len<MAX_RQSIZE) {
+ if (EreadAll(0, &len, sizeof len) &&
+ len<MAX_RQSIZE) {
char buf[len+1];
- struct passwd * res;
+ struct passwd * res = 0;
+
+ if (EreadAll(0, buf, len)) {
+ buf[len] = '\0';
+ res = getpwnam(buf);
+ }
- Eread(0, buf, len);
- buf[len] = '\0';
- res = getpwnam(buf);
if (res!=0) sendResult(true, res->pw_uid);
else sendResult(false, -1);
}
do_getgrnam()
{
uint32_t len;
- Eread(0, &len, sizeof len);
- if (len<MAX_RQSIZE) {
+ if (EreadAll(0, &len, sizeof len) &&
+ len<MAX_RQSIZE) {
char buf[len+1];
- struct group * res;
+ struct group * res = 0;
+
+ if (EreadAll(0, buf, len)) {
+ buf[len] = '\0';
+ res = getgrnam(buf);
+ }
- Eread(0, buf, len);
- buf[len] = '\0';
- res = getgrnam(buf);
if (res!=0) sendResult(true, res->gr_gid);
else sendResult(false, -1);
}
do_closenss()
{
uint8_t what;
- Eread(0, &what, sizeof what);
- switch (what) {
- case 'p' : endpwent(); break;
- case 'g' : endgrent(); break;
- default : break;
+
+ if (EreadAll(0, &what, sizeof what)) {
+ switch (what) {
+ case 'p' : endpwent(); break;
+ case 'g' : endgrent(); break;
+ default : break;
+ }
}
}
{
uint8_t c;
- while (true) {
- Ewrite(3, ".", 1);
- Eread (0, &c, sizeof c);
+ while (EwriteAll(3, ".", 1),
+ EreadAll (0, &c, sizeof c)) {
switch (c) {
case 'P' : do_getpwnam(); break;
case 'G' : do_getgrnam(); break;
_exit(0);
}
Eclose(p[1]);
- read(p[0], &c, 1);
+ TEMP_FAILURE_RETRY(read(p[0], &c, 1));
Eclose(p[0]);
}
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);