include <string.h> + <ctype.h>
[util-vserver.git] / util-vserver / src / rpm-fake.c
index d15ba62..f6c9770 100644 (file)
 #endif
 
 #include "pathconfig.h"
-#include "sys_clone.h"
 #include "util.h"
 
-#include "lib/vserver.h"
-#include "lib/internal.h"
+#include <lib/vserver.h>
+#include <lib/internal.h>
+#include <lib_internal/sys_clone.h>
 
 #include <sys/socket.h>
 #include <dlfcn.h>
 #include <pwd.h>
 #include <grp.h>
 
+
+  // from selinux.h
+  // FIXME: add configure autodetection and include <selinux.h> directly
+int rpm_execcon(unsigned int verified,
+               const char *filename,
+               char *const argv[], char *const envp[]);
+
+
 #define ENSC_WRAPPERS_PREFIX   "rpm-fake.so: "
 #define ENSC_WRAPPERS_VSERVER  1
 #define ENSC_WRAPPERS_UNISTD   1
@@ -87,7 +95,8 @@ static unsigned int   debug_level = 0;
 
 static bool            is_initialized = false;
 
-DECLARE(execv);
+  //DECLARE(rpm_execcon);
+  //DECLARE(execv);
 DECLARE(getpwnam);
 DECLARE(getgrnam);
 DECLARE(endpwent);
@@ -180,7 +189,7 @@ setupContext(xid_t xid, char const **xid_str)
     xid_t      rc=VC_NOCTX;
 
     if ((xid==VC_DYNAMIC_XID || !vc_is_dynamic_xid(xid)) &&
-       (rc=vc_create_context(xid))==VC_NOCTX &&
+       (rc=vc_ctx_create(xid))==VC_NOCTX &&
        errno!=EEXIST) {
       perror(ENSC_WRAPPERS_PREFIX "vc_create_context()");
       exit(255);
@@ -195,9 +204,9 @@ setupContext(xid_t xid, char const **xid_str)
       l = utilvserver_fmt_uint(buf+sizeof("rpm-fake.so #")-1, getppid());
       Evc_set_vhi_name(rc, vcVHI_CONTEXT, buf, sizeof("rpm-fake.so #")+l-1);
 
-      caps.ccaps = ~0ull;
+      caps.ccaps =  0ull;
       caps.cmask = ~0ull;
-      caps.bcaps = ~vc_get_securecaps();
+      caps.bcaps = ~vc_get_insecurebcaps();
       caps.bmask = ~0ull;
       Evc_set_ccaps(rc, &caps);
       
@@ -278,10 +287,12 @@ initPwSocket()
     }
 
     if (pid==0) {
-      char const       *args[15];
+      char const       *args[20];
       char const       **ptr  = args;
       char const       *env[] = { "HOME=/", "PATH=/bin:/usr/bin", 0 };
       char const       *xid_str;
+      char             flag_str[ sizeof(flags)*3 + 2];
+      char             caps_str[ sizeof(caps)*3  + 2];
       
       setsid();
       dup2(res_sock[1],  0);
@@ -294,7 +305,12 @@ initPwSocket()
       close(res_sock[1]);
        /* ... *socket[0] are marked as close-on-exec ...*/
 
+      flag_str[utilvserver_fmt_uint(flag_str, flags)] = '\0';
+      caps_str[utilvserver_fmt_uint(caps_str, caps)]  = '\0';
+
       *ptr++ = resolver;
+      *ptr++ = "-F"; *ptr++ = flag_str;
+      *ptr++ = "-C"; *ptr++ = caps_str;
       if (root)  { *ptr++ = "-r"; *ptr++ = root;  }
       if (uid)   { *ptr++ = "-u"; *ptr++ = uid;   }
       if (gid)   { *ptr++ = "-g"; *ptr++ = gid;   }
@@ -375,7 +391,8 @@ initEnvironment()
 static void
 initSymbols()
 {
-  INIT(RTLD_NEXT, execv);
+    //INIT(RTLD_NEXT, rpm_execcon);
+    //INIT(RTLD_NEXT, execv);
   INIT(RTLD_NEXT, getgrnam);
   INIT(RTLD_NEXT, getpwnam);
   INIT(RTLD_NEXT, endpwent);
@@ -525,17 +542,21 @@ endpwent()
 
 
 static int
-execvWorker(char const *path, char * const argv[])
+execvWorker(char const *path, char * const argv[], char * const envp[])
 {
-  int          res;
+  int          res = -1;
 
   if (vc_isSupported(vcFEATURE_MIGRATE))
-    res = vc_migrate_context(ctx);
+    res = vc_ctx_migrate(ctx);
   else
+#ifdef VC_ENABLE_API_COMPAT  
     res = vc_new_s_context(ctx,caps,flags);
-  
+#else
+    WRITE_MSG(2, ENSC_WRAPPERS_PREFIX "can not change context: migrate kernel feature missing and 'compat' API disabled\n");
+#endif
+    
   if (res!=-1)
-    res=execv_func(path, argv);
+    res=execve(path, argv, envp);
 
   return res;
 }
@@ -544,6 +565,7 @@ struct ExecvParams
 {
     char const *       path;
     char * const *     argv;
+    char * const *     envp;
     char const *       mnts;
 };
 
@@ -566,13 +588,14 @@ removeNamespaceMountsChild(struct ExecvParams const *params)
     ptr = strtok(0, ":");
   }
 
-  return execvWorker(params->path, params->argv);
+  return execvWorker(params->path, params->argv, params->envp);
 }
 
 static int
-removeNamespaceMounts(char const *path, char * const argv[])
+removeNamespaceMounts(char const *path,
+                     char * const argv[], char * const envp[])
 {
-  if (mnts==0) return execvWorker(path, argv);
+  if (mnts==0) return execvWorker(path, argv, envp);
 
   {
     int                                status;
@@ -581,6 +604,7 @@ removeNamespaceMounts(char const *path, char * const argv[])
 
     params.path = path;
     params.argv = argv;
+    params.envp = envp;
     params.mnts = mnts;
 
       // the rpmlib signal-handler is still active; use the default one to
@@ -613,7 +637,17 @@ removeNamespaceMounts(char const *path, char * const argv[])
 
 
 int
-execv(char const *path, char * const argv[]) __THROW
+execv(char const *path, char * const argv[])
+{
+  extern char **environ;
+
+  return removeNamespaceMounts(path, argv, environ);
+}
+
+int
+rpm_execcon(unsigned int UNUSED verified,
+           const char *filename,
+           char *const argv[], char *const envp[])
 {
-  return removeNamespaceMounts(path, argv);
+  return removeNamespaceMounts(filename, argv, envp);
 }