s!/etc/slackware-release!/etc/slackware-version! (reported by bubulak)
[util-vserver.git] / util-vserver / src / rpm-fake.c
index b3b641a..2c13106 100644 (file)
@@ -122,10 +122,10 @@ xdlsym(void *handle, const char *symbol)
   void *res = dlsym(handle, symbol);
   if (res==0) {
     char const *error = dlerror();
-    write(2, symbol, strlen(symbol));
-    write(2, ": ", 2);
-    write(2, error, strlen(error));
-    write(2, "\n", 2);
+    Vwrite(2, symbol, strlen(symbol));
+    Vwrite(2, ": ", 2);
+    Vwrite(2, error, strlen(error));
+    Vwrite(2, "\n", 2);
 
     _exit(255);
   }
@@ -512,8 +512,8 @@ exitRPMFake()
   if (isDbgLevel(DBG_INIT)) WRITE_MSG(2, ">>>>> exitRPMFake <<<<<\n");
   if (pw_sock!=-1) {
     uint8_t    c;
-    read(sync_sock, &c, 1);
-    write(pw_sock, "Q", 1);
+    if (read(sync_sock, &c, 1)!=1) { /*...*/ }
+    if (write(pw_sock, "Q", 1)!=1) { /*...*/ }
   }
 }
 
@@ -528,16 +528,13 @@ doPwStringRequest(uint32_t *result, char style, char const *name)
   uint8_t      code;
   uint8_t      c;
 
-    // read the token...
-  read(sync_sock, &c, 1);
-
-  write(pw_sock, &style, 1);
-  write(pw_sock, &len,   sizeof len);
-  write(pw_sock, name,   len);
-  read (pw_sock, &code,  sizeof code);
-  read (pw_sock, result, sizeof *result);
-
-  return code!=0;
+  return (TEMP_FAILURE_RETRY(read (sync_sock, &c, 1))==1 &&
+         TEMP_FAILURE_RETRY(write(pw_sock, &style, 1))==1 &&
+         TEMP_FAILURE_RETRY(write(pw_sock, &len,   sizeof len))==sizeof(len) &&
+         TEMP_FAILURE_RETRY(write(pw_sock, name,   len))==(ssize_t)(len) &&
+         TEMP_FAILURE_RETRY(read (pw_sock, &code,  sizeof code))==sizeof(code) &&
+         TEMP_FAILURE_RETRY(read (pw_sock, result, sizeof *result))==sizeof(*result) &&
+         code!=0);
 }
 
 struct passwd *
@@ -545,6 +542,7 @@ getpwnam(const char * name)
 {
   if (pw_sock==-1) return getpwnam_func(name);
   else {
+    uint32_t                   id;
     static struct passwd       res = {
       .pw_passwd = "*",
       .pw_gid    = -1,
@@ -554,7 +552,8 @@ getpwnam(const char * name)
     };
 
     res.pw_name = (char *)(name);
-    if (!doPwStringRequest(&res.pw_uid, 'P', name)) return 0;
+    if (!doPwStringRequest(&id, 'P', name)) return 0;
+    res.pw_uid = id;
     
     return &res;
   }
@@ -565,13 +564,15 @@ getgrnam(const char * name)
 {
   if (pw_sock==-1) return getgrnam_func(name);
   else {
+    uint32_t                   id;
     static struct group                res = {
       .gr_passwd = "*",
       .gr_mem    = 0
     };
 
     res.gr_name = (char *)(name);
-    if (!doPwStringRequest(&res.gr_gid, 'G', name)) return 0;
+    if (!doPwStringRequest(&id, 'G', name)) return 0;
+    res.gr_gid = id;
 
     return &res;
   }
@@ -581,12 +582,14 @@ void
 endgrent()
 {
   if (pw_sock==-1) endgrent_func();
+  TEMP_FAILURE_RETRY(write(pw_sock, "Cg", 2));
 }
 
 void
 endpwent()
 {
   if (pw_sock==-1) endpwent_func();
+  TEMP_FAILURE_RETRY(write(pw_sock, "Cp", 2));
 }
 
 
@@ -715,3 +718,9 @@ rpm_execcon(unsigned int UNUSED verified,
 
   return removeNamespaceMounts(filename, argv, envp);
 }
+
+int
+is_selinux_enabled()
+{
+  return 0;
+}