- bb_perror_msg_and_die("exec %s", ptr);
-}
-
-static int open_as_user(const struct passwd *pas, const char *file)
-{
- struct fd_pair filedes;
- pid_t pid;
- char c;
-
- xpiped_pair(filedes);
- pid = vfork();
- if (pid < 0) /* ERROR */
- bb_perror_msg_and_die("vfork");
- if (pid) { /* PARENT */
- int n = safe_read(filedes.rd, &c, 1);
- close(filedes.rd);
- close(filedes.wr);
- if (n > 0) /* child says it can read */
- return open(file, O_RDONLY);
- return -1;
- }
-
- /* CHILD */
-
- /* initgroups, setgid, setuid */
- change_identity(pas);
-
- /* We just try to read one byte. If that works, file is readable
- * under this user. We signal that by sending one byte to parent. */
- if (safe_read(xopen(file, O_RDONLY), &c, 1) == 1)
- safe_write(filedes.wr, &c, 1); /* "papa, I can read!" */
- _exit(0);