Add support for ut_exit

This commit is contained in:
Todd C. Miller
2011-03-15 16:18:33 -04:00
parent 3506f01077
commit 2041d39db7
6 changed files with 44 additions and 7 deletions

View File

@@ -493,6 +493,9 @@
/* Define to 1 if the system has the type `struct in6_addr'. */ /* Define to 1 if the system has the type `struct in6_addr'. */
#undef HAVE_STRUCT_IN6_ADDR #undef HAVE_STRUCT_IN6_ADDR
/* Define to 1 if `ut_exit' is a member of `struct utmpx'. */
#undef HAVE_STRUCT_UTMPX_UT_EXIT
/* Define to 1 if `ut_id' is a member of `struct utmpx'. */ /* Define to 1 if `ut_id' is a member of `struct utmpx'. */
#undef HAVE_STRUCT_UTMPX_UT_ID #undef HAVE_STRUCT_UTMPX_UT_ID
@@ -505,6 +508,9 @@
/* Define to 1 if `ut_type' is a member of `struct utmpx'. */ /* Define to 1 if `ut_type' is a member of `struct utmpx'. */
#undef HAVE_STRUCT_UTMPX_UT_TYPE #undef HAVE_STRUCT_UTMPX_UT_TYPE
/* Define to 1 if `ut_exit' is a member of `struct utmp'. */
#undef HAVE_STRUCT_UTMP_UT_EXIT
/* Define to 1 if `ut_id' is a member of `struct utmp'. */ /* Define to 1 if `ut_id' is a member of `struct utmp'. */
#undef HAVE_STRUCT_UTMP_UT_ID #undef HAVE_STRUCT_UTMP_UT_ID

26
configure vendored
View File

@@ -15066,6 +15066,19 @@ cat >>confdefs.h <<_ACEOF
_ACEOF _ACEOF
fi
ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_exit" "ac_cv_member_struct_utmpx_ut_exit" "
#include <sys/types.h>
#include <utmpx.h>
"
if test "x$ac_cv_member_struct_utmpx_ut_exit" = x""yes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_UTMPX_UT_EXIT 1
_ACEOF
fi fi
ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_pid" "ac_cv_member_struct_utmpx_ut_pid" " ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_pid" "ac_cv_member_struct_utmpx_ut_pid" "
#include <sys/types.h> #include <sys/types.h>
@@ -15120,6 +15133,19 @@ cat >>confdefs.h <<_ACEOF
_ACEOF _ACEOF
fi
ac_fn_c_check_member "$LINENO" "struct utmp" "ut_exit" "ac_cv_member_struct_utmp_ut_exit" "
#include <sys/types.h>
#include <utmp.h>
"
if test "x$ac_cv_member_struct_utmp_ut_exit" = x""yes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_UTMP_UT_EXIT 1
_ACEOF
fi fi
ac_fn_c_check_member "$LINENO" "struct utmp" "ut_pid" "ac_cv_member_struct_utmp_ut_pid" " ac_fn_c_check_member "$LINENO" "struct utmp" "ut_pid" "ac_cv_member_struct_utmp_ut_pid" "
#include <sys/types.h> #include <sys/types.h>

View File

@@ -1970,12 +1970,12 @@ dnl
dnl Check for utmp/utmpx struct members. dnl Check for utmp/utmpx struct members.
dnl dnl
if test $ac_cv_header_utmpx_h = "yes"; then if test $ac_cv_header_utmpx_h = "yes"; then
AC_CHECK_MEMBERS([struct utmpx.ut_id, struct utmpx.ut_pid, struct utmpx.ut_tv, struct utmpx.ut_type], [], [], [ AC_CHECK_MEMBERS([struct utmpx.ut_id, struct utmpx.ut_exit, struct utmpx.ut_pid, struct utmpx.ut_tv, struct utmpx.ut_type], [], [], [
#include <sys/types.h> #include <sys/types.h>
#include <utmpx.h> #include <utmpx.h>
]) ])
else else
AC_CHECK_MEMBERS([struct utmp.ut_id, struct utmp.ut_pid, struct utmp.ut_tv, struct utmp.ut_type, struct utmp.ut_user], [], [], [ AC_CHECK_MEMBERS([struct utmp.ut_id, struct utmp.ut_exit, struct utmp.ut_pid, struct utmp.ut_tv, struct utmp.ut_type, struct utmp.ut_user], [], [], [
#include <sys/types.h> #include <sys/types.h>
#include <utmp.h> #include <utmp.h>
]) ])

View File

@@ -118,7 +118,7 @@ cleanup(int gotsignal)
#ifdef HAVE_SELINUX #ifdef HAVE_SELINUX
selinux_restore_tty(); selinux_restore_tty();
#endif #endif
utmp_logout(slavename); /* XXX - only if CD_SET_UTMP */ utmp_logout(slavename, 0); /* XXX - only if CD_SET_UTMP */
} }
/* /*
@@ -655,7 +655,7 @@ pty_close(struct command_status *cstat)
} }
} }
} }
utmp_logout(slavename); /* XXX - only if CD_SET_UTMP */ utmp_logout(slavename, cstat->type == CMD_WSTATUS ? cstat->val : 0); /* XXX - only if CD_SET_UTMP */
} }
/* /*

View File

@@ -45,6 +45,6 @@ extern int signal_pipe[2];
/* utmp.c */ /* utmp.c */
int utmp_login(const char *from_line, const char *to_line, int ttyfd, int utmp_login(const char *from_line, const char *to_line, int ttyfd,
const char *user); const char *user);
int utmp_logout(const char *line); int utmp_logout(const char *line, int status);
#endif /* _SUDO_EXEC_H */ #endif /* _SUDO_EXEC_H */

View File

@@ -19,6 +19,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/wait.h>
#include <stdio.h> #include <stdio.h>
#ifdef STDC_HEADERS #ifdef STDC_HEADERS
# include <stdlib.h> # include <stdlib.h>
@@ -190,7 +191,7 @@ utmp_login(const char *from_line, const char *to_line, int ttyfd,
} }
int int
utmp_logout(const char *line) utmp_logout(const char *line, int status)
{ {
int rval = FALSE; int rval = FALSE;
sudo_utmp_t *ut, utbuf; sudo_utmp_t *ut, utbuf;
@@ -205,6 +206,10 @@ utmp_logout(const char *line)
memset(ut->ut_user, 0, sizeof(ut->ut_user)); memset(ut->ut_user, 0, sizeof(ut->ut_user));
# if defined(HAVE_STRUCT_UTMPX_UT_TYPE) || defined(HAVE_STRUCT_UTMP_UT_TYPE) # if defined(HAVE_STRUCT_UTMPX_UT_TYPE) || defined(HAVE_STRUCT_UTMP_UT_TYPE)
ut->ut_type = DEAD_PROCESS; ut->ut_type = DEAD_PROCESS;
# endif
# if defined(HAVE_STRUCT_UTMPX_UT_EXIT) || defined(HAVE_STRUCT_UTMP_UT_EXIT)
ut->ut_exit.e_exit = WEXITSTATUS(status);
ut->ut_exit.e_termination = WIFEXITED(status) ? WEXITSTATUS(status) : 0;
# endif # endif
utmp_settime(ut); utmp_settime(ut);
if (pututxline(ut) != NULL) if (pututxline(ut) != NULL)
@@ -308,7 +313,7 @@ done:
} }
int int
utmp_logout(const char *line) utmp_logout(const char *line, int status)
{ {
sudo_utmp_t utbuf; sudo_utmp_t utbuf;
int rval = FALSE; int rval = FALSE;