]> granicus.if.org Git - sudo/commitdiff
Use pstat() on HP-UX to determine the tty device.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 1 Mar 2013 16:17:31 +0000 (11:17 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 1 Mar 2013 16:17:31 +0000 (11:17 -0500)
--HG--
branch : 1.7

config.h.in
configure
configure.in
ttyname.c

index 7ddd83257cb46d9565ecc296c4445d59d0684d71..34462cd548e2e96d8973422d081d6ef1135bcbbf 100644 (file)
 /* Define to 1 if you have the <project.h> header file. */
 #undef HAVE_PROJECT_H
 
+/* Define to 1 if you have the `pstat_getproc' function. */
+#undef HAVE_PSTAT_GETPROC
+
 /* Define to 1 if you have the <pty.h> header file. */
 #undef HAVE_PTY_H
 
index d47b32a02e2635df49ad84472a88d80366746554..4c1547222953067ec2dcd4d5b7b352a72d9f6c69 100755 (executable)
--- a/configure
+++ b/configure
@@ -14087,6 +14087,17 @@ $as_echo "$sudo_cv_var_daportable" >&6; }
                            test -z "$with_pam" && AUTH_EXCL_DEF="PAM"
                        ;;
                esac
+               for ac_func in pstat_getproc
+do :
+  ac_fn_c_check_func "$LINENO" "pstat_getproc" "ac_cv_func_pstat_getproc"
+if test "x$ac_cv_func_pstat_getproc" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PSTAT_GETPROC 1
+_ACEOF
+
+fi
+done
+
                ;;
     *-dec-osf*)
                # ignore envariables wrt dynamic lib path
index ebee280ebbf5257073d094be5ea19c379b17e3b6..d887212370b17ba76484d729ee92e072b4b89d8d 100644 (file)
@@ -1647,6 +1647,7 @@ case "$host" in
                            test -z "$with_pam" && AUTH_EXCL_DEF="PAM"
                        ;;
                esac
+               AC_CHECK_FUNCS(pstat_getproc)
                ;;
     *-dec-osf*)
                # ignore envariables wrt dynamic lib path
index fa67d39a2c55b0445e352bbdf6ddb252443d78eb..a634d302a4841d2e85715f6c166062ebce013e49 100644 (file)
--- a/ttyname.c
+++ b/ttyname.c
 #elif defined(HAVE_SYS_PROCFS_H)
 # include <sys/procfs.h>
 #endif
+#ifdef HAVE_PSTAT_GETPROC
+# include <sys/param.h>
+# include <sys/pstat.h>
+#endif
 
 #include "sudo.h"
 
@@ -334,7 +338,6 @@ sudo_ttyname_dev(rdev)
  * Return a string from ttyname() containing the tty to which the process is
  * attached or NULL if there is no tty associated with the process (or its
  * parent).  First tries sysctl using the current pid, then the parent's pid.
- * Falls back on ttyname of std{in,out,err} if that fails.
  */
 char *
 get_process_ttyname()
@@ -375,7 +378,6 @@ get_process_ttyname()
  * Return a string from ttyname() containing the tty to which the process is
  * attached or NULL if there is no tty associated with the process (or its
  * parent).  First tries /proc/pid/psinfo, then /proc/ppid/psinfo.
- * Falls back on ttyname of std{in,out,err} if that fails.
  */
 char *
 get_process_ttyname()
@@ -406,7 +408,6 @@ get_process_ttyname()
  * Return a string from ttyname() containing the tty to which the process is
  * attached or NULL if there is no tty associated with the process (or its
  * parent).  First tries field 7 in /proc/pid/stat, then /proc/ppid/stat.
- * Falls back on ttyname of std{in,out,err} if that fails.
  */
 char *
 get_process_ttyname()
@@ -446,6 +447,31 @@ get_process_ttyname()
 
     return tty;
 }
+#elif HAVE_PSTAT_GETPROC
+/*
+ * Return a string from ttyname() containing the tty to which the process is
+ * attached or NULL if there is no tty associated with the process (or its
+ * parent).
+ */
+char *
+get_process_ttyname(void)
+{
+    struct pst_status pstat;
+    char *tty = NULL;
+    int i;
+
+    /* Try to determine the tty from psdev in struct pst_status. */
+    for (i = 0; tty == NULL && i < 2; i++) {
+       const int pid = i ? (int)getppid() : (int)getpid();
+       if (pstat_getproc(&pstat, sizeof(pstat), 0, pid) != -1) {
+           if (pstat.pst_term.psd_major != -1 && pstat.pst_term.psd_minor != -1) {
+               tty = sudo_ttyname_dev(makedev(pstat.pst_term.psd_major,
+                   pstat.pst_term.psd_minor));
+           }
+       }
+    }
+    return tty;
+}
 #else
 /*
  * Return a string from ttyname() containing the tty to which the process is