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
|