[Libsysio-commit] LLNL_HPSS: libsysio/src getdirentries.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2005-09-09 17:10:21
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9869/src Modified Files: Tag: LLNL_HPSS getdirentries.c Log Message: Account for d_name terminated with NUL or not. Index: getdirentries.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/getdirentries.c,v retrieving revision 1.20.2.2 retrieving revision 1.20.2.3 diff -u -w -b -B -p -r1.20.2.2 -r1.20.2.3 --- getdirentries.c 9 Sep 2005 14:58:20 -0000 1.20.2.2 +++ getdirentries.c 9 Sep 2005 17:10:09 -0000 1.20.2.3 @@ -141,10 +141,17 @@ sysio_sym_strong_alias(PREPEND(_, SYSIO_ #define EOVERFLOW ERANGE #endif +#define _dbaselen(__d) (sizeof(struct __d) - sizeof(((struct __d *)0)->d_name)) + #ifdef _DIRENT_HAVE_D_NAMLEN -#define _namlen(dp) ((dp)->d_namlen) +#define _namlen(dp, __d) \ + ((dp)->d_namlen) +#elif defined(_DIRENT_HAVE_D_RECLEN) +#define _namlen(dp, __d) \ + ((dp)->d_reclen - _dbaselen(__d)) #else -#define _namlen(dp) (strlen((dp)->d_name)) +#define _namlen(dp, __d) \ + (strlen((dp)->d_name) + 1) #endif #ifndef _rndup @@ -152,15 +159,20 @@ sysio_sym_strong_alias(PREPEND(_, SYSIO_ ((((n) + (boundary) - 1 ) / (boundary)) * (boundary)) #endif -#define _dbaselen ((size_t )&((struct dirent *)0)->d_name[0]) +#ifdef GCC_VERSION +#define _dalign(d) (__alignof__ (struct d)) +#endif -#ifdef __GLIBC__ +#ifdef GCC_VERSION #define _dreclen(namlen) \ - ((_dbaselen + (namlen) + __alignof__ (struct dirent)) & \ - ~(__alignof__ (struct dirent) - 1)) -#else /* !defined(__GLIBC__) */ + _rndup(_dbaselen(dirent) + (namlen), (__alignof (struct dirent))) +#define _dreclen64(namlen) \ + _rndup(_dbaselen(dirent64) + (namlen), (__alignof (struct dirent64))) +#else #define _dreclen(namlen) \ - _rndup(_dbaselen + (namlen) + 1, sizeof(int)) + _rndup(_dbaselen(dirent) + (namlen), sizeof(long)) +#define _dreclen64(namlen) \ + _rndup(_dbaselen(dirent64) + (namlen), sizeof(long long)) #endif #ifndef BSD @@ -198,8 +210,10 @@ SYSIO_INTERFACE_NAME(getdirentries)(int dp = (void *)buf; reclen = 0; while (cc > 0) { - n = _namlen(d64p); - reclen = _dreclen(n); + n = _namlen(d64p, dirent64); + reclen = _dreclen64(n); +if (reclen != d64p->d_reclen) +abort(); d64.d_ino = d64p->d_ino; #ifdef _DIRENT_HAVE_D_OFF d64.d_off = d64p->d_off; @@ -254,12 +268,12 @@ SYSIO_INTERFACE_NAME(getdirentries)(int dp->d_type = d64.d_type; #endif #ifdef _DIRENT_HAVE_D_RECLEN - dp->d_reclen = reclen; + dp->d_reclen = _dreclen(n); #endif /* * Fill the remainder with zeros. */ - p = (char *)dp + reclen; + p = (char *)dp + _dreclen(n); #ifdef HAVE_D_NAMLEN dp->d_namlen = n; #endif |