Skip to content

Commit

Permalink
Do not use the deprecated readdir_r() function in Linux.
Browse files Browse the repository at this point in the history
  • Loading branch information
abh3 committed Apr 20, 2016
1 parent 05171a2 commit 4179c70
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 14 deletions.
31 changes: 20 additions & 11 deletions src/XrdDig/XrdDigFS.cc
Expand Up @@ -239,33 +239,42 @@ const char *XrdDigDirectory::nextEntry()

// Read the next directory entry
//
#ifdef __linux__
do{errno = 0;
if ((retc = readdir_r(dh, d_pnt, &rp)))
{if (retc && errno != 0)
XrdDigFS::Emsg(epname,error,retc,"read directory",fname);
rp = readdir(dh);
if (!rp)
{if (!(retc = errno)) {ateof = 1; error.clear();}
else XrdDigFS::Emsg(epname,error,retc,"read directory",fname);
d_pnt->d_name[0] = '\0';
return (const char *)0;
}
#else
do{if ((retc = readdir_r(dh, d_pnt, &rp)))
{XrdDigFS::Emsg(epname,error,retc,"read directory",fname);
d_pnt->d_name[0] = '\0';
return (const char *)0;
}

// Check if we have reached end of file
//
if (retc || !rp || !d_pnt->d_name[0])
if (!rp || !d_pnt->d_name[0])
{ateof = true;
error.clear();
return (const char *)0;
}
#endif

// If autostat wanted, do so here
//
if (sBuff)
{
#ifdef HAVE_FSTATAT
int sFlags = (isProc ? AT_SYMLINK_NOFOLLOW : 0);
if (fstatat(dirFD, d_pnt->d_name, sBuff, sFlags)) continue;
if (fstatat(dirFD, rp->d_name, sBuff, sFlags)) continue;
sBuff->st_mode = (sBuff->st_mode & wMask) | S_IRUSR;
#else
char dPath[2048];
snprintf(dPath, sizeof(dPath), "%s%s", fname, d_pnt->d_name);
snprintf(dPath, sizeof(dPath), "%s%s", fname, rp->d_name);
if (stat(dPath, sBuff)) continue;
sBuff->st_mode = (sBuff->st_mode & wMask) | S_IRUSR;
#endif
Expand All @@ -279,12 +288,12 @@ do{errno = 0;
{struct stat Stat, *sP = (sBuff ? sBuff : &Stat);
char *dP;
int n, rc;
rc = (sBuff ? 0:fstatat(dirFD,d_pnt->d_name,&Stat,AT_SYMLINK_NOFOLLOW));
rc = (sBuff ? 0:fstatat(dirFD,rp->d_name,&Stat,AT_SYMLINK_NOFOLLOW));
if (!rc && !noTag && S_ISLNK(sP->st_mode))
{n = strlen(d_pnt->d_name);
dP = d_pnt->d_name + n + 4;
{n = strlen(rp->d_name);
dP = rp->d_name + n + 4;
n = sizeof(dirent_full.nbf) - (n + 8);
if ((n = readlinkat(dirFD,d_pnt->d_name,dP,n)) < 0) strcpy(dP,"?");
if ((n = readlinkat(dirFD,rp->d_name,dP,n)) < 0) strcpy(dP,"?");
else *(dP+n) = 0;
strncpy(dP-4, " -> ", 4);
}
Expand All @@ -293,7 +302,7 @@ do{errno = 0;

// Return the actual entry
//
return (const char *)(d_pnt->d_name);
return (const char *)(rp->d_name);
} while(1);
return 0; // Keep compiler happy
}
Expand Down
16 changes: 13 additions & 3 deletions src/XrdSfs/XrdSfsNative.cc
Expand Up @@ -197,17 +197,26 @@ const char *XrdSfsNativeDirectory::nextEntry()

// Read the next directory entry
//
#ifdef __linux__
errno = 0;
rp = readdir(dh);
if (!rp)
{if (!(retc = errno)) {ateof = 1; error.clear();}
else XrdSfsNative::Emsg(epname,error,retc,"read directory",fname);
d_pnt->d_name[0] = '\0';
return (const char *)0;
}
return (const char *)(rp->d_name);
#else
if ((retc = readdir_r(dh, d_pnt, &rp)))
{if (retc && errno != 0)
XrdSfsNative::Emsg(epname,error,retc,"read directory",fname);
{XrdSfsNative::Emsg(epname,error,retc,"read directory",fname);
d_pnt->d_name[0] = '\0';
return (const char *)0;
}

// Check if we have reached end of file
//
if (retc || !rp || !d_pnt->d_name[0])
if (!rp || !d_pnt->d_name[0])
{ateof = 1;
error.clear();
return (const char *)0;
Expand All @@ -216,6 +225,7 @@ const char *XrdSfsNativeDirectory::nextEntry()
// Return the actual entry
//
return (const char *)(d_pnt->d_name);
#endif
}

/******************************************************************************/
Expand Down

0 comments on commit 4179c70

Please sign in to comment.