[uClibc] fstat and fstat64

Justin Cormack justin at street-vision.com
Thu Jun 2 15:40:17 UTC 2005


Just to sanity check, you did compile largefile support into uclibc?

And what are your compile flags (looks like you have some largefile
flags).

I havent had problems with largefile support on uclibc.

j

On Thu, 2005-06-02 at 13:47, Simon Posnjak wrote:
> Hi all,
> 
> Yesterday I reported that I am having problems with sqlite3 (3.2.1)
> and uclibc (0.9.27). Today I did a bit of investigating and found that
> the problem is connected to fstat function.
> 
> The code in question is:
> -From sqlite:
> ------------------
> int sqlite3OsFileSize(OsFile *id, i64 *pSize){
>   struct stat buf;
> 
>   if( fstat(id->h, &buf)!=0 ){
>     return SQLITE_IOERR;
>   }
>   *pSize = buf.st_size;
>   return SQLITE_OK;
> }
> 
> -From uclibc:
> -------------------
> int stat64(const char *file_name, struct stat64 *buf)
> {
>         int result;
>         struct kernel_stat64 kbuf;
> 
>         result = __syscall_stat64(file_name, &kbuf);
>         if (result == 0) {
>                 __xstat64_conv(&kbuf, buf);
>         }
>         return result;
> }
> 
> I get a segfault after the fstat call.
> 
> I went through the code with the debugger and found that the size of
> struct stat buf and struct stat64 *buf is not the same:
> 
> [simonp at matilda trunk]$ /usr/local/gdb-cris/bin/cris-gdb
> /stuff1/delo/devboard/libs/sqlite/sqlite/sqlite3
> GNU gdb 6.2.50_20041012
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB.  Type "show warranty" for details.
> This GDB was configured as "--host=i386-linux --target=cris"...
> (gdb) br sqlite3OsFileSize
> Breakpoint 1 at 0x88b46: file src/os_unix.c, line 811.
> (gdb) target remote 10.0.0.100:10000
> Remote debugging using 10.0.0.100:10000
> 0x00080080 in _start ()
> (gdb) c
> Continuing.
> 
> Breakpoint 1, sqlite3OsFileSize (id=0xfe434, pSize=0x9fffa1fc) at
> src/os_unix.c:811
> 811       assert( id->isOpen );
> (gdb) list
> 806     /*
> 807     ** Determine the current size of a file in bytes
> 808     */
> 809     int sqlite3OsFileSize(OsFile *id, i64 *pSize){
> 810       struct stat buf;
> 811       assert( id->isOpen );
> 812       SimulateIOError(SQLITE_IOERR);
> 813       printf ("sqlite3OsFileSize: %i\n", sizeof(struct stat));
> 814       if( fstat(id->h, &buf)!=0 ){
> 815         return SQLITE_IOERR;
> (gdb) n
> 813       printf ("sqlite3OsFileSize: %i\n", sizeof(struct stat));
> (gdb) n
> 814       if( fstat(id->h, &buf)!=0 ){
> (gdb) print sizeof(buf)
> $1 = 92
> (gdb) s
> fstat64 (fd=3, buf=0x9fffa18c) at fstat64.c:28
> 28              result = __syscall_fstat64(fd, &kbuf);
> (gdb) list
> 23      int fstat64(int fd, struct stat64 *buf)
> 24      {
> 25              int result;
> 26              struct kernel_stat64 kbuf;
> 27
> 28              result = __syscall_fstat64(fd, &kbuf);
> 29              if (result == 0) {
> 30                      __xstat64_conv(&kbuf, buf);
> 31              }
> 32              return result;
> (gdb) print sizeof(*buf)
> $2 = 96
> (gdb)                                          
> 
> I think that the problem is some have connected to header files but I
> can not pin it down. Any ideas what the problem could be?
> 
> Regards Simon
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://uclibc.org/mailman/listinfo/uclibc





More information about the uClibc mailing list