Now using readdir() instead of readdir_r(), if GLIBC version 2.24 or newer is used

This commit is contained in:
Klaus Schmidinger 2017-06-25 11:54:32 +02:00
parent ce5e23f209
commit 027ae738a8
4 changed files with 12 additions and 2 deletions

View File

@ -3037,6 +3037,8 @@ Frank Neumann <fnu@yavdr.org>
for reporting a problem with the default return value of cEpgHandler::BeginSegmentTransfer()
in derived classes that don't implement this function
for reporting uninitialized variable SdWatchdog in vdr.c
for suggesting to use readdir() instead of readdir_r(), if GLIBC version 2.24 or
newer is used
Gerald Dachs <vdr@dachsweb.de>
for reporting a problem with checking for minimum line length of 21 characters in

View File

@ -9152,3 +9152,5 @@ Video Disk Recorder Revision History
The old version of cSkinDisplayMenu::SetItemEvent() (without the TimerActive parameter)
is still there for backwards compatibility. It may be removed in a future version,
so plugin authors should switch to the new one.
- Now using readdir() instead of readdir_r(), if GLIBC version 2.24 or newer is used
(suggested by Frank Neumann).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.c 4.7 2017/06/23 09:39:45 kls Exp $
* $Id: tools.c 4.8 2017/06/25 11:45:39 kls Exp $
*/
#include "tools.h"
@ -1528,7 +1528,11 @@ cReadDir::~cReadDir()
struct dirent *cReadDir::Next(void)
{
if (directory) {
#if !__GLIBC_PREREQ(2, 24) // readdir_r() is deprecated as of GLIBC 2.24
while (readdir_r(directory, &u.d, &result) == 0 && result) {
#else
while ((result = readdir(directory)) != NULL) {
#endif
if (strcmp(result->d_name, ".") && strcmp(result->d_name, ".."))
return result;
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.h 4.12 2017/06/11 10:00:49 kls Exp $
* $Id: tools.h 4.13 2017/06/25 11:45:38 kls Exp $
*/
#ifndef __TOOLS_H
@ -400,10 +400,12 @@ class cReadDir {
private:
DIR *directory;
struct dirent *result;
#if !__GLIBC_PREREQ(2, 24) // readdir_r() is deprecated as of GLIBC 2.24
union { // according to "The GNU C Library Reference Manual"
struct dirent d;
char b[offsetof(struct dirent, d_name) + NAME_MAX + 1];
} u;
#endif
public:
cReadDir(const char *Directory);
~cReadDir();