- return(filedes[0]);
- }
-
- /*
- * CHILD
- */
-
- close(filedes[0]);
-
- if (ChangeUser(user, 0) < 0)
- exit(0);
-
- fd = open(file, O_RDONLY);
- if (fd < 0) {
- bb_error_msg("unable to open %s", file);
- exit(0);
- }
- buf[0] = 0;
- write(filedes[1], buf, 1);
- while ((n = read(fd, buf, sizeof(buf))) > 0) {
- write(filedes[1], buf, n);
- }
- exit(0);
-}
-
-static void
-EditFile(const char *user, const char *file)
-{
- int pid;
-
- if ((pid = fork()) == 0) {
- /*
- * CHILD - change user and run editor
- */
- char *ptr;
- char visual[1024];
-
- if (ChangeUser(user, 1) < 0)
- exit(0);
- if ((ptr = getenv("VISUAL")) == NULL || strlen(ptr) > 256)
- ptr = PATH_VI;
-
- snprintf(visual, sizeof(visual), "%s %s", ptr, file);
- execl("/bin/sh", "/bin/sh", "-c", visual, NULL);
- perror("exec");
- exit(0);
- }
- if (pid < 0) {
- /*
- * PARENT - failure
- */
- bb_perror_msg_and_die("fork");
- }
- wait4(pid, NULL, 0, NULL);
-}
-
-static void
-log(const char *ctl, ...)
-{
- va_list va;
- char buf[1024];
-
- va_start(va, ctl);
- vsnprintf(buf, sizeof(buf), ctl, va);
- syslog(LOG_NOTICE, "%s",buf );
- va_end(va);
-}
-
-static int
-ChangeUser(const char *user, short dochdir)
-{
- struct passwd *pas;
-
- /*
- * Obtain password entry and change privilages
- */
-
- if ((pas = getpwnam(user)) == 0) {
- log("failed to get uid for %s", user);
- return(-1);
- }
- setenv("USER", pas->pw_name, 1);
- setenv("HOME", pas->pw_dir, 1);
- setenv("SHELL", "/bin/sh", 1);
-
- /*
- * Change running state to the user in question
- */
-
- if (initgroups(user, pas->pw_gid) < 0) {
- log("initgroups failed: %s %m", user);
- return(-1);
- }
- if (setregid(pas->pw_gid, pas->pw_gid) < 0) {
- log("setregid failed: %s %d", user, pas->pw_gid);
- return(-1);
- }
- if (setreuid(pas->pw_uid, pas->pw_uid) < 0) {
- log("setreuid failed: %s %d", user, pas->pw_uid);
- return(-1);
- }
- if (dochdir) {
- if (chdir(pas->pw_dir) < 0) {
- if (chdir(TMPDIR) < 0) {
- log("chdir failed: %s %s", user, pas->pw_dir);
- log("chdir failed: %s " TMPDIR, user);
- return(-1);
- }