So, it seems as if the functions that depend on utmp.h and utmpx.h
*should* run in 31-bit mode, even on a 64-bit host.
They don't.
I'm going to post the test code I've got with utmpx.h, which is the
more modern interface (I have a suspicion utmp.h really *IS* utmpx.h
under the hood anyway). All it does it walk through the utmp entries
and print what it finds.
***begin source code***
#include <utmpx.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
struct utmpx *utp;
setutxent();
while ((utp = getutxent()) != NULL) {
printf("getutxent: utp at 0x%0x: ut_type: 0x%0x, pid 0x%x,\
device name \"%s\" (0x%0x), inittab id \"%s\" (0x%0x),\
username \"%s\" (0x%0x), hostname \"%s\" (0x%0x),\
session ID 0x%0x, raddr 0x%0x\n",\
utp,\
utp->ut_type,\
utp->ut_pid,\
utp->ut_line,\
utp->ut_line,\
utp->ut_id,\
utp->ut_id,\
utp->ut_user,\
utp->ut_user,\
utp->ut_host,\
utp->ut_host,\
utp->ut_session,\
utp->ut_addr_v6
);
}
return(0);
}
***end source code***
I'm using a SLES10SP2 system, but this also happens on SP1. I no
longer have a GA SLES10 system to test against.
Now if I just compile and run it, everything is cool:
[EMAIL PROTECTED]:~/src/utmpxtester> gcc test.c
[EMAIL PROTECTED]:~/src/utmpxtester> ./a.out
getutxent: utp at 0x80002010: ut_type: 0x2, pid 0x0, device
name "~" (0x80002018), inittab id "~~" (0x80002038), username
"reboot" (0x8000203c), hostname "" (0x8000205c), session ID
0x0, raddr 0x80002178
getutxent: utp at 0x80002010: ut_type: 0x8, pid 0x12d, device
name "" (0x80002018), inittab id "si" (0x80002038), username
"" (0x8000203c), hostname "" (0x8000205c), session ID 0x0,
raddr 0x80002178
getutxent: utp at 0x80002010: ut_type: 0x7, pid 0x3ec5, device
name "pts/0" (0x80002018), inittab id "ts/
0root" (0x80002038), username "root" (0x8000203c), hostname
"quicksilver.fsf.net" (0x8000205c), session ID 0x0, raddr
0x80002178
getutxent: utp at 0x80002010: ut_type: 0x7, pid 0x3fc8, device
name "pts/1" (0x80002018), inittab id "ts/
1root" (0x80002038), username "root" (0x8000203c), hostname
"quicksilver.fsf.net" (0x8000205c), session ID 0x0, raddr
0x80002178
getutxent: utp at 0x80002010: ut_type: 0x1, pid 0x4e33, device
name "~" (0x80002018), inittab id "~~" (0x80002038), username
"runlevel" (0x8000203c), hostname "" (0x8000205c), session ID
0x0, raddr 0x80002178
getutxent: utp at 0x80002010: ut_type: 0x8, pid 0x1bbe, device
name "" (0x80002018), inittab id "l3" (0x80002038), username
"" (0x8000203c), hostname "" (0x8000205c), session ID 0x0,
raddr 0x80002178
getutxent: utp at 0x80002010: ut_type: 0x6, pid 0x1dde, device
name "ttyS0" (0x80002018), inittab id "1" (0x80002038),
username "LOGIN" (0x8000203c), hostname "" (0x8000205c),
session ID 0x1dde, raddr 0x80002178
getutxent: utp at 0x80002010: ut_type: 0x7, pid 0x4066, device
name "pts/2" (0x80002018), inittab id "ts/
2adam" (0x80002038), username "adam" (0x8000203c), hostname
"quicksilver.fsf.net" (0x8000205c), session ID 0x0, raddr
0x80002178
getutxent: utp at 0x80002010: ut_type: 0x7, pid 0x6e82, device
name "pts/3" (0x80002018), inittab id "ts/
3root" (0x80002038), username "root" (0x8000203c), hostname
"nealemac.sinenomine.net" (0x8000205c), session ID 0x0, raddr
0x80002178
getutxent: utp at 0x80002010: ut_type: 0x7, pid 0x5c0f, device
name "pts/4" (0x80002018), inittab id "ts/
4adam" (0x80002038), username "adam" (0x8000203c), hostname
"quicksilver.fsf.net" (0x8000205c), session ID 0x0, raddr
0x80002178
getutxent: utp at 0x80002010: ut_type: 0x7, pid 0x3215, device
name "pts/5" (0x80002018), inittab id "ts/
5root" (0x80002038), username "root" (0x8000203c), hostname
"quicksilver.fsf.net" (0x8000205c), session ID 0x0, raddr
0x80002178
getutxent: utp at 0x80002010: ut_type: 0x7, pid 0x65e0, device
name "pts/6" (0x80002018), inittab id "ts/
6root" (0x80002038), username "root" (0x8000203c), hostname
"quicksilver.fsf.net" (0x8000205c), session ID 0x0, raddr
0x80002178
getutxent: utp at 0x80002010: ut_type: 0x7, pid 0x7d18, device
name "pts/7" (0x80002018), inittab id "ts/
7adam" (0x80002038), username "adam" (0x8000203c), hostname
"quicksilver.fsf.net" (0x8000205c), session ID 0x0, raddr
0x80002178
However, if I try to build and run it in 31-bit mode, everything is
NOT cool:
[EMAIL PROTECTED]:~/src/utmpxtester> gcc -m31 test.c
[EMAIL PROTECTED]:~/src/utmpxtester> ./a.out
getutxent: utp at 0x402008: ut_type: 0x2, pid 0x0, device name
"~" (0x402010), inittab id "~~" (0x402030), username
"reboot" (0x402034), hostname "" (0x402054), session ID 0x0,
raddr 0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "pts/0" (0x402030), username
"0" (0x402034), hostname "root" (0x402054), session ID 0x0,
raddr 0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0xc69fe, device
name "??O" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"H.]g" (0x402034), hostname "" (0x402054), session ID 0x0,
raddr 0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "H6??" (0x402054), session ID 0x0,
raddr 0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
getutxent: utp at 0x402008: ut_type: 0x0, pid 0x0, device name
"" (0x402010), inittab id "" (0x402030), username
"" (0x402034), hostname "" (0x402054), session ID 0x0, raddr
0x402164
This is a problem, because it means that 31-bit executables that use
getutxent() break on SLES10.
Any advice? I've tried faking out the compiler by explicitly defining
__s390x__ even though I'm also doing -m31, and by defining
__WORDSIZE=64 and also __WORDSIZE_COMPAT32, but it doesn't help: I
can't get -m31 to play nice with getutxent().
Adam
----------------------------------------------------------------------
For LINUX-390 subscribe / signoff / archive access instructions,
send email to [EMAIL PROTECTED] with the message: INFO LINUX-390 or visit
http://www.marist.edu/htbin/wlvindex?LINUX-390