This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
[PATCH] ppc64 utmp changes
- From: Steve Munroe <sjmunroe at vnet dot ibm dot com>
- To: libc-alpha at sources dot redhat dot com
- Cc: aj at suse dot de, geoffk at geoffk dot org, roland at frob dot com
- Date: Thu, 12 Sep 2002 12:07:55 -0500
- Subject: [PATCH] ppc64 utmp changes
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 time32_t and
__suseconds32_t (as __int32_t) and uses them to declare struct timeval32.
These are then used in struct utmp and utmpx when [__WORDSIZE == 64] to make
them 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-02-20 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/types.h: New file.
* sysdeps/unix/sysv/linux/powerpc/bits/time.h: New file.
* sysdeps/unix/sysv/linux/powerpc/bits/utmp.h: New file.
* sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h New file.
>>>>>>> ppc64-utmp-20020911.patch
diff -rupPN libc23-cvstip-20020906/login/programs/utmpdump.c libc23/login/programs/utmpdump.c
--- libc23-cvstip-20020906/login/programs/utmpdump.c Mon Aug 26 06:37:11 2002
+++ libc23/login/programs/utmpdump.c Thu Sep 12 10:44:21 2002
@@ -29,6 +29,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 timeval32 instead. 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
@@ -64,8 +75,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 libc23-cvstip-20020906/sysdeps/unix/sysv/linux/powerpc/bits/time.h libc23/sysdeps/unix/sysv/linux/powerpc/bits/time.h
--- libc23-cvstip-20020906/sysdeps/unix/sysv/linux/powerpc/bits/time.h Wed Dec 31 18:00:00 1969
+++ libc23/sysdeps/unix/sysv/linux/powerpc/bits/time.h Thu Sep 12 11:47:38 2002
@@ -0,0 +1,82 @@
+/* System-dependent timing definitions. Linux version.
+ Copyright (C) 1996, 1997, 1999, 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. */
+
+/*
+ * Never include this file directly; use <time.h> instead.
+ */
+
+#include <bits/wordsize.h>
+
+#ifndef __need_timeval
+# ifndef _BITS_TIME_H
+# define _BITS_TIME_H 1
+
+/* ISO/IEC 9899:1990 7.12.1: <time.h>
+ The macro `CLOCKS_PER_SEC' is the number per second of the value
+ returned by the `clock' function. */
+/* CAE XSH, Issue 4, Version 2: <time.h>
+ The value of CLOCKS_PER_SEC is required to be 1 million on all
+ XSI-conformant systems. */
+# define CLOCKS_PER_SEC 1000000l
+
+# if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K
+/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
+ presents the real value for clock ticks per second for the system. */
+# include <bits/types.h>
+extern long int __sysconf (int);
+# define CLK_TCK ((__clock_t) __sysconf (2)) /* 2 is _SC_CLK_TCK */
+# endif
+
+# ifdef __USE_POSIX199309
+/* Identifier for system-wide realtime clock. */
+# define CLOCK_REALTIME 0
+
+/* Flag to indicate time is absolute. */
+# define TIMER_ABSTIME 1
+# endif
+
+# endif /* bits/time.h */
+#endif
+
+#ifdef __need_timeval
+# undef __need_timeval
+# ifndef _STRUCT_TIMEVAL
+# define _STRUCT_TIMEVAL 1
+# include <bits/types.h>
+
+/* A time value that is accurate to the nearest
+ microsecond but also has a range of years. */
+struct timeval
+ {
+ __time_t tv_sec; /* Seconds. */
+ __suseconds_t tv_usec; /* Microseconds. */
+ };
+
+/* Powerpc needs this for combined 32/64-bit systems. This allows
+ struct utmp to be the same size in both modes. */
+#if __WORDSIZE == 64
+struct timeval32
+ {
+ __time32_t tv_sec; /* Seconds. */
+ __suseconds32_t tv_usec; /* Microseconds. */
+ };
+#endif
+# endif /* struct timeval */
+#endif /* need timeval */
diff -rupPN libc23-cvstip-20020906/sysdeps/unix/sysv/linux/powerpc/bits/types.h libc23/sysdeps/unix/sysv/linux/powerpc/bits/types.h
--- libc23-cvstip-20020906/sysdeps/unix/sysv/linux/powerpc/bits/types.h Wed Dec 31 18:00:00 1969
+++ libc23/sysdeps/unix/sysv/linux/powerpc/bits/types.h Thu Sep 12 11:48:34 2002
@@ -0,0 +1,177 @@
+/* Copyright (C) 1991,92,1994-1999,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. */
+
+/*
+ * Never include this file directly; use <sys/types.h> instead.
+ */
+
+#ifndef _BITS_TYPES_H
+#define _BITS_TYPES_H 1
+
+#include <features.h>
+
+#define __need_size_t
+#include <stddef.h>
+#include <bits/wordsize.h>
+
+/* Convenience types. */
+typedef unsigned char __u_char;
+typedef unsigned short __u_short;
+typedef unsigned int __u_int;
+typedef unsigned long int __u_long;
+#if __WORDSIZE == 64
+typedef unsigned long int __u_quad_t;
+typedef long int __quad_t;
+#else
+# ifdef __GLIBC_HAVE_LONG_LONG
+__extension__ typedef signed long long int __quad_t;
+__extension__ typedef unsigned long long int __u_quad_t;
+# else
+typedef struct
+ {
+ long int __val[2];
+ } __quad_t;
+typedef struct
+ {
+ __u_long __val[2];
+ } __u_quad_t;
+# endif
+#endif
+typedef signed char __int8_t;
+typedef unsigned char __uint8_t;
+typedef signed short int __int16_t;
+typedef unsigned short int __uint16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+#if __WORDSIZE == 64
+typedef signed long int __int64_t;
+typedef unsigned long int __uint64_t;
+#else
+# ifdef __GLIBC_HAVE_LONG_LONG
+__extension__ typedef signed long long int __int64_t;
+__extension__ typedef unsigned long long int __uint64_t;
+# endif
+#endif
+typedef __quad_t *__qaddr_t;
+
+typedef __u_quad_t __dev_t; /* Type of device numbers. */
+typedef __u_int __uid_t; /* Type of user identifications. */
+typedef __u_int __gid_t; /* Type of group identifications. */
+typedef __u_long __ino_t; /* Type of file serial numbers. */
+typedef __u_quad_t __ino64_t; /* Type of file serial numbers. */
+typedef __u_int __mode_t; /* Type of file attribute bitmasks. */
+#if __WORDSIZE == 64
+typedef __u_long __nlink_t; /* Type of file link counts. */
+#else
+typedef __u_int __nlink_t; /* Type of file link counts. */
+#endif
+typedef long int __off_t; /* Type of file sizes and offsets. */
+typedef __quad_t __loff_t; /* Type of file sizes and offsets. */
+typedef int __pid_t; /* Type of process identifications. */
+#if __WORDSIZE == 64
+typedef long int __ssize_t; /* Type of a byte count, or error. */
+#else
+typedef int __ssize_t; /* Type of a byte count, or error. */
+#endif
+typedef __u_long __rlim_t; /* Type of resource counts. */
+typedef __u_quad_t __rlim64_t; /* Type of resource counts (LFS). */
+typedef __u_int __id_t; /* General type for ID. */
+
+typedef struct
+ {
+ int __val[2];
+ } __fsid_t; /* Type of file system IDs. */
+
+/* Everythin' else. */
+typedef int __daddr_t; /* The type of a disk address. */
+typedef char *__caddr_t;
+typedef long int __time_t;
+typedef unsigned int __useconds_t;
+typedef long int __suseconds_t;
+typedef long int __swblk_t; /* Type of a swap block maybe? */
+
+#if __WORDSIZE == 64
+typedef __int32_t __time32_t;
+typedef __int32_t __suseconds32_t;
+#endif
+
+typedef long int __clock_t;
+
+/* Clock ID used in clock and timer functions. */
+typedef int __clockid_t;
+
+/* Timer ID returned by `timer_create'. */
+typedef int __timer_t;
+
+/* Number of descriptors that can fit in an `fd_set'. */
+#define __FD_SETSIZE 1024
+
+
+typedef int __key_t;
+
+/* Used in `struct shmid_ds'. */
+#if __WORDSIZE == 64
+typedef int __ipc_pid_t;
+#else
+typedef unsigned short int __ipc_pid_t;
+#endif
+
+
+/* Type to represent block size. */
+typedef long int __blksize_t;
+
+/* Types from the Large File Support interface. */
+
+/* Type to count number os disk blocks. */
+typedef long int __blkcnt_t;
+typedef __quad_t __blkcnt64_t;
+
+/* Type to count file system blocks. */
+typedef __u_long __fsblkcnt_t;
+typedef __u_quad_t __fsblkcnt64_t;
+
+/* Type to count file system inodes. */
+typedef __u_long __fsfilcnt_t;
+typedef __u_quad_t __fsfilcnt64_t;
+
+/* Type of file sizes and offsets. */
+typedef __loff_t __off64_t;
+
+
+/* Used in XTI. */
+typedef long int __t_scalar_t;
+typedef unsigned long int __t_uscalar_t;
+
+/* Duplicates info from stdint.h but this is used in unistd.h. */
+#if __WORDSIZE == 64
+typedef long int __intptr_t;
+#else
+typedef int __intptr_t;
+#endif
+
+/* Duplicate info from sys/socket.h. */
+typedef unsigned int __socklen_t;
+
+
+/* Now add the thread types. */
+#if defined __USE_POSIX199506 || defined __USE_UNIX98
+# include <bits/pthreadtypes.h>
+#endif
+
+#endif /* bits/types.h */
diff -rupPN libc23-cvstip-20020906/sysdeps/unix/sysv/linux/powerpc/bits/utmp.h libc23/sysdeps/unix/sysv/linux/powerpc/bits/utmp.h
--- libc23-cvstip-20020906/sysdeps/unix/sysv/linux/powerpc/bits/utmp.h Wed Dec 31 18:00:00 1969
+++ libc23/sysdeps/unix/sysv/linux/powerpc/bits/utmp.h Thu Sep 12 11:48:58 2002
@@ -0,0 +1,116 @@
+/* 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 timeval32 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 libc23-cvstip-20020906/sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h libc23/sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h
--- libc23-cvstip-20020906/sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h Wed Dec 31 18:00:00 1969
+++ libc23/sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h Thu Sep 12 11:49:18 2002
@@ -0,0 +1,97 @@
+/* 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 timeval32 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-20020911.patch