--- syscall.c 2005-02-13 19:58:10.000000000 -0500 +++ newsyscall.c 2005-02-24 18:29:43.981440000 -0500 @@ -210,23 +210,38 @@ #endif } +/* Solaris and others return undefined st_size for block/character devices */ +static void wrap_size(int rc, STRUCT_STAT *st) +{ + if (rc != 0) + return; + if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) + st->st_size = 0; +} + int do_stat(const char *fname, STRUCT_STAT *st) { + int rc; #ifdef USE_STAT64_FUNCS - return stat64(fname, st); + rc = stat64(fname, st); #else - return stat(fname, st); + rc = stat(fname, st); #endif + wrap_size(rc, st); + return rc; } int do_lstat(const char *fname, STRUCT_STAT *st) { #ifdef SUPPORT_LINKS + int rc; # ifdef USE_STAT64_FUNCS - return lstat64(fname, st); + rc = lstat64(fname, st); # else - return lstat(fname, st); + rc = lstat(fname, st); # endif + wrap_size(rc, st); + return rc; #else return do_stat(fname, st); #endif @@ -234,11 +249,14 @@ int do_fstat(int fd, STRUCT_STAT *st) { + int rc; #ifdef USE_STAT64_FUNCS - return fstat64(fd, st); + rc = fstat64(fd, st); #else - return fstat(fd, st); + rc = fstat(fd, st); #endif + wrap_size(rc, st); + return rc; } OFF_T do_lseek(int fd, OFF_T offset, int whence)