|
|
| version 1.1.1.1, 2012/02/21 16:23:02 | version 1.1.1.2, 2012/05/29 12:26:49 |
|---|---|
| Line 61 static void handler(int); | Line 61 static void handler(int); |
| static char *getln(int, char *, size_t, int); | static char *getln(int, char *, size_t, int); |
| static char *sudo_askpass(const char *, const char *); | static char *sudo_askpass(const char *, const char *); |
| #ifdef _PATH_SUDO_ASKPASS | |
| const char *askpass_path = _PATH_SUDO_ASKPASS; | |
| #else | |
| const char *askpass_path; | |
| #endif | |
| /* | /* |
| * Like getpass(3) but with timeout and echo flags. | * Like getpass(3) but with timeout and echo flags. |
| */ | */ |
| Line 79 tgetpass(const char *prompt, int timeout, int flags) | Line 73 tgetpass(const char *prompt, int timeout, int flags) |
| static const char *askpass; | static const char *askpass; |
| static char buf[SUDO_PASS_MAX + 1]; | static char buf[SUDO_PASS_MAX + 1]; |
| int i, input, output, save_errno, neednl = 0, need_restart; | int i, input, output, save_errno, neednl = 0, need_restart; |
| debug_decl(tgetpass, SUDO_DEBUG_CONV) | |
| (void) fflush(stdout); | (void) fflush(stdout); |
| if (askpass == NULL) { | if (askpass == NULL) { |
| askpass = getenv("SUDO_ASKPASS"); | askpass = getenv("SUDO_ASKPASS"); |
| if (askpass == NULL || *askpass == '\0') | if (askpass == NULL || *askpass == '\0') |
| askpass = askpass_path; | askpass = sudo_conf_askpass_path(); |
| } | } |
| /* If no tty present and we need to disable echo, try askpass. */ | /* If no tty present and we need to disable echo, try askpass. */ |
| Line 93 tgetpass(const char *prompt, int timeout, int flags) | Line 88 tgetpass(const char *prompt, int timeout, int flags) |
| !tty_present()) { | !tty_present()) { |
| if (askpass == NULL || getenv("DISPLAY") == NULL) { | if (askpass == NULL || getenv("DISPLAY") == NULL) { |
| warningx(_("no tty present and no askpass program specified")); | warningx(_("no tty present and no askpass program specified")); |
| return NULL; | debug_return_str(NULL); |
| } | } |
| SET(flags, TGP_ASKPASS); | SET(flags, TGP_ASKPASS); |
| } | } |
| Line 102 tgetpass(const char *prompt, int timeout, int flags) | Line 97 tgetpass(const char *prompt, int timeout, int flags) |
| if (ISSET(flags, TGP_ASKPASS)) { | if (ISSET(flags, TGP_ASKPASS)) { |
| if (askpass == NULL || *askpass == '\0') | if (askpass == NULL || *askpass == '\0') |
| errorx(1, _("no askpass program specified, try setting SUDO_ASKPASS")); | errorx(1, _("no askpass program specified, try setting SUDO_ASKPASS")); |
| return sudo_askpass(askpass, prompt); | debug_return_str_masked(sudo_askpass(askpass, prompt)); |
| } | } |
| restart: | restart: |
| Line 203 restore: | Line 198 restore: |
| if (save_errno) | if (save_errno) |
| errno = save_errno; | errno = save_errno; |
| return pass; | |
| debug_return_str_masked(pass); | |
| } | } |
| /* | /* |
| Line 216 sudo_askpass(const char *askpass, const char *prompt) | Line 212 sudo_askpass(const char *askpass, const char *prompt) |
| sigaction_t sa, saved_sa_pipe; | sigaction_t sa, saved_sa_pipe; |
| int pfd[2]; | int pfd[2]; |
| pid_t pid; | pid_t pid; |
| debug_decl(sudo_askpass, SUDO_DEBUG_CONV) | |
| if (pipe(pfd) == -1) | if (pipe(pfd) == -1) |
| error(1, _("unable to create pipe")); | error(1, _("unable to create pipe")); |
| Line 257 sudo_askpass(const char *askpass, const char *prompt) | Line 254 sudo_askpass(const char *askpass, const char *prompt) |
| (void) close(pfd[0]); | (void) close(pfd[0]); |
| (void) sigaction(SIGPIPE, &saved_sa_pipe, NULL); | (void) sigaction(SIGPIPE, &saved_sa_pipe, NULL); |
| return pass; | if (pass == NULL) |
| errno = EINTR; /* make cancel button simulate ^C */ | |
| debug_return_str_masked(pass); | |
| } | } |
| extern int term_erase, term_kill; | extern int term_erase, term_kill; |
| Line 269 getln(int fd, char *buf, size_t bufsiz, int feedback) | Line 269 getln(int fd, char *buf, size_t bufsiz, int feedback) |
| ssize_t nr = -1; | ssize_t nr = -1; |
| char *cp = buf; | char *cp = buf; |
| char c = '\0'; | char c = '\0'; |
| debug_decl(getln, SUDO_DEBUG_CONV) | |
| if (left == 0) { | if (left == 0) { |
| errno = EINVAL; | errno = EINVAL; |
| return NULL; /* sanity */ | debug_return_str(NULL); /* sanity */ |
| } | } |
| while (--left) { | while (--left) { |
| Line 297 getln(int fd, char *buf, size_t bufsiz, int feedback) | Line 298 getln(int fd, char *buf, size_t bufsiz, int feedback) |
| } | } |
| continue; | continue; |
| } | } |
| if (write(fd, "*", 1) == -1) | ignore_result(write(fd, "*", 1)); |
| /* shut up glibc */; | |
| } | } |
| *cp++ = c; | *cp++ = c; |
| } | } |
| Line 312 getln(int fd, char *buf, size_t bufsiz, int feedback) | Line 312 getln(int fd, char *buf, size_t bufsiz, int feedback) |
| } | } |
| } | } |
| return nr == 1 ? buf : NULL; | debug_return_str_masked(nr == 1 ? buf : NULL); |
| } | } |
| static void | static void |
| Line 326 int | Line 326 int |
| tty_present(void) | tty_present(void) |
| { | { |
| int fd; | int fd; |
| debug_decl(tty_present, SUDO_DEBUG_UTIL) | |
| if ((fd = open(_PATH_TTY, O_RDWR|O_NOCTTY)) != -1) | if ((fd = open(_PATH_TTY, O_RDWR|O_NOCTTY)) != -1) |
| close(fd); | close(fd); |
| return fd != -1; | debug_return_bool(fd != -1); |
| } | } |