libbb: two new functions: wait_for_exitstatus(pid), xfchdir(fd)
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 1 Apr 2016 20:12:44 +0000 (22:12 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 1 Apr 2016 20:12:44 +0000 (22:12 +0200)
Bartosz Golaszewski proposed xfchdir()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/libarchive/data_extract_to_command.c
include/libbb.h
libbb/xfuncs.c
libbb/xfuncs_printf.c
runit/chpst.c
util-linux/unshare.c

index 6f5317a0eebbcd463b744afd0f9009f8c27bb307..5d8769382f1668584c6bcbb5f87f25b39e24ef08 100644 (file)
@@ -112,8 +112,7 @@ void FAST_FUNC data_extract_to_command(archive_handle_t *archive_handle)
                bb_copyfd_exact_size(archive_handle->src_fd, p[1], -file_header->size);
                close(p[1]);
 
-               if (safe_waitpid(pid, &status, 0) == -1)
-                       bb_perror_msg_and_die("waitpid");
+               status = wait_for_exitstatus(pid);
                if (WIFEXITED(status) && WEXITSTATUS(status))
                        bb_error_msg_and_die("'%s' returned status %d",
                                archive_handle->tar__to_command, WEXITSTATUS(status));
index 98d788402d25db9fb9205e8081bde729fd46a03b..5b4280e34d2aff963e5d54986a6581cfb7503cb9 100644 (file)
@@ -500,6 +500,7 @@ void xsetuid(uid_t uid) FAST_FUNC;
 void xsetegid(gid_t egid) FAST_FUNC;
 void xseteuid(uid_t euid) FAST_FUNC;
 void xchdir(const char *path) FAST_FUNC;
+void xfchdir(int fd) FAST_FUNC;
 void xchroot(const char *path) FAST_FUNC;
 void xsetenv(const char *key, const char *value) FAST_FUNC;
 void bb_unsetenv(const char *key) FAST_FUNC;
@@ -1021,6 +1022,7 @@ pid_t wait_any_nohang(int *wstat) FAST_FUNC;
  *      if (rc > 0) bb_error_msg("exit code: %d", rc & 0xff);
  */
 int wait4pid(pid_t pid) FAST_FUNC;
+int wait_for_exitstatus(pid_t pid) FAST_FUNC;
 /* Same as wait4pid(spawn(argv)), but with NOFORK/NOEXEC if configured: */
 int spawn_and_wait(char **argv) FAST_FUNC;
 /* Does NOT check that applet is NOFORK, just blindly runs it */
index 206edb4a0f0c2ad3c061e74c9e3eb09e4cc0ce4d..3f9a84ad4915ece662a02f337cfb4b36da14c476 100644 (file)
@@ -315,3 +315,15 @@ int FAST_FUNC wait4pid(pid_t pid)
                return WTERMSIG(status) + 0x180;
        return 0;
 }
+
+// Useful when we do know that pid is valid, and we just want to wait
+// for it to exit. Not existing pid is fatal. waitpid() status is not returned.
+int FAST_FUNC wait_for_exitstatus(pid_t pid)
+{
+       int exit_status, n;
+
+       n = safe_waitpid(pid, &exit_status, 0);
+       if (n < 0)
+               bb_perror_msg_and_die("waitpid");
+       return exit_status;
+}
index 73488908d99abcbe3e53ca9199b6fdd7a6c996d4..4aa1b5ce2130fe4c56b73f104a162899a7dacfcb 100644 (file)
@@ -390,6 +390,12 @@ void FAST_FUNC xchdir(const char *path)
                bb_perror_msg_and_die("can't change directory to '%s'", path);
 }
 
+void FAST_FUNC xfchdir(int fd)
+{
+       if (fchdir(fd))
+               bb_perror_msg_and_die("fchdir");
+}
+
 void FAST_FUNC xchroot(const char *path)
 {
        if (chroot(path))
index 301cdd08a21688acc5b525240cd3916964cb3c01..7fe5151db66ff2a81bf122475280b3b473a3e516 100644 (file)
@@ -255,8 +255,7 @@ static NOINLINE void edir(const char *directory_name)
                xsetenv(d->d_name, buf);
        }
        closedir(dir);
-       if (fchdir(wdir) == -1)
-               bb_perror_msg_and_die("fchdir");
+       xfchdir(wdir);
        close(wdir);
 }
 
index f1a9cdf194c43f4d66d15d55860b890c03272255..b8cd4676a2492403698a234afb901228faf2b068 100644 (file)
@@ -57,17 +57,6 @@ static void mount_or_die(const char *source, const char *target,
        }
 }
 
-// TODO: move to libbb
-static int wait_for_exitstatus(pid_t pid)
-{
-       int exit_status, n;
-
-       n = safe_waitpid(pid, &exit_status, 0);
-       if (n < 0)
-               bb_perror_msg_and_die("waitpid");
-       return exit_status;
-}
-
 /*
  * Longest possible path to a procfs file used in unshare. Must be able to
  * contain the '/proc/' string, the '/ns/user' string which is the longest