|
version 1.1.1.3, 2013/07/22 10:46:13
|
version 1.1.1.4, 2014/06/15 16:12:55
|
|
Line 1
|
Line 1
|
| /* |
/* |
| * Copyright (c) 2012-2013 Todd C. Miller <Todd.Miller@courtesan.com> | * Copyright (c) 2012-2014 Todd C. Miller <Todd.Miller@courtesan.com> |
| * |
* |
| * Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
Line 193 sudo_ttyname_scan(const char *dir, dev_t rdev, bool bu
|
Line 193 sudo_ttyname_scan(const char *dir, dev_t rdev, bool bu
|
| size_t sdlen, d_len, len, num_subdirs = 0, max_subdirs = 0; |
size_t sdlen, d_len, len, num_subdirs = 0, max_subdirs = 0; |
| struct dirent *dp; |
struct dirent *dp; |
| struct stat sb; |
struct stat sb; |
| int i; | unsigned int i; |
| debug_decl(sudo_ttyname_scan, SUDO_DEBUG_UTIL) |
debug_decl(sudo_ttyname_scan, SUDO_DEBUG_UTIL) |
| |
|
| if (dir[0] == '\0' || (d = opendir(dir)) == NULL) |
if (dir[0] == '\0' || (d = opendir(dir)) == NULL) |
|
Line 371 get_process_ttyname(void)
|
Line 371 get_process_ttyname(void)
|
| rc = sysctl(mib, sudo_kp_namelen, ki_proc, &size, NULL, 0); |
rc = sysctl(mib, sudo_kp_namelen, ki_proc, &size, NULL, 0); |
| } while (rc == -1 && errno == ENOMEM); |
} while (rc == -1 && errno == ENOMEM); |
| if (rc != -1) { |
if (rc != -1) { |
| if (ki_proc->sudo_kp_tdev != (dev_t)-1) { | if ((dev_t)ki_proc->sudo_kp_tdev != (dev_t)-1) { |
| tty = sudo_ttyname_dev(ki_proc->sudo_kp_tdev); |
tty = sudo_ttyname_dev(ki_proc->sudo_kp_tdev); |
| if (tty == NULL) { |
if (tty == NULL) { |
| sudo_debug_printf(SUDO_DEBUG_WARN, |
sudo_debug_printf(SUDO_DEBUG_WARN, |
|
Line 441 get_process_ttyname(void)
|
Line 441 get_process_ttyname(void)
|
| if (len != -1) { |
if (len != -1) { |
| /* Field 7 is the tty dev (0 if no tty) */ |
/* Field 7 is the tty dev (0 if no tty) */ |
| char *cp = line; |
char *cp = line; |
| int field = 1; | char *ep = line; |
| while (*cp != '\0') { | const char *errstr; |
| if (*cp++ == ' ') { | int field = 0; |
| | while (*++ep != '\0') { |
| | if (*ep == ' ') { |
| | *ep = '\0'; |
| if (++field == 7) { |
if (++field == 7) { |
| dev_t tdev = (dev_t)atoi(cp); | dev_t tdev = strtonum(cp, INT_MIN, INT_MAX, &errstr); |
| | if (errstr) { |
| | sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, |
| | "%s: tty device %s: %s", path, cp, errstr); |
| | } |
| if (tdev > 0) |
if (tdev > 0) |
| tty = sudo_ttyname_dev(tdev); |
tty = sudo_ttyname_dev(tdev); |
| break; |
break; |
| } |
} |
| |
cp = ep + 1; |
| } |
} |
| } |
} |
| } |
} |
|
Line 458 get_process_ttyname(void)
|
Line 466 get_process_ttyname(void)
|
| |
|
| debug_return_str(tty); |
debug_return_str(tty); |
| } |
} |
| #elif HAVE_PSTAT_GETPROC | #elif defined(HAVE_PSTAT_GETPROC) |
| /* |
/* |
| * Return a string from ttyname() containing the tty to which the process is |
* Return a string from ttyname() containing the tty to which the process is |
| * attached or NULL if the process has no controlling tty. |
* attached or NULL if the process has no controlling tty. |
|
Line 468 get_process_ttyname(void)
|
Line 476 get_process_ttyname(void)
|
| { |
{ |
| struct pst_status pstat; |
struct pst_status pstat; |
| char *tty = NULL; |
char *tty = NULL; |
| |
int rc; |
| debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) |
debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) |
| |
|
| /* Try to determine the tty from psdev in struct pst_status. */ | /* |
| if (pstat_getproc(&pstat, sizeof(pstat), 0, (int)getpid()) != -1) { | * Determine the tty from psdev in struct pst_status. |
| | * We may get EOVERFLOW if the whole thing doesn't fit but that is OK. |
| | */ |
| | rc = pstat_getproc(&pstat, sizeof(pstat), (size_t)0, (int)getpid()); |
| | if (rc != -1 || errno == EOVERFLOW) { |
| if (pstat.pst_term.psd_major != -1 && pstat.pst_term.psd_minor != -1) { |
if (pstat.pst_term.psd_major != -1 && pstat.pst_term.psd_minor != -1) { |
| tty = sudo_ttyname_dev(makedev(pstat.pst_term.psd_major, |
tty = sudo_ttyname_dev(makedev(pstat.pst_term.psd_major, |
| pstat.pst_term.psd_minor)); |
pstat.pst_term.psd_minor)); |