diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 730d5b66..5e522b9a 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1794,6 +1794,7 @@ Ingo Schneider Patrick Cernko for suggesting to add a note about "modprobe capability" to INSTALL + for reporting a problem with relative link targets in the ReadLink() function Philippe Gramoullé for reporting a a missing '-' in the example for viewing a grabbed image on a remote diff --git a/HISTORY b/HISTORY index 6f5600db..5fb2bf58 100644 --- a/HISTORY +++ b/HISTORY @@ -4783,7 +4783,7 @@ Video Disk Recorder Revision History so that they can be suppressed in normal operation mode to avoid clogging the log file in case this function is used frequently (suggested by Helmut Auer). -2006-06-16: Version 1.4.1-1 +2006-06-17: Version 1.4.1-1 - Added "-fPIC" to the compiler options in Make.config.template when compiling plugins (thanks to Udo Richter). If you use your own Make.config file, you may @@ -4797,3 +4797,5 @@ Video Disk Recorder Revision History - Modified rcu.c to better handle RC5 codes. - Added a missing variable initialization in cRingBufferLinear::cRingBufferLinear() (thanks to Prakash Punnoor). +- Fixed handling relative link targets in the ReadLink() function (reported by + Patrick Cernko). diff --git a/tools.c b/tools.c index 475afdb8..5869bf08 100644 --- a/tools.c +++ b/tools.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 1.118 2006/05/26 10:10:31 kls Exp $ + * $Id: tools.c 1.119 2006/06/17 09:45:32 kls Exp $ */ #include "tools.h" @@ -480,22 +480,16 @@ int DirSizeMB(const char *DirName) char *ReadLink(const char *FileName) { - char RealName[PATH_MAX]; - const char *TargetName = NULL; - int n = readlink(FileName, RealName, sizeof(RealName) - 1); - if (n < 0) { - if (errno == ENOENT || errno == EINVAL) // file doesn't exist or is not a symlink - TargetName = FileName; + if (!FileName) + return NULL; + char *TargetName = canonicalize_file_name(FileName); + if (!TargetName) { + if (errno == ENOENT) // file doesn't exist + TargetName = strdup(FileName); else // some other error occurred LOG_ERROR_STR(FileName); } - else if (n < int(sizeof(RealName))) { // got it! - RealName[n] = 0; - TargetName = RealName; - } - else - esyslog("ERROR: symlink's target name too long: %s", FileName); - return TargetName ? strdup(TargetName) : NULL; + return TargetName; } bool SpinUpDisk(const char *FileName)