Subject: port-alpha/5154: 64 bit clean problem with struct stat on NetBSD/alpha
To: None <gnats-bugs@gnats.netbsd.org>
From: None <eric@cirr.com>
List: netbsd-bugs
Date: 03/12/1998 15:37:12
>Number:         5154
>Category:       port-alpha
>Synopsis:       sizeof(struct stat) changes with definition of _POSIX_SOURCE
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    gnats-admin (GNATS administrator)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Mar 12 13:50:01 1998
>Last-Modified:
>Originator:     Eric Schnoebelen
>Organization:
Central Iowa (Model) Railroad
>Release:        NetBSD 1.3
>Environment:

System: NetBSD nicetry 1.3 NetBSD 1.3 (GENERIC) #0: Tue Dec 30 23:32:12 PST 1997 cjs@bishop:/u1/cjs/co/branch/src/sys/arch/alpha/compile/GENERIC alpha

>Description:
	On the alpha processor platform, 
		sizeof(time_t) == 4
		sizeof(long) == 8
		sizeof(struct timespec) == 16

	In struct stat, the timestamp's are defined as either struct
timespec's, or pairs of time_t/long's, dending upon the preprocessor
flag _POSIX_SOURCE.

		sizeof(struct timespec) != (sizeof(long) + sizeof(time_t)	

	This causes the size of the stat structure to change depending
upon the preprocessor flag _POSIX_SOURCE.  The changing size of this stucture
causes references to st_size to return a truly bogus number (the low
order bits of the clock) when _POSIX_SOURCE is defined, and the program
is compiled on the alpha processor.

>How-To-Repeat:
----------------------[cut here]-------------------------------
#!/bin/sh
#
#	demonstrate a problem with the size of the stat structure
#	changing on the alpha processor platform
#	
#	Eric Schnoebelen -- eric@cirr.com, 12 March, 1998
cat >stat-test.c <<-_EOF_
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

main(int argc, char **argv)
{
	int i;
	struct stat st;

	for(i = 1; i < argc; i++){
		if (stat(argv[i], &st) != 0)
			return 1;

		printf("%s:	%ld\n", argv[i], st.st_size);
	}

	printf("\n");
	printf("sizeof(long): %d\n", sizeof(long));
	printf("sizeof(time_t): %d\n", sizeof(time_t));
	printf("sizeof(struct timespec): %d\n", sizeof(struct timespec));
	printf("sizeof(struct stat): %d\n", sizeof(struct stat));

}
_EOF_
cc -o stat-test stat-test.c
./stat-test stat-test stat-test.c
cc -D_POSIX_SOURCE -o stat-test stat-test.c
./stat-test stat-test stat-test.c
exit 0
----------------------[cut here]-------------------------------
>Fix:
	Define struct timespec in terms of time_t, and the modify struct
stat so that it uses time_t for both bits of time information for atime,
ctime and mtime.
>Audit-Trail:
>Unformatted: