delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2008/09/16/14:46:41

X-Authentication-Warning: delorie.com: mail set sender to djgpp-workers-bounces using -f
X-Recipient: djgpp-workers AT delorie DOT com
X-Authenticated: #27081556
X-Provags-ID: V01U2FsdGVkX1+AHaR0NY6AUWqKuvCHLKxCeIpQA0U465Gw3VaJD7
FnqEXojpZtTmME
Message-ID: <000e01c91827$34a54f90$2202a8c0@computername>
From: "Juan Manuel Guerrero" <juan DOT guerrero AT gmx DOT de>
To: <djgpp-workers AT delorie DOT com>
Subject: realpath/_fixpath and _use_lfn generated errno
Date: Tue, 16 Sep 2008 20:08:21 +0200
MIME-Version: 1.0
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2800.1106
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106
X-Y-GMX-Trusted: 0
X-FuHaFi: 0.55
Reply-To: djgpp-workers AT delorie DOT com

While I was trying to fix the port of Which I have noticed that realpath and
_fixpath set errno to ENOSYS if the OS used does not provide the LFN API.
This happens because both functions use __canonicalize_path that calls _use_lfn
to check if the OS provides a LFN API.  If the OS does not, then _use_lfn returns
zero and sets errno to ENOSYS (happens in _get_volume_info).  But __canonicalize_path
does not evalute errno at all and only uses the return value of _use_lfn to
decide if function 0x7147 or 0x47 will be used to get the current directory.
If the canonicalization of the path can be successfully performed, realpath
and _fixpath do not set errno and the value of errno continues to be the one
given by _use_lfn, that is errno = ENOSYS and that value is returned to the
calling function.  I assume that this is not intentional, so I suggest the patch below.

Regards,
Juan M. Guerrero



2008-09-16  Juan Manuell Guerrero  <juan DOT guerrero AT gmx DOT de>

 * src/libc/posix/sys/stat/fixpath.c: Discard ENOSYS from the _use_lfn call.



diff -aprNU3 djgpp.orig/src/libc/posix/sys/stat/fixpath.c djgpp/src/libc/posix/sys/stat/fixpath.c
--- djgpp.orig/src/libc/posix/sys/stat/fixpath.c 2002-09-25 23:45:20 +0000
+++ djgpp/src/libc/posix/sys/stat/fixpath.c 2008-09-16 19:11:24 +0000
@@ -140,8 +140,11 @@ __canonicalize_path(const char *in, char
   char  *name_start;
   int  mbsize;
   char  *op_limit;
+  int  previous_errno;
 
+  previous_errno = errno;
   use_lfn = _use_lfn(in);
+  errno = previous_errno;  /*  Do not signal that LFN API is not available (ENOSYS).  */
 
   if (path_max > FILENAME_MAX)
     path_max = FILENAME_MAX;

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019