This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
[PATCH] ppc64 utmp
- From: Steve Munroe <sjmunroe at vnet dot ibm dot com>
- To: libc-alpha at sources dot redhat dot com
- Date: Mon, 30 Sep 2002 17:36:37 -0500
- Subject: [PATCH] ppc64 utmp
Ensure that the structs utmp and utmpx are the same size in 32-/64-bit.
Allows both 32- and 64-bit apps to read/write /var/run/utmp.
We (the powerpc64 team) have made the explicit decision that __time_t
(and __suseconds_t) will be a 64-bits (long int) for the kernel and 64-bit
applications. This is a good decision for the future but can cause
problems when 32- and 64-bit application share time_t values in shared
memory or files.
This is the case for /var/run/utmp where utilities that write these
files are currently 32-bit, but 64-bit applications that calls getlogin
attempt to read this file. The solution defines the anonymous struct field
ut_tv (with 32-bit fields tv_sec and tv_usec) within struct utmp and utmpx
(when [__WORDSIZE == 64]). This makes ut_tv (and utmp) consistent between
32- and 64-bit powerpc applications.
There is also a problem with field ut_session (long int) within the utmp
and utmpx structs which changes size between 32-and 64-bit. So changed
the type of ut_session to __int32_t.
We (powerpc) must have our own version of the these header files to
enforce the new definitions, while maintaining compatibility with exiting
powepc32 applications. Copied types.h and time.h from
./sysdeps/unix/sysv/linux/bits/ into ./sysdeps/unix/sysv/linux/powerpc/bits.
Then copied utmp.h and utmpx.h from ./sysdeps/gnu/bits/ into
./sysdeps/unix/sysv/linux/powerpc/bits/. Then changed/added definitions as
described above.
Finally with these changes PowerPC64 applications can call getlogin and
get the correct result. However there is one final problem with
login/programs/utmpdump.c(print_entry) which generates the following
compiler warnings:
programs/utmpdump.c: In function `print_entry':
programs/utmpdump.c:67: warning: passing arg 1 of `ctime' from incompatible pointer type
programs/utmpdump.c:72: warning: long int format, different type arg (arg 9)
In this case print_entry is passing &up->ut_tv.tv_sec (an __int32_t) to the
ctime functions (expecting a long). Also &up->ut_tv.tv_usec (an __int32_t)
is passed to printf with a format of "%ld".
The solution is to declare a struct timeval temp_tv and copy the tv_sec
and tv_usec fields to the structure first. This is 32-/64-bit agnostic
but will expand the __int32_t to longs if required to 64-bit. The temp_tv
fields can be safely passed to ctime and printf on any platform.
2002-09-30 Steven Munroe <sjmunroe@us.ibm.com>
* login/programs/utmpdump.c(print_entry): Copy up->ut_tv fields
to struct timeval temp_tv before printing to be 32-/64-bit agnostic.
* sysdeps/unix/sysv/linux/powerpc/bits/utmp.h: New file.
* sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h New file.
>>>>>>> ppc64-utmp-20020923.patch
diff -rupPN -xCVS -x*orig -xmanual libc23-cvstip-20020923/login/programs/utmpdump.c libc23-ppc64-stat/login/programs/utmpdump.c
--- libc23-cvstip-20020923/login/programs/utmpdump.c Fri Sep 20 15:01:41 2002
+++ libc23-ppc64-stat/login/programs/utmpdump.c Tue Sep 24 09:52:42 2002
@@ -27,6 +27,17 @@
static void
print_entry (struct utmp *up)
{
+/* Mixed 32-/64-bit systems may have timeval structs of different sixe
+ but need struct utmp to be the same size. So in 64-bit up->ut_tv may
+ not be a timeval but a struct of __int32_t's. This would cause a compile
+ time warning and a formating error when 32-bit int is passed where
+ a 64-bit long is expected. So copy up->up_tv to a temporary timeval.
+ This is 32-/64-bit agnostic and expands the timeval fields to the
+ expected size as needed. */
+ struct timeval temp_tv;
+ temp_tv.tv_sec = up->ut_tv.tv_sec;
+ temp_tv.tv_usec = up->ut_tv.tv_usec;
+
(printf) (
/* The format string. */
#if _HAVE_UT_TYPE
@@ -62,8 +73,8 @@ print_entry (struct utmp *up)
, up->ut_host
#endif
#if _HAVE_UT_TV
- , 4 + ctime (&up->ut_tv.tv_sec)
- , up->ut_tv.tv_usec
+ , 4 + ctime (&temp_tv.tv_sec)
+ , temp_tv.tv_usec
#else
, 4 + ctime (&up->ut_time)
#endif
diff -rupPN -xCVS -x*orig -xmanual libc23-cvstip-20020923/sysdeps/unix/sysv/linux/powerpc/bits/utmp.h libc23-ppc64-stat/sysdeps/unix/sysv/linux/powerpc/bits/utmp.h
--- libc23-cvstip-20020923/sysdeps/unix/sysv/linux/powerpc/bits/utmp.h Wed Dec 31 18:00:00 1969
+++ libc23-ppc64-stat/sysdeps/unix/sysv/linux/powerpc/bits/utmp.h Mon Sep 30 13:41:28 2002
@@ -0,0 +1,120 @@
+/* The `struct utmp' type, describing entries in the utmp file. GNU version.
+ Copyright (C) 1993, 1996, 1997, 1998, 1999, 2002
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _UTMP_H
+# error "Never include <bits/utmp.h> directly; use <utmp.h> instead."
+#endif
+
+#include <paths.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+
+#define UT_LINESIZE 32
+#define UT_NAMESIZE 32
+#define UT_HOSTSIZE 256
+
+
+/* The structure describing an entry in the database of
+ previous logins. */
+struct lastlog
+ {
+ __time_t ll_time;
+ char ll_line[UT_LINESIZE];
+ char ll_host[UT_HOSTSIZE];
+ };
+
+
+/* The structure describing the status of a terminated process. This
+ type is used in `struct utmp' below. */
+struct exit_status
+ {
+ short int e_termination; /* Process termination status. */
+ short int e_exit; /* Process exit status. */
+ };
+
+
+/* The structure describing an entry in the user accounting database. */
+struct utmp
+{
+ short int ut_type; /* Type of login. */
+ pid_t ut_pid; /* Process ID of login process. */
+ char ut_line[UT_LINESIZE]; /* Devicename. */
+ char ut_id[4]; /* Inittab ID. */
+ char ut_user[UT_NAMESIZE]; /* Username. */
+ char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */
+ struct exit_status ut_exit; /* Exit status of a process marked
+ as DEAD_PROCESS. */
+
+/* The fields ut_session and ut_tv must be the same size when compiled
+ 32- and 64-bit. This allows files and shared memory to be shared
+ between 32/64bit applications. For example /var/run/utmp. */
+ __int32_t ut_session; /* Session ID, used for windowing. */
+#if __WORDSIZE == 64
+ struct
+ {
+ __int32_t tv_sec; /* Seconds. */
+ __int32_t tv_usec; /* Microseconds. */
+ } ut_tv; /* Time entry was made. */
+#else
+ struct timeval ut_tv; /* Time entry was made. */
+#endif
+
+ int32_t ut_addr_v6[4]; /* Internet address of remote host. */
+ char __unused[20]; /* Reserved for future use. */
+};
+
+/* Backwards compatibility hacks. */
+#define ut_name ut_user
+#ifndef _NO_UT_TIME
+/* We have a problem here: `ut_time' is also used otherwise. Define
+ _NO_UT_TIME if the compiler complains. */
+# define ut_time ut_tv.tv_sec
+#endif
+#define ut_xtime ut_tv.tv_sec
+#define ut_addr ut_addr_v6[0]
+
+
+/* Values for the `ut_type' field of a `struct utmp'. */
+#define EMPTY 0 /* No valid user accounting information. */
+
+#define RUN_LVL 1 /* The system's runlevel. */
+#define BOOT_TIME 2 /* Time of system boot. */
+#define NEW_TIME 3 /* Time after system clock changed. */
+#define OLD_TIME 4 /* Time when system clock changed. */
+
+#define INIT_PROCESS 5 /* Process spawned by the init process. */
+#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */
+#define USER_PROCESS 7 /* Normal process. */
+#define DEAD_PROCESS 8 /* Terminated process. */
+
+#define ACCOUNTING 9
+
+/* Old Linux name for the EMPTY type. */
+#define UT_UNKNOWN EMPTY
+
+
+/* Tell the user that we have a modern system with UT_HOST, UT_PID,
+ UT_TYPE, UT_ID and UT_TV fields. */
+#define _HAVE_UT_TYPE 1
+#define _HAVE_UT_PID 1
+#define _HAVE_UT_ID 1
+#define _HAVE_UT_TV 1
+#define _HAVE_UT_HOST 1
diff -rupPN -xCVS -x*orig -xmanual libc23-cvstip-20020923/sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h libc23-ppc64-stat/sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h
--- libc23-cvstip-20020923/sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h Wed Dec 31 18:00:00 1969
+++ libc23-ppc64-stat/sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h Mon Sep 30 13:34:32 2002
@@ -0,0 +1,101 @@
+/* Structures and definitions for the user accounting database. GNU version.
+ Copyright (C) 1997, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _UTMPX_H
+# error "Never include <bits/utmpx.h> directly; use <utmpx.h> instead."
+#endif
+
+#include <bits/types.h>
+#include <sys/time.h>
+
+
+#ifdef __USE_GNU
+# include <paths.h>
+# define _PATH_UTMPX _PATH_UTMP
+# define _PATH_WTMPX _PATH_WTMP
+#endif
+
+
+#define __UT_LINESIZE 32
+#define __UT_NAMESIZE 32
+#define __UT_HOSTSIZE 256
+
+
+/* The structure describing the status of a terminated process. This
+ type is used in `struct utmpx' below. */
+struct __exit_status
+ {
+#ifdef __USE_GNU
+ short int e_termination; /* Process termination status. */
+ short int e_exit; /* Process exit status. */
+#else
+ short int __e_termination; /* Process termination status. */
+ short int __e_exit; /* Process exit status. */
+#endif
+ };
+
+
+/* The structure describing an entry in the user accounting database. */
+struct utmpx
+{
+ short int ut_type; /* Type of login. */
+ __pid_t ut_pid; /* Process ID of login process. */
+ char ut_line[__UT_LINESIZE]; /* Devicename. */
+ char ut_id[4]; /* Inittab ID. */
+ char ut_user[__UT_NAMESIZE]; /* Username. */
+ char ut_host[__UT_HOSTSIZE]; /* Hostname for remote login. */
+ struct __exit_status ut_exit; /* Exit status of a process marked
+ as DEAD_PROCESS. */
+
+/* The fields ut_session and ut_tv must be the same size when compiled
+ 32- and 64-bit. This allows files and shared memory to be shared
+ between 32/64bit applications. */
+ __int32_t ut_session; /* Session ID, used for windowing. */
+#if __WORDSIZE == 64
+ struct
+ {
+ __int32_t tv_sec; /* Seconds. */
+ __int32_t tv_usec; /* Microseconds. */
+ } ut_tv; /* Time entry was made. */
+#else
+ struct timeval ut_tv; /* Time entry was made. */
+#endif
+ __int32_t ut_addr_v6[4]; /* Internet address of remote host. */
+ char __unused[20]; /* Reserved for future use. */
+};
+
+
+/* Values for the `ut_type' field of a `struct utmpx'. */
+#define EMPTY 0 /* No valid user accounting information. */
+
+#ifdef __USE_GNU
+# define RUN_LVL 1 /* The system's runlevel. */
+#endif
+#define BOOT_TIME 2 /* Time of system boot. */
+#define NEW_TIME 3 /* Time after system clock changed. */
+#define OLD_TIME 4 /* Time when system clock changed. */
+
+#define INIT_PROCESS 5 /* Process spawned by the init process. */
+#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */
+#define USER_PROCESS 7 /* Normal process. */
+#define DEAD_PROCESS 8 /* Terminated process. */
+
+#ifdef __USE_GNU
+# define ACCOUNTING 9 /* System accounting. */
+#endif
<<<<<<< ppc64-utmp-20020923.patch