You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
658 lines
19 KiB
658 lines
19 KiB
+--------------------------------------------------------------------------- |
|
| Security Bugfix |
|
| http://www.securityfocus.com/archive/1/345844/2003-11-24/2003-11-30/0 |
|
+--------------------------------------------------------------------------- |
|
Index: ansi.c |
|
--- ansi.c.orig 2003-12-05 14:57:05 +0100 |
|
+++ ansi.c 2006-07-13 17:08:06 +0200 |
|
@@ -559,7 +559,7 @@ |
|
{ |
|
case '0': case '1': case '2': case '3': case '4': |
|
case '5': case '6': case '7': case '8': case '9': |
|
- if (curr->w_NumArgs < MAXARGS) |
|
+ if (curr->w_NumArgs >= 0 && curr->w_NumArgs < MAXARGS) |
|
{ |
|
if (curr->w_args[curr->w_NumArgs] < 100000000) |
|
curr->w_args[curr->w_NumArgs] = |
|
Index: resize.c |
|
--- resize.c.orig 2003-09-08 16:26:31 +0200 |
|
+++ resize.c 2006-07-13 17:08:06 +0200 |
|
@@ -682,6 +682,17 @@ |
|
if (wi == 0) |
|
he = hi = 0; |
|
|
|
+ if (wi > 1000) |
|
+ { |
|
+ Msg(0, "Window width too large, truncated"); |
|
+ wi = 1000; |
|
+ } |
|
+ if (he > 1000) |
|
+ { |
|
+ Msg(0, "Window height too large, truncated"); |
|
+ he = 1000; |
|
+ } |
|
+ |
|
if (p->w_width == wi && p->w_height == he && p->w_histheight == hi) |
|
{ |
|
debug("ChangeWindowSize: No change.\n"); |
|
|
|
+--------------------------------------------------------------------------- |
|
| In Solaris 10, the setenv() function has been added. |
|
+--------------------------------------------------------------------------- |
|
Index: misc.c |
|
--- misc.c.orig 2003-12-05 14:45:41 +0100 |
|
+++ misc.c 2006-07-13 18:00:46 +0200 |
|
@@ -613,7 +613,7 @@ |
|
*/ |
|
# endif /* NEEDSETENV */ |
|
#else /* USESETENV */ |
|
-# if defined(linux) || defined(__convex__) || (BSD >= 199103) |
|
+# if defined(linux) || defined(__convex__) || (BSD >= 199103) || defined(__sun) |
|
setenv(var, value, 1); |
|
# else |
|
setenv(var, value); |
|
|
|
+--------------------------------------------------------------------------- |
|
| Mainly NetBSD specific patches taken from pkgsrc, partly relevant to |
|
| FreeBSD and Solaris as well |
|
+--------------------------------------------------------------------------- |
|
Index: config.h.in |
|
--- config.h.in.orig 2003-12-05 14:59:39 +0100 |
|
+++ config.h.in 2006-07-13 17:42:35 +0200 |
|
@@ -431,6 +431,11 @@ |
|
#undef HAVE_DIRENT_H |
|
|
|
/* |
|
+ * Define HAVE_SYS_STROPTS_H if your system has <sys/stropts.h> |
|
+ */ |
|
+#undef HAVE_SYS_STROPTS_H |
|
+ |
|
+/* |
|
* If your system has getutent(), pututline(), etc. to write to the |
|
* utmp file, define GETUTENT. |
|
*/ |
|
@@ -514,6 +519,15 @@ |
|
*/ |
|
#undef USEVARARGS |
|
|
|
+#ifdef __NetBSD__ |
|
+/* |
|
+ * XXX gcc 3.3 on some NetBSD platforms fails the configure test for this |
|
+ * so force it on anyway. |
|
+ */ |
|
+#undef USEVARARGS |
|
+#define USEVARARGS 1 |
|
+#endif |
|
+ |
|
/* |
|
* If your system has strerror() define this. |
|
*/ |
|
Index: configure |
|
--- configure.orig 2003-12-05 14:46:53 +0100 |
|
+++ configure 2006-07-13 17:54:05 +0200 |
|
@@ -3911,7 +3911,7 @@ |
|
cat confdefs.h >>conftest.$ac_ext |
|
cat >>conftest.$ac_ext <<_ACEOF |
|
/* end confdefs.h. */ |
|
-#if defined(SVR4) && defined(sun) |
|
+#if defined(__SVR4) && defined(__sun) |
|
yes |
|
#endif |
|
|
|
@@ -4042,7 +4042,7 @@ |
|
main () |
|
{ |
|
|
|
-#if defined(linux) || defined(NeXT) || defined(_AUX_SOURCE) || defined(AUX) || defined(ultrix) || (defined(sun) && defined(SVR4)) || defined(ISC) || defined(sony_news) |
|
+#if defined(linux) || defined(NeXT) || defined(_AUX_SOURCE) || defined(AUX) || defined(ultrix) || (defined(__sun) && defined(__SVR4)) || defined(ISC) || defined(sony_news) |
|
seteuid_is_broken(0); |
|
#else |
|
seteuid(0); |
|
@@ -5572,9 +5572,15 @@ |
|
|
|
#include <time.h> /* to get time_t on SCO */ |
|
#include <sys/types.h> |
|
-#if defined(SVR4) && !defined(DGUX) |
|
+#include <sys/param.h> |
|
+#if defined(__SVR4) && !defined(DGUX) \ |
|
+ || (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106050000)) |
|
#include <utmpx.h> |
|
#define utmp utmpx |
|
+# ifdef __NetBSD__ |
|
+# define pututline pututxline |
|
+# define getutent getutxent |
|
+# endif |
|
#else |
|
#include <utmp.h> |
|
#endif |
|
@@ -5624,7 +5630,7 @@ |
|
|
|
#include <time.h> |
|
#include <sys/types.h> |
|
-#if defined(SVR4) && !defined(DGUX) |
|
+#if defined(__SVR4) && !defined(DGUX) |
|
#include <utmpx.h> |
|
#define utmp utmpx |
|
#else |
|
@@ -5680,7 +5686,7 @@ |
|
|
|
#include <time.h> |
|
#include <sys/types.h> |
|
-#if defined(SVR4) && !defined(DGUX) |
|
+#if defined(__SVR4) && !defined(DGUX) |
|
#include <utmpx.h> |
|
#define utmp utmpx |
|
#else |
|
@@ -6316,7 +6322,7 @@ |
|
|
|
_CUT_HERE_ |
|
|
|
-#if !defined(LOADAV_GETLOADAVG) && ((defined(hp300) && !defined(__hpux)) || defined(sun) || (defined(ultrix) && defined(mips)) || defined(_SEQUENT_) || defined(sgi) || (defined(SVR4) && !defined(__hpux)) || defined(sony_news) || (!defined(__osf__) && defined(__alpha)) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX) || defined(m88k)) |
|
+#if !defined(LOADAV_GETLOADAVG) && ((defined(hp300) && !defined(__hpux)) || defined(__sun) || (defined(ultrix) && defined(mips)) || defined(_SEQUENT_) || defined(sgi) || (defined(__SVR4) && !defined(__hpux)) || defined(sony_news) || (!defined(__osf__) && defined(__alpha)) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX) || defined(m88k)) |
|
loadtype=long |
|
# if defined(apollo) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX) |
|
loadscale=65536 |
|
@@ -6329,7 +6335,7 @@ |
|
loadtype=int |
|
loadscale=1024 |
|
# else |
|
-# if defined(MIPS) || defined(SVR4) || defined(m88k) |
|
+# if defined(MIPS) || defined(__SVR4) || defined(m88k) |
|
loadscale=256 |
|
# else /* not MIPS */ |
|
loadscale=1000 /* our default value */ |
|
@@ -7501,6 +7507,147 @@ |
|
|
|
fi |
|
|
|
+for ac_header in sys/stropts.h |
|
+do |
|
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` |
|
+if eval "test \"\${$as_ac_Header+set}\" = set"; then |
|
+ echo "$as_me:$LINENO: checking for $ac_header" >&5 |
|
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 |
|
+if eval "test \"\${$as_ac_Header+set}\" = set"; then |
|
+ echo $ECHO_N "(cached) $ECHO_C" >&6 |
|
+fi |
|
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 |
|
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 |
|
+else |
|
+ # Is the header compilable? |
|
+echo "$as_me:$LINENO: checking $ac_header usability" >&5 |
|
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 |
|
+cat >conftest.$ac_ext <<_ACEOF |
|
+#line $LINENO "configure" |
|
+/* confdefs.h. */ |
|
+_ACEOF |
|
+cat confdefs.h >>conftest.$ac_ext |
|
+cat >>conftest.$ac_ext <<_ACEOF |
|
+/* end confdefs.h. */ |
|
+$ac_includes_default |
|
+#include <$ac_header> |
|
+_ACEOF |
|
+rm -f conftest.$ac_objext |
|
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 |
|
+ (eval $ac_compile) 2>&5 |
|
+ ac_status=$? |
|
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 |
|
+ (exit $ac_status); } && |
|
+ { ac_try='test -s conftest.$ac_objext' |
|
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 |
|
+ (eval $ac_try) 2>&5 |
|
+ ac_status=$? |
|
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 |
|
+ (exit $ac_status); }; }; then |
|
+ ac_header_compiler=yes |
|
+else |
|
+ echo "$as_me: failed program was:" >&5 |
|
+sed 's/^/| /' conftest.$ac_ext >&5 |
|
+ |
|
+ac_header_compiler=no |
|
+fi |
|
+rm -f conftest.$ac_objext conftest.$ac_ext |
|
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 |
|
+echo "${ECHO_T}$ac_header_compiler" >&6 |
|
+ |
|
+# Is the header present? |
|
+echo "$as_me:$LINENO: checking $ac_header presence" >&5 |
|
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 |
|
+cat >conftest.$ac_ext <<_ACEOF |
|
+#line $LINENO "configure" |
|
+/* confdefs.h. */ |
|
+_ACEOF |
|
+cat confdefs.h >>conftest.$ac_ext |
|
+cat >>conftest.$ac_ext <<_ACEOF |
|
+/* end confdefs.h. */ |
|
+#include <$ac_header> |
|
+_ACEOF |
|
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 |
|
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 |
|
+ ac_status=$? |
|
+ grep -v '^ *+' conftest.er1 >conftest.err |
|
+ rm -f conftest.er1 |
|
+ cat conftest.err >&5 |
|
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 |
|
+ (exit $ac_status); } >/dev/null; then |
|
+ if test -s conftest.err; then |
|
+ ac_cpp_err=$ac_c_preproc_warn_flag |
|
+ else |
|
+ ac_cpp_err= |
|
+ fi |
|
+else |
|
+ ac_cpp_err=yes |
|
+fi |
|
+if test -z "$ac_cpp_err"; then |
|
+ ac_header_preproc=yes |
|
+else |
|
+ echo "$as_me: failed program was:" >&5 |
|
+sed 's/^/| /' conftest.$ac_ext >&5 |
|
+ |
|
+ ac_header_preproc=no |
|
+fi |
|
+rm -f conftest.err conftest.$ac_ext |
|
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 |
|
+echo "${ECHO_T}$ac_header_preproc" >&6 |
|
+ |
|
+# So? What about this header? |
|
+case $ac_header_compiler:$ac_header_preproc in |
|
+ yes:no ) |
|
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 |
|
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} |
|
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 |
|
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} |
|
+ ( |
|
+ cat <<\_ASBOX |
|
+## ------------------------------------ ## |
|
+## Report this to bug-autoconf@gnu.org. ## |
|
+## ------------------------------------ ## |
|
+_ASBOX |
|
+ ) | |
|
+ sed "s/^/$as_me: WARNING: /" >&2 |
|
+ ;; |
|
+ no:yes ) |
|
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 |
|
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} |
|
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 |
|
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} |
|
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 |
|
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} |
|
+ ( |
|
+ cat <<\_ASBOX |
|
+## ------------------------------------ ## |
|
+## Report this to bug-autoconf@gnu.org. ## |
|
+## ------------------------------------ ## |
|
+_ASBOX |
|
+ ) | |
|
+ sed "s/^/$as_me: WARNING: /" >&2 |
|
+ ;; |
|
+esac |
|
+echo "$as_me:$LINENO: checking for $ac_header" >&5 |
|
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 |
|
+if eval "test \"\${$as_ac_Header+set}\" = set"; then |
|
+ echo $ECHO_N "(cached) $ECHO_C" >&6 |
|
+else |
|
+ eval "$as_ac_Header=$ac_header_preproc" |
|
+fi |
|
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 |
|
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 |
|
+ |
|
+fi |
|
+if test `eval echo '${'$as_ac_Header'}'` = yes; then |
|
+ cat >>confdefs.h <<_ACEOF |
|
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 |
|
+_ACEOF |
|
+ |
|
+fi |
|
+ |
|
+done |
|
+ |
|
|
|
echo "$as_me:$LINENO: checking for setenv" >&5 |
|
echo $ECHO_N "checking for setenv... $ECHO_C" >&6 |
|
Index: configure.in |
|
--- configure.in.orig 2003-06-03 13:58:24 +0200 |
|
+++ configure.in 2006-07-13 17:50:35 +0200 |
|
@@ -206,7 +206,7 @@ |
|
|
|
AC_CHECKING(for Solaris 2.x) |
|
AC_EGREP_CPP(yes, |
|
-[#if defined(SVR4) && defined(sun) |
|
+[#if defined(__SVR4) && defined(__sun) |
|
yes |
|
#endif |
|
], LIBS="$LIBS -lsocket -lnsl -lkstat") |
|
@@ -270,7 +270,7 @@ |
|
dnl multiuser screen sessions |
|
AC_CHECKING(seteuid) |
|
AC_TRY_LINK(,[ |
|
-#if defined(linux) || defined(NeXT) || defined(_AUX_SOURCE) || defined(AUX) || defined(ultrix) || (defined(sun) && defined(SVR4)) || defined(ISC) || defined(sony_news) |
|
+#if defined(linux) || defined(NeXT) || defined(_AUX_SOURCE) || defined(AUX) || defined(ultrix) || (defined(__sun) && defined(__SVR4)) || defined(ISC) || defined(sony_news) |
|
seteuid_is_broken(0); |
|
#else |
|
seteuid(0); |
|
@@ -815,9 +815,15 @@ |
|
AC_TRY_LINK([ |
|
#include <time.h> /* to get time_t on SCO */ |
|
#include <sys/types.h> |
|
-#if defined(SVR4) && !defined(DGUX) |
|
+#include <sys/param.h> |
|
+#if defined(__SVR4) && !defined(DGUX) \ |
|
+ || (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106050000)) |
|
#include <utmpx.h> |
|
#define utmp utmpx |
|
+# ifdef __NetBSD__ |
|
+# define pututline pututxline |
|
+# define getutent getutxent |
|
+# endif |
|
#else |
|
#include <utmp.h> |
|
#endif |
|
@@ -832,7 +838,7 @@ |
|
AC_TRY_LINK([ |
|
#include <time.h> |
|
#include <sys/types.h> |
|
-#if defined(SVR4) && !defined(DGUX) |
|
+#if defined(__SVR4) && !defined(DGUX) |
|
#include <utmpx.h> |
|
#define utmp utmpx |
|
#else |
|
@@ -848,7 +854,7 @@ |
|
AC_TRY_COMPILE([ |
|
#include <time.h> |
|
#include <sys/types.h> |
|
-#if defined(SVR4) && !defined(DGUX) |
|
+#if defined(__SVR4) && !defined(DGUX) |
|
#include <utmpx.h> |
|
#define utmp utmpx |
|
#else |
|
@@ -979,7 +985,7 @@ |
|
#include <sys/types.h> |
|
#include <sys/param.h> |
|
],[ |
|
-#if !defined(LOADAV_GETLOADAVG) && ((defined(hp300) && !defined(__hpux)) || defined(sun) || (defined(ultrix) && defined(mips)) || defined(_SEQUENT_) || defined(sgi) || (defined(SVR4) && !defined(__hpux)) || defined(sony_news) || (!defined(__osf__) && defined(__alpha)) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX) || defined(m88k)) |
|
+#if !defined(LOADAV_GETLOADAVG) && ((defined(hp300) && !defined(__hpux)) || defined(__sun) || (defined(ultrix) && defined(mips)) || defined(_SEQUENT_) || defined(sgi) || (defined(__SVR4) && !defined(__hpux)) || defined(sony_news) || (!defined(__osf__) && defined(__alpha)) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX) || defined(m88k)) |
|
loadtype=long |
|
# if defined(apollo) || defined(_IBMR2) || defined(_AUX_SOURCE) || defined(AUX) |
|
loadscale=65536 |
|
@@ -992,7 +998,7 @@ |
|
loadtype=int |
|
loadscale=1024 |
|
# else |
|
-# if defined(MIPS) || defined(SVR4) || defined(m88k) |
|
+# if defined(MIPS) || defined(__SVR4) || defined(m88k) |
|
loadscale=256 |
|
# else /* not MIPS */ |
|
loadscale=1000 /* our default value */ |
|
@@ -1209,6 +1215,7 @@ |
|
AC_TRY_LINK(,[vsprintf(0,0,0);], AC_MSG_RESULT(yes);AC_DEFINE(USEVARARGS), AC_MSG_RESULT(no)) |
|
|
|
AC_HEADER_DIRENT |
|
+AC_CHECK_HEADERS(sys/stropts.h) |
|
|
|
AC_MSG_CHECKING(for setenv) |
|
AC_TRY_LINK(,[setenv((char *)0,(char *)0);unsetenv((char *)0);], AC_MSG_RESULT(yes);AC_DEFINE(USESETENV), |
|
Index: os.h |
|
--- os.h.orig 2002-01-08 16:42:33 +0100 |
|
+++ os.h 2006-07-13 17:37:58 +0200 |
|
@@ -25,6 +25,7 @@ |
|
#include <stdio.h> |
|
#include <errno.h> |
|
|
|
+#include <string.h> |
|
#include <sys/param.h> |
|
|
|
/* In strict ANSI mode, HP-UX machines define __hpux but not hpux */ |
|
@@ -161,7 +162,7 @@ |
|
# define setregid(rgid, egid) setresgid(rgid, egid, -1) |
|
#endif |
|
|
|
-#if defined(HAVE_SETEUID) || defined(HAVE_SETREUID) |
|
+#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && __FreeBSD_version < 500000 |
|
# define USE_SETEUID |
|
#endif |
|
|
|
@@ -260,9 +261,15 @@ |
|
#endif |
|
|
|
#if defined(UTMPOK) || defined(BUGGYGETLOGIN) |
|
-# if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux) |
|
+# if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux) \ |
|
+ || (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106050000)) |
|
# include <utmpx.h> |
|
-# define UTMPFILE UTMPX_FILE |
|
+# ifdef __NetBSD__ |
|
+# define UTMPFILE _PATH_UTMPX |
|
+# define NetBSD_UTMP |
|
+# else |
|
+# define UTMPFILE UTMPX_FILE |
|
+# endif |
|
# define utmp utmpx |
|
# define getutent getutxent |
|
# define getutid getutxid |
|
Index: process.c |
|
--- process.c.orig 2003-09-18 14:53:54 +0200 |
|
+++ process.c 2006-07-13 17:43:26 +0200 |
|
@@ -5466,7 +5466,7 @@ |
|
*buf = 0; |
|
return; |
|
} |
|
- act.nr = (int)data; |
|
+ act.nr = (int)(long)data; |
|
act.args = noargs; |
|
act.argl = 0; |
|
DoAction(&act, -1); |
|
Index: pty.c |
|
--- pty.c.orig 2003-09-08 16:26:18 +0200 |
|
+++ pty.c 2006-07-13 17:41:29 +0200 |
|
@@ -33,10 +33,12 @@ |
|
# include <sys/ioctl.h> |
|
#endif |
|
|
|
+#ifndef __FreeBSD__ |
|
/* for solaris 2.1, Unixware (SVR4.2) and possibly others */ |
|
-#ifdef HAVE_SVR4_PTYS |
|
+#ifdef HAVE_SYS_STROPTS_H |
|
# include <sys/stropts.h> |
|
#endif |
|
+#endif |
|
|
|
#if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL) |
|
# include <sys/ttold.h> |
|
@@ -332,6 +334,46 @@ |
|
|
|
/***************************************************************/ |
|
|
|
+#if defined(__NetBSD__) && !defined(PTY_DONE) |
|
+#define PTY_DONE |
|
+ |
|
+#include <sys/param.h> |
|
+#include <string.h> |
|
+ |
|
+int |
|
+OpenPTY(ttyn) |
|
+char **ttyn; |
|
+{ |
|
+ int m, s, f; |
|
+ char *t; |
|
+ |
|
+ do |
|
+ { |
|
+ if (openpty(&m, &s, TtyName, NULL, NULL) < 0) |
|
+ return -1; |
|
+ close(m); |
|
+ close(s); |
|
+ |
|
+ strcpy(PtyName, TtyName); |
|
+ t = strrchr(PtyName, '/'); |
|
+ if ((t == NULL ) || (*++t != 't')) |
|
+ return -1; |
|
+ *t = 'p'; |
|
+ |
|
+ f = open(PtyName, O_RDWR | O_NOCTTY); |
|
+ } |
|
+ while (f < 0); |
|
+ |
|
+ initmaster(f); |
|
+ *ttyn = TtyName; |
|
+ |
|
+ return f; |
|
+} |
|
+#endif |
|
+ |
|
+/***************************************************************/ |
|
+ |
|
+ |
|
#ifndef PTY_DONE |
|
int |
|
OpenPTY(ttyn) |
|
Index: utmp-netbsd.c |
|
--- utmp-netbsd.c.orig 1970-01-01 01:00:00 +0100 |
|
+++ utmp-netbsd.c 2006-07-13 17:57:44 +0200 |
|
@@ -0,0 +1,80 @@ |
|
+#include <sys/param.h> |
|
+#if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106050000) |
|
+ |
|
+#include <sys/types.h> |
|
+#include <sys/time.h> |
|
+#include <sys/wait.h> |
|
+ |
|
+#include <errno.h> |
|
+#include <fcntl.h> |
|
+#include <stdio.h> |
|
+#include <stdlib.h> |
|
+#include <string.h> |
|
+#include <time.h> |
|
+#include <ttyent.h> |
|
+#include <unistd.h> |
|
+#include <util.h> |
|
+#include <utmp.h> |
|
+ |
|
+static struct utmp saved_utmp; |
|
+static int saved_utmp_ok = 0; |
|
+ |
|
+int |
|
+lineslot(line) |
|
+char *line; |
|
+{ |
|
+ int slot; |
|
+ struct ttyent *ttyp; |
|
+ |
|
+ setttyent(); |
|
+ for (slot = 1; (ttyp = getttyent()) != NULL; ++slot) |
|
+ if (!strcmp(ttyp->ty_name, line)) { |
|
+ endttyent(); |
|
+ return(slot); |
|
+ } |
|
+ endttyent(); |
|
+ return(0); |
|
+} |
|
+ |
|
+void |
|
+utmp_login(line) |
|
+char *line; |
|
+{ |
|
+ int fd; |
|
+ int tty; |
|
+ |
|
+ if (!saved_utmp_ok) |
|
+ return; |
|
+ |
|
+ tty = lineslot(line); |
|
+ if (tty > 0 && (fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) { |
|
+ (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), SEEK_SET); |
|
+ (void)write(fd, &saved_utmp, sizeof(struct utmp)); |
|
+ (void)close(fd); |
|
+ } |
|
+} |
|
+ |
|
+void |
|
+utmp_logout(const char *line) |
|
+{ |
|
+ int fd; |
|
+ struct utmp ut; |
|
+ |
|
+ if ((fd = open(_PATH_UTMP, O_RDWR, 0)) < 0) |
|
+ return; |
|
+ while (read(fd, &ut, sizeof(ut)) == sizeof(ut)) { |
|
+ if (!ut.ut_name[0] || strncmp(ut.ut_line, line, UT_LINESIZE)) |
|
+ continue; |
|
+ memcpy(&saved_utmp, &ut, sizeof(ut)); |
|
+ saved_utmp_ok = 1; |
|
+ memset(ut.ut_name, 0, UT_NAMESIZE); |
|
+ memset(ut.ut_host, 0, UT_HOSTSIZE); |
|
+ (void)time(&ut.ut_time); |
|
+ (void)lseek(fd, -(off_t)sizeof(ut), SEEK_CUR); |
|
+ (void)write(fd, &ut, sizeof(ut)); |
|
+ } |
|
+ (void)close(fd); |
|
+} |
|
+ |
|
+#endif |
|
+ |
|
Index: utmp.c |
|
--- utmp.c.orig 2003-09-08 16:27:17 +0200 |
|
+++ utmp.c 2006-07-13 17:11:46 +0200 |
|
@@ -42,6 +42,11 @@ |
|
extern char *LoginName; |
|
extern int real_uid, eff_uid; |
|
|
|
+#ifdef NetBSD_UTMP |
|
+extern void utmp_login __P((char *)); |
|
+extern void utmp_logout __P((char *)); |
|
+#endif |
|
+ |
|
|
|
/* |
|
* UTNOKEEP: A (ugly) hack for apollo that does two things: |
|
@@ -310,6 +315,9 @@ |
|
|
|
ASSERT(display); |
|
debug("RemoveLoginSlot: removing your logintty\n"); |
|
+#ifdef NetBSD_UTMP |
|
+ utmp_logout(stripdev(D_usertty)); |
|
+#endif |
|
D_loginslot = TtyNameSlot(D_usertty); |
|
if (D_loginslot == (slot_t)0 || D_loginslot == (slot_t)-1) |
|
return; |
|
@@ -374,6 +382,9 @@ |
|
|
|
debug("RestoreLoginSlot()\n"); |
|
ASSERT(display); |
|
+#ifdef NetBSD_UTMP |
|
+ utmp_login(stripdev(D_usertty)); |
|
+#endif |
|
if (utmpok && D_loginslot != (slot_t)0 && D_loginslot != (slot_t)-1) |
|
{ |
|
debug1(" logging you in again (slot %#x)\n", (int)D_loginslot); |
|
@@ -604,6 +615,7 @@ |
|
char *line, *user; |
|
int pid; |
|
{ |
|
+ time_t temp; |
|
u->ut_type = USER_PROCESS; |
|
strncpy(u->ut_user, user, sizeof(u->ut_user)); |
|
/* Now the tricky part... guess ut_id */ |
|
@@ -618,7 +630,8 @@ |
|
#endif /* sgi */ |
|
strncpy(u->ut_line, line, sizeof(u->ut_line)); |
|
u->ut_pid = pid; |
|
- (void)time((time_t *)&u->ut_time); |
|
+ (void)time(&temp); |
|
+ u->ut_time = temp; |
|
} |
|
|
|
static slot_t |
|
@@ -726,9 +739,12 @@ |
|
char *line, *user; |
|
int pid; |
|
{ |
|
+ time_t temp; |
|
+ |
|
strncpy(u->ut_line, line, sizeof(u->ut_line)); |
|
strncpy(u->ut_name, user, sizeof(u->ut_name)); |
|
- (void)time((time_t *)&u->ut_time); |
|
+ (void)time(&temp); |
|
+ u->ut_time = temp; |
|
} |
|
|
|
static slot_t
|
|
|