diff options
author | Eric Andersen <andersen@codepoet.org> | 2003-01-24 11:44:14 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2003-01-24 11:44:14 +0000 |
commit | 85800279bcad0b3495ccc22374f42cd04675f9e4 (patch) | |
tree | 30f6754fb734191d6cd7d3fad292a94c02430418 /libc/sysdeps/linux/i386 | |
parent | 8c29bb071a5d7f6cf8edb26b93bd9e48d4ad3df1 (diff) |
Ok, people are probably going to hate me for this... This commit changes the
type of 'struct stat' and 'struct stat64' so they use consistant types.
This change is the result of a bug I found while trying to use GNU tar. The
problem was caused by our using kernel types within struct stat and trying to
directly compare these values with standard types. Trying an 'if (a < b)' when
'a' is an 'unsigned long' and 'b' is an 'int' leads to very different results
then when comparing entities of the same type (i.e. time_t values)....
Grumble. Nasty stuff, but I'm glad I got this out of the way now.
As a result of this fix, uClibc 0.9.17 will not be binary compatible with
earlier releases. I have always warned people this can and will happen.
-Erik
Diffstat (limited to 'libc/sysdeps/linux/i386')
-rw-r--r-- | libc/sysdeps/linux/i386/bits/kernel_stat.h | 31 |
1 files changed, 2 insertions, 29 deletions
diff --git a/libc/sysdeps/linux/i386/bits/kernel_stat.h b/libc/sysdeps/linux/i386/bits/kernel_stat.h index 9e7598f5e..5df484fe7 100644 --- a/libc/sysdeps/linux/i386/bits/kernel_stat.h +++ b/libc/sysdeps/linux/i386/bits/kernel_stat.h @@ -5,8 +5,7 @@ * struct stat should look like... It turns out each arch has a * different opinion on the subject... */ -#ifndef __USE_FILE_OFFSET64 -struct stat { +struct kernel_stat { unsigned short st_dev; unsigned short __pad1; unsigned long st_ino; @@ -28,33 +27,8 @@ struct stat { unsigned long __unused4; unsigned long __unused5; }; -#else -struct stat { - unsigned short st_dev; - unsigned char __pad0[10]; - unsigned long __st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned long st_uid; - unsigned long st_gid; - unsigned short st_rdev; - unsigned char __pad3[10]; - long long st_size; - unsigned long st_blksize; - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ - unsigned long __pad4; /* future possible st_blocks high bits */ - unsigned long st_atime; - unsigned long __pad5; - unsigned long st_mtime; - unsigned long __pad6; - unsigned long st_ctime; - unsigned long __pad7; /* will be high 32 bits of ctime someday */ - unsigned long long st_ino; -}; -#endif -#ifdef __USE_LARGEFILE64 -struct stat64 { +struct kernel_stat64 { unsigned short st_dev; unsigned char __pad0[10]; #define STAT64_HAS_BROKEN_ST_INO 1 @@ -77,7 +51,6 @@ struct stat64 { unsigned long __pad7; /* will be high 32 bits of ctime someday */ unsigned long long st_ino; }; -#endif #endif /* _BITS_STAT_STRUCT_H */ |