view patches/guile-1.9.14-gnulib-mingw.patch @ 6469:f0ee9df1e3f2

mingw::guile: update for gnulib:canonicalize-lgpl patch.
author Jan Nieuwenhuizen <janneke@gnu.org>
date Tue, 01 Feb 2011 15:24:46 +0100
parents d0006ae646bd
children
line wrap: on
line source

From e8f8f8dc840bfd2c960f86a5e6799420ec755e8c Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Tue, 1 Feb 2011 14:47:50 +0100
Subject: [PATCH 6/6] canonicalize-lgpl: Add an implementation for canonicalize_file_name.

2011-02-01  Jan Nieuwenhuizen  <janneke@gnu.org>

	* lib/canonicalize-lgpl.c (__realpath)[__MINGW32__]: Add an
	implementation for canonicalize_file_name.  This marked the first
	running of guile.exe (1.9) in wine.

	* tests/test-canonicalize-lgpl.c (main)[__MINGW32__]: Do not abort
	on `nonexistent/..'; in Windows that works fine.
---
 ChangeLog                      |    9 ++++
 lib/canonicalize-lgpl.c        |   87 ++++++++++++++++++++++++++++++++++++++++
 tests/test-canonicalize-lgpl.c |    8 ++++
 3 files changed, 104 insertions(+), 0 deletions(-)

diff --git a/lib/canonicalize-lgpl.c b/lib/canonicalize-lgpl.c
index 9bfb44f..3c22195 100644
--- a/lib/canonicalize-lgpl.c
+++ b/lib/canonicalize-lgpl.c
@@ -84,6 +84,9 @@
 #endif
 
 #if !FUNC_REALPATH_WORKS || defined _LIBC
+
+#ifndef __MINGW32__
+
 /* Return the canonical absolute name of file NAME.  A canonical name
    does not contain any `.', `..' components nor any repeated path
    separators ('/') or symlinks.  All path components must exist.  If
@@ -342,6 +345,90 @@ error:
   }
   return NULL;
 }
+
+#else /* __MINGW32__ */
+#include <ctype.h>
+#include <direct.h>
+#include <windows.h>
+
+static char const *
+slashify (char const *str)
+{
+  char *p = (char*)str;
+  
+  while (*p)
+    {
+      if (*p == '\\')
+	*p = '/';
+      p++;
+    }
+  return str;
+}
+
+static char *
+strlower (char *str)
+{
+  char *p = str;
+  while (*p)
+    {
+      *p = (char)tolower (*p);
+      p++;
+    }
+  return str;
+}
+
+char *
+__realpath (const char *name, char *resolved)
+{
+  char *rpath = NULL;
+
+  if (name == NULL)
+    {
+      /* As per Single Unix Specification V2 we must return an error if
+         either parameter is a null pointer.  We extend this to allow
+         the RESOLVED parameter to be NULL in case the we are expected to
+         allocate the room for the return value.  */
+      __set_errno (EINVAL);
+      return NULL;
+    }
+
+  if (name[0] == '\0')
+    {
+      /* As per Single Unix Specification V2 we must return an error if
+         the name argument points to an empty string.  */
+      __set_errno (ENOENT);
+      return NULL;
+    }
+
+  if (resolved == NULL)
+    {
+      rpath = malloc (PATH_MAX + 1);
+      if (rpath == NULL)
+        {
+          /* It's easier to set errno to ENOMEM than to rely on the
+             'malloc-posix' gnulib module.  */
+          errno = ENOMEM;
+          return NULL;
+        }
+    }
+  else
+    rpath = resolved;
+
+  GetFullPathName (name, PATH_MAX, rpath, NULL);
+  slashify (rpath);
+  strlower (rpath);
+  struct stat st;
+  if (lstat (rpath, &st) < 0)
+    {
+      if (resolved == NULL)
+	free (rpath);
+      return NULL;
+    }
+  return rpath;
+}
+
+#endif /* __MINGW32__ */
+
 versioned_symbol (libc, __realpath, realpath, GLIBC_2_3);
 #endif /* !FUNC_REALPATH_WORKS || defined _LIBC */