Update from gnulib.
diff --git a/ChangeLog b/ChangeLog
index 3d867c9..4916e53 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-28  Bruno Haible  <bruno@clisp.org>
+
+	* lib/relocatable.h: Update from gnulib.
+	* lib/relocatable.c: Likewise.
+
 2011-01-29  Corinna Vinschen  <corinna-cygwin@cygwin.com>
             Bruno Haible  <bruno@clisp.org>
 
diff --git a/lib/relocatable.c b/lib/relocatable.c
index 5e1dde6..cbff85f 100644
--- a/lib/relocatable.c
+++ b/lib/relocatable.c
@@ -1,5 +1,5 @@
 /* Provide relocatable packages.
-   Copyright (C) 2003-2006 Free Software Foundation, Inc.
+   Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
    This program is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
    This must come before <config.h> because <config.h> may include
    <features.h>, and once <features.h> has been included, it's too late.  */
 #ifndef _GNU_SOURCE
-# define _GNU_SOURCE	1
+# define _GNU_SOURCE 1
 #endif
 
 #include <config.h>
@@ -43,7 +43,7 @@
 # include "xalloc.h"
 #endif
 
-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 #endif
@@ -70,8 +70,8 @@
    ISSLASH(C)           tests whether C is a directory separator character.
    IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
  */
-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
-  /* Win32, Cygwin, OS/2, DOS */
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
 # define ISSLASH(C) ((C) == '/' || (C) == '\\')
 # define HAS_DEVICE(P) \
     ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
@@ -86,6 +86,9 @@
 # define FILE_SYSTEM_PREFIX_LEN(P) 0
 #endif
 
+/* Use the system functions, not the gnulib overrides in this file.  */
+#undef malloc
+
 /* Original installation prefix.  */
 static char *orig_prefix;
 static size_t orig_prefix_len;
@@ -102,11 +105,11 @@
    instead of "/").  */
 static void
 set_this_relocation_prefix (const char *orig_prefix_arg,
-			    const char *curr_prefix_arg)
+                            const char *curr_prefix_arg)
 {
   if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
       /* Optimization: if orig_prefix and curr_prefix are equal, the
-	 relocation is a nop.  */
+         relocation is a nop.  */
       && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
     {
       /* Duplicate the argument strings.  */
@@ -118,14 +121,14 @@
 #ifdef NO_XMALLOC
       if (memory != NULL)
 #endif
-	{
-	  memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
-	  orig_prefix = memory;
-	  memory += orig_prefix_len + 1;
-	  memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
-	  curr_prefix = memory;
-	  return;
-	}
+        {
+          memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+          orig_prefix = memory;
+          memory += orig_prefix_len + 1;
+          memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+          curr_prefix = memory;
+          return;
+        }
     }
   orig_prefix = NULL;
   curr_prefix = NULL;
@@ -160,17 +163,18 @@
 /* Convenience function:
    Computes the current installation prefix, based on the original
    installation prefix, the original installation directory of a particular
-   file, and the current pathname of this file.  Returns NULL upon failure.  */
+   file, and the current pathname of this file.
+   Returns it, freshly allocated.  Returns NULL upon failure.  */
 #ifdef IN_LIBRARY
 #define compute_curr_prefix local_compute_curr_prefix
 static
 #endif
-const char *
+char *
 compute_curr_prefix (const char *orig_installprefix,
-		     const char *orig_installdir,
-		     const char *curr_pathname)
+                     const char *orig_installdir,
+                     const char *curr_pathname)
 {
-  const char *curr_installdir;
+  char *curr_installdir;
   const char *rel_installdir;
 
   if (curr_pathname == NULL)
@@ -193,9 +197,9 @@
 
     while (p > p_base)
       {
-	p--;
-	if (ISSLASH (*p))
-	  break;
+        p--;
+        if (ISSLASH (*p))
+          break;
       }
 
     q = (char *) xmalloc (p - curr_pathname + 1);
@@ -218,44 +222,47 @@
 
     while (rp > rel_installdir && cp > cp_base)
       {
-	bool same = false;
-	const char *rpi = rp;
-	const char *cpi = cp;
+        bool same = false;
+        const char *rpi = rp;
+        const char *cpi = cp;
 
-	while (rpi > rel_installdir && cpi > cp_base)
-	  {
-	    rpi--;
-	    cpi--;
-	    if (ISSLASH (*rpi) || ISSLASH (*cpi))
-	      {
-		if (ISSLASH (*rpi) && ISSLASH (*cpi))
-		  same = true;
-		break;
-	      }
-	    /* Do case-insensitive comparison if the filesystem is always or
-	       often case-insensitive.  It's better to accept the comparison
-	       if the difference is only in case, rather than to fail.  */
+        while (rpi > rel_installdir && cpi > cp_base)
+          {
+            rpi--;
+            cpi--;
+            if (ISSLASH (*rpi) || ISSLASH (*cpi))
+              {
+                if (ISSLASH (*rpi) && ISSLASH (*cpi))
+                  same = true;
+                break;
+              }
+            /* Do case-insensitive comparison if the file system is always or
+               often case-insensitive.  It's better to accept the comparison
+               if the difference is only in case, rather than to fail.  */
 #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
-	    /* Win32, Cygwin, OS/2, DOS - case insignificant filesystem */
-	    if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
-		!= (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
-	      break;
+            /* Win32, Cygwin, OS/2, DOS - case insignificant file system */
+            if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+                != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+              break;
 #else
-	    if (*rpi != *cpi)
-	      break;
+            if (*rpi != *cpi)
+              break;
 #endif
-	  }
-	if (!same)
-	  break;
-	/* The last pathname component was the same.  opi and cpi now point
-	   to the slash before it.  */
-	rp = rpi;
-	cp = cpi;
+          }
+        if (!same)
+          break;
+        /* The last pathname component was the same.  opi and cpi now point
+           to the slash before it.  */
+        rp = rpi;
+        cp = cpi;
       }
 
     if (rp > rel_installdir)
-      /* Unexpected: The curr_installdir does not end with rel_installdir.  */
-      return NULL;
+      {
+        /* Unexpected: The curr_installdir does not end with rel_installdir.  */
+        free (curr_installdir);
+        return NULL;
+      }
 
     {
       size_t curr_prefix_len = cp - curr_installdir;
@@ -264,11 +271,16 @@
       curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
 #ifdef NO_XMALLOC
       if (curr_prefix == NULL)
-	return NULL;
+        {
+          free (curr_installdir);
+          return NULL;
+        }
 #endif
       memcpy (curr_prefix, curr_installdir, curr_prefix_len);
       curr_prefix[curr_prefix_len] = '\0';
 
+      free (curr_installdir);
+
       return curr_prefix;
     }
   }
@@ -281,7 +293,12 @@
 /* Full pathname of shared library, or NULL.  */
 static char *shared_library_fullname;
 
-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+/* Native Win32 only.
+   On Cygwin, it is better to use the Cygwin provided /proc interface, than
+   to use native Win32 API and cygwin_conv_to_posix_path, because it supports
+   longer file names
+   (see <http://cygwin.com/ml/cygwin/2011-01/msg00410.html>).  */
 
 /* Determine the full pathname of the shared library when it is loaded.  */
 
@@ -296,44 +313,28 @@
       static char location[MAX_PATH];
 
       if (!GetModuleFileName (module_handle, location, sizeof (location)))
-	/* Shouldn't happen.  */
-	return FALSE;
+        /* Shouldn't happen.  */
+        return FALSE;
 
       if (!IS_PATH_WITH_DIR (location))
-	/* Shouldn't happen.  */
-	return FALSE;
+        /* Shouldn't happen.  */
+        return FALSE;
 
-      {
-#if defined __CYGWIN__
-	/* On Cygwin, we need to convert paths coming from Win32 system calls
-	   to the Unix-like slashified notation.  */
-	static char location_as_posix_path[2 * MAX_PATH];
-	/* There's no error return defined for cygwin_conv_to_posix_path.
-	   See cygwin-api/func-cygwin-conv-to-posix-path.html.
-	   Does it overflow the buffer of expected size MAX_PATH or does it
-	   truncate the path?  I don't know.  Let's catch both.  */
-	cygwin_conv_to_posix_path (location, location_as_posix_path);
-	location_as_posix_path[MAX_PATH - 1] = '\0';
-	if (strlen (location_as_posix_path) >= MAX_PATH - 1)
-	  /* A sign of buffer overflow or path truncation.  */
-	  return FALSE;
-	shared_library_fullname = strdup (location_as_posix_path);
-#else
-	shared_library_fullname = strdup (location);
-#endif
-      }
+      shared_library_fullname = strdup (location);
     }
 
   return TRUE;
 }
 
-#else /* Unix except Cygwin */
+#else /* Unix */
 
 static void
 find_shared_library_fullname ()
 {
-#if defined __linux__ && __GLIBC__ >= 2
-  /* Linux has /proc/self/maps. glibc 2 has the getline() function.  */
+#if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__
+  /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline()
+     function.
+     Cygwin >= 1.5 has /proc/self/maps and the getline() function too.  */
   FILE *fp;
 
   /* Open the current process' maps file.  It describes one VMA per line.  */
@@ -342,43 +343,43 @@
     {
       unsigned long address = (unsigned long) &find_shared_library_fullname;
       for (;;)
-	{
-	  unsigned long start, end;
-	  int c;
+        {
+          unsigned long start, end;
+          int c;
 
-	  if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
-	    break;
-	  if (address >= start && address <= end - 1)
-	    {
-	      /* Found it.  Now see if this line contains a filename.  */
-	      while (c = getc (fp), c != EOF && c != '\n' && c != '/')
-		continue;
-	      if (c == '/')
-		{
-		  size_t size;
-		  int len;
+          if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+            break;
+          if (address >= start && address <= end - 1)
+            {
+              /* Found it.  Now see if this line contains a filename.  */
+              while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+                continue;
+              if (c == '/')
+                {
+                  size_t size;
+                  int len;
 
-		  ungetc (c, fp);
-		  shared_library_fullname = NULL; size = 0;
-		  len = getline (&shared_library_fullname, &size, fp);
-		  if (len >= 0)
-		    {
-		      /* Success: filled shared_library_fullname.  */
-		      if (len > 0 && shared_library_fullname[len - 1] == '\n')
-			shared_library_fullname[len - 1] = '\0';
-		    }
-		}
-	      break;
-	    }
-	  while (c = getc (fp), c != EOF && c != '\n')
-	    continue;
-	}
+                  ungetc (c, fp);
+                  shared_library_fullname = NULL; size = 0;
+                  len = getline (&shared_library_fullname, &size, fp);
+                  if (len >= 0)
+                    {
+                      /* Success: filled shared_library_fullname.  */
+                      if (len > 0 && shared_library_fullname[len - 1] == '\n')
+                        shared_library_fullname[len - 1] = '\0';
+                    }
+                }
+              break;
+            }
+          while (c = getc (fp), c != EOF && c != '\n')
+            continue;
+        }
       fclose (fp);
     }
 #endif
 }
 
-#endif /* (WIN32 or Cygwin) / (Unix except Cygwin) */
+#endif /* WIN32 / Unix */
 
 /* Return the full pathname of the current shared library.
    Return NULL if unknown.
@@ -386,7 +387,7 @@
 static char *
 get_shared_library_fullname ()
 {
-#if !(defined _WIN32 || defined __WIN32__ || defined __CYGWIN__)
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
   static bool tried_find_shared_library_fullname;
   if (!tried_find_shared_library_fullname)
     {
@@ -400,7 +401,9 @@
 #endif /* PIC */
 
 /* Returns the pathname, relocated according to the current installation
-   directory.  */
+   directory.
+   The returned string is either PATHNAME unmodified or a freshly allocated
+   string that you can free with free() after casting it to 'char *'.  */
 const char *
 relocate (const char *pathname)
 {
@@ -411,55 +414,69 @@
   if (!initialized)
     {
       /* At this point, orig_prefix and curr_prefix likely have already been
-	 set through the main program's set_program_name_and_installdir
-	 function.  This is sufficient in the case that the library has
-	 initially been installed in the same orig_prefix.  But we can do
-	 better, to also cover the cases that 1. it has been installed
-	 in a different prefix before being moved to orig_prefix and (later)
-	 to curr_prefix, 2. unlike the program, it has not moved away from
-	 orig_prefix.  */
+         set through the main program's set_program_name_and_installdir
+         function.  This is sufficient in the case that the library has
+         initially been installed in the same orig_prefix.  But we can do
+         better, to also cover the cases that 1. it has been installed
+         in a different prefix before being moved to orig_prefix and (later)
+         to curr_prefix, 2. unlike the program, it has not moved away from
+         orig_prefix.  */
       const char *orig_installprefix = INSTALLPREFIX;
       const char *orig_installdir = INSTALLDIR;
-      const char *curr_prefix_better;
+      char *curr_prefix_better;
 
       curr_prefix_better =
-	compute_curr_prefix (orig_installprefix, orig_installdir,
-			     get_shared_library_fullname ());
-      if (curr_prefix_better == NULL)
-	curr_prefix_better = curr_prefix;
+        compute_curr_prefix (orig_installprefix, orig_installdir,
+                             get_shared_library_fullname ());
 
-      set_relocation_prefix (orig_installprefix, curr_prefix_better);
+      set_relocation_prefix (orig_installprefix,
+                             curr_prefix_better != NULL
+                             ? curr_prefix_better
+                             : curr_prefix);
+
+      if (curr_prefix_better != NULL)
+        free (curr_prefix_better);
 
       initialized = 1;
     }
 #endif
 
   /* Note: It is not necessary to perform case insensitive comparison here,
-     even for DOS-like filesystems, because the pathname argument was
+     even for DOS-like file systems, because the pathname argument was
      typically created from the same Makefile variable as orig_prefix came
      from.  */
   if (orig_prefix != NULL && curr_prefix != NULL
       && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
     {
       if (pathname[orig_prefix_len] == '\0')
-	/* pathname equals orig_prefix.  */
-	return curr_prefix;
-      if (ISSLASH (pathname[orig_prefix_len]))
-	{
-	  /* pathname starts with orig_prefix.  */
-	  const char *pathname_tail = &pathname[orig_prefix_len];
-	  char *result =
-	    (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+        {
+          /* pathname equals orig_prefix.  */
+          char *result = (char *) xmalloc (strlen (curr_prefix) + 1);
 
 #ifdef NO_XMALLOC
-	  if (result != NULL)
+          if (result != NULL)
 #endif
-	    {
-	      memcpy (result, curr_prefix, curr_prefix_len);
-	      strcpy (result + curr_prefix_len, pathname_tail);
-	      return result;
-	    }
-	}
+            {
+              strcpy (result, curr_prefix);
+              return result;
+            }
+        }
+      else if (ISSLASH (pathname[orig_prefix_len]))
+        {
+          /* pathname starts with orig_prefix.  */
+          const char *pathname_tail = &pathname[orig_prefix_len];
+          char *result =
+            (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+
+#ifdef NO_XMALLOC
+          if (result != NULL)
+#endif
+            {
+              memcpy (result, curr_prefix, curr_prefix_len);
+              strcpy (result + curr_prefix_len, pathname_tail);
+              return result;
+            }
+        }
     }
   /* Nothing to relocate.  */
   return pathname;
diff --git a/lib/relocatable.h b/lib/relocatable.h
index f6d3832..68fe83e 100644
--- a/lib/relocatable.h
+++ b/lib/relocatable.h
@@ -1,5 +1,5 @@
 /* Provide relocatable packages.
-   Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
    This program is free software; you can redistribute it and/or modify it
@@ -46,23 +46,27 @@
    instead of "/").  */
 extern RELOCATABLE_DLL_EXPORTED void
        set_relocation_prefix (const char *orig_prefix,
-			      const char *curr_prefix);
+                              const char *curr_prefix);
 
 /* Returns the pathname, relocated according to the current installation
-   directory.  */
+   directory.
+   The returned string is either PATHNAME unmodified or a freshly allocated
+   string that you can free with free() after casting it to 'char *'.  */
 extern const char * relocate (const char *pathname);
 
-/* Memory management: relocate() leaks memory, because it has to construct
-   a fresh pathname.  If this is a problem because your program calls
-   relocate() frequently, think about caching the result.  */
+/* Memory management: relocate() potentially allocates memory, because it has
+   to construct a fresh pathname.  If this is a problem because your program
+   calls relocate() frequently, think about caching the result.  Or free the
+   return value if it was different from the argument pathname.  */
 
 /* Convenience function:
    Computes the current installation prefix, based on the original
    installation prefix, the original installation directory of a particular
-   file, and the current pathname of this file.  Returns NULL upon failure.  */
-extern const char * compute_curr_prefix (const char *orig_installprefix,
-					 const char *orig_installdir,
-					 const char *curr_pathname);
+   file, and the current pathname of this file.
+   Returns it, freshly allocated.  Returns NULL upon failure.  */
+extern char * compute_curr_prefix (const char *orig_installprefix,
+                                   const char *orig_installdir,
+                                   const char *curr_pathname);
 
 #else
 
diff --git a/libcharset/lib/ChangeLog b/libcharset/lib/ChangeLog
index 9938df8..a2c3fe9 100644
--- a/libcharset/lib/ChangeLog
+++ b/libcharset/lib/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-28  Bruno Haible  <bruno@clisp.org>
+
+	* relocatable.h: Update from gnulib.
+	* relocatable.c: Likewise.
+
 2009-12-13  Bruno Haible  <bruno@clisp.org>
 
 	* localcharset.c (locale_charset): Fix comment about use of GetACP.
diff --git a/libcharset/lib/relocatable.c b/libcharset/lib/relocatable.c
index 09ff8c9..cbff85f 100644
--- a/libcharset/lib/relocatable.c
+++ b/libcharset/lib/relocatable.c
@@ -1,5 +1,5 @@
 /* Provide relocatable packages.
-   Copyright (C) 2003-2006, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
    This program is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
    This must come before <config.h> because <config.h> may include
    <features.h>, and once <features.h> has been included, it's too late.  */
 #ifndef _GNU_SOURCE
-# define _GNU_SOURCE	1
+# define _GNU_SOURCE 1
 #endif
 
 #include <config.h>
@@ -43,7 +43,7 @@
 # include "xalloc.h"
 #endif
 
-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 #endif
@@ -70,8 +70,8 @@
    ISSLASH(C)           tests whether C is a directory separator character.
    IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
  */
-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
-  /* Win32, Cygwin, OS/2, DOS */
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
 # define ISSLASH(C) ((C) == '/' || (C) == '\\')
 # define HAS_DEVICE(P) \
     ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
@@ -86,6 +86,9 @@
 # define FILE_SYSTEM_PREFIX_LEN(P) 0
 #endif
 
+/* Use the system functions, not the gnulib overrides in this file.  */
+#undef malloc
+
 /* Original installation prefix.  */
 static char *orig_prefix;
 static size_t orig_prefix_len;
@@ -102,11 +105,11 @@
    instead of "/").  */
 static void
 set_this_relocation_prefix (const char *orig_prefix_arg,
-			    const char *curr_prefix_arg)
+                            const char *curr_prefix_arg)
 {
   if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
       /* Optimization: if orig_prefix and curr_prefix are equal, the
-	 relocation is a nop.  */
+         relocation is a nop.  */
       && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
     {
       /* Duplicate the argument strings.  */
@@ -118,14 +121,14 @@
 #ifdef NO_XMALLOC
       if (memory != NULL)
 #endif
-	{
-	  memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
-	  orig_prefix = memory;
-	  memory += orig_prefix_len + 1;
-	  memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
-	  curr_prefix = memory;
-	  return;
-	}
+        {
+          memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+          orig_prefix = memory;
+          memory += orig_prefix_len + 1;
+          memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+          curr_prefix = memory;
+          return;
+        }
     }
   orig_prefix = NULL;
   curr_prefix = NULL;
@@ -168,8 +171,8 @@
 #endif
 char *
 compute_curr_prefix (const char *orig_installprefix,
-		     const char *orig_installdir,
-		     const char *curr_pathname)
+                     const char *orig_installdir,
+                     const char *curr_pathname)
 {
   char *curr_installdir;
   const char *rel_installdir;
@@ -194,9 +197,9 @@
 
     while (p > p_base)
       {
-	p--;
-	if (ISSLASH (*p))
-	  break;
+        p--;
+        if (ISSLASH (*p))
+          break;
       }
 
     q = (char *) xmalloc (p - curr_pathname + 1);
@@ -219,46 +222,46 @@
 
     while (rp > rel_installdir && cp > cp_base)
       {
-	bool same = false;
-	const char *rpi = rp;
-	const char *cpi = cp;
+        bool same = false;
+        const char *rpi = rp;
+        const char *cpi = cp;
 
-	while (rpi > rel_installdir && cpi > cp_base)
-	  {
-	    rpi--;
-	    cpi--;
-	    if (ISSLASH (*rpi) || ISSLASH (*cpi))
-	      {
-		if (ISSLASH (*rpi) && ISSLASH (*cpi))
-		  same = true;
-		break;
-	      }
-	    /* Do case-insensitive comparison if the filesystem is always or
-	       often case-insensitive.  It's better to accept the comparison
-	       if the difference is only in case, rather than to fail.  */
+        while (rpi > rel_installdir && cpi > cp_base)
+          {
+            rpi--;
+            cpi--;
+            if (ISSLASH (*rpi) || ISSLASH (*cpi))
+              {
+                if (ISSLASH (*rpi) && ISSLASH (*cpi))
+                  same = true;
+                break;
+              }
+            /* Do case-insensitive comparison if the file system is always or
+               often case-insensitive.  It's better to accept the comparison
+               if the difference is only in case, rather than to fail.  */
 #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
-	    /* Win32, Cygwin, OS/2, DOS - case insignificant filesystem */
-	    if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
-		!= (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
-	      break;
+            /* Win32, Cygwin, OS/2, DOS - case insignificant file system */
+            if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+                != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+              break;
 #else
-	    if (*rpi != *cpi)
-	      break;
+            if (*rpi != *cpi)
+              break;
 #endif
-	  }
-	if (!same)
-	  break;
-	/* The last pathname component was the same.  opi and cpi now point
-	   to the slash before it.  */
-	rp = rpi;
-	cp = cpi;
+          }
+        if (!same)
+          break;
+        /* The last pathname component was the same.  opi and cpi now point
+           to the slash before it.  */
+        rp = rpi;
+        cp = cpi;
       }
 
     if (rp > rel_installdir)
       {
-	/* Unexpected: The curr_installdir does not end with rel_installdir.  */
-	free (curr_installdir);
-	return NULL;
+        /* Unexpected: The curr_installdir does not end with rel_installdir.  */
+        free (curr_installdir);
+        return NULL;
       }
 
     {
@@ -268,10 +271,10 @@
       curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
 #ifdef NO_XMALLOC
       if (curr_prefix == NULL)
-	{
-	  free (curr_installdir);
-	  return NULL;
-	}
+        {
+          free (curr_installdir);
+          return NULL;
+        }
 #endif
       memcpy (curr_prefix, curr_installdir, curr_prefix_len);
       curr_prefix[curr_prefix_len] = '\0';
@@ -290,7 +293,12 @@
 /* Full pathname of shared library, or NULL.  */
 static char *shared_library_fullname;
 
-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+/* Native Win32 only.
+   On Cygwin, it is better to use the Cygwin provided /proc interface, than
+   to use native Win32 API and cygwin_conv_to_posix_path, because it supports
+   longer file names
+   (see <http://cygwin.com/ml/cygwin/2011-01/msg00410.html>).  */
 
 /* Determine the full pathname of the shared library when it is loaded.  */
 
@@ -305,44 +313,28 @@
       static char location[MAX_PATH];
 
       if (!GetModuleFileName (module_handle, location, sizeof (location)))
-	/* Shouldn't happen.  */
-	return FALSE;
+        /* Shouldn't happen.  */
+        return FALSE;
 
       if (!IS_PATH_WITH_DIR (location))
-	/* Shouldn't happen.  */
-	return FALSE;
+        /* Shouldn't happen.  */
+        return FALSE;
 
-      {
-#if defined __CYGWIN__
-	/* On Cygwin, we need to convert paths coming from Win32 system calls
-	   to the Unix-like slashified notation.  */
-	static char location_as_posix_path[2 * MAX_PATH];
-	/* There's no error return defined for cygwin_conv_to_posix_path.
-	   See cygwin-api/func-cygwin-conv-to-posix-path.html.
-	   Does it overflow the buffer of expected size MAX_PATH or does it
-	   truncate the path?  I don't know.  Let's catch both.  */
-	cygwin_conv_to_posix_path (location, location_as_posix_path);
-	location_as_posix_path[MAX_PATH - 1] = '\0';
-	if (strlen (location_as_posix_path) >= MAX_PATH - 1)
-	  /* A sign of buffer overflow or path truncation.  */
-	  return FALSE;
-	shared_library_fullname = strdup (location_as_posix_path);
-#else
-	shared_library_fullname = strdup (location);
-#endif
-      }
+      shared_library_fullname = strdup (location);
     }
 
   return TRUE;
 }
 
-#else /* Unix except Cygwin */
+#else /* Unix */
 
 static void
 find_shared_library_fullname ()
 {
-#if defined __linux__ && __GLIBC__ >= 2
-  /* Linux has /proc/self/maps. glibc 2 has the getline() function.  */
+#if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__
+  /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline()
+     function.
+     Cygwin >= 1.5 has /proc/self/maps and the getline() function too.  */
   FILE *fp;
 
   /* Open the current process' maps file.  It describes one VMA per line.  */
@@ -351,43 +343,43 @@
     {
       unsigned long address = (unsigned long) &find_shared_library_fullname;
       for (;;)
-	{
-	  unsigned long start, end;
-	  int c;
+        {
+          unsigned long start, end;
+          int c;
 
-	  if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
-	    break;
-	  if (address >= start && address <= end - 1)
-	    {
-	      /* Found it.  Now see if this line contains a filename.  */
-	      while (c = getc (fp), c != EOF && c != '\n' && c != '/')
-		continue;
-	      if (c == '/')
-		{
-		  size_t size;
-		  int len;
+          if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+            break;
+          if (address >= start && address <= end - 1)
+            {
+              /* Found it.  Now see if this line contains a filename.  */
+              while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+                continue;
+              if (c == '/')
+                {
+                  size_t size;
+                  int len;
 
-		  ungetc (c, fp);
-		  shared_library_fullname = NULL; size = 0;
-		  len = getline (&shared_library_fullname, &size, fp);
-		  if (len >= 0)
-		    {
-		      /* Success: filled shared_library_fullname.  */
-		      if (len > 0 && shared_library_fullname[len - 1] == '\n')
-			shared_library_fullname[len - 1] = '\0';
-		    }
-		}
-	      break;
-	    }
-	  while (c = getc (fp), c != EOF && c != '\n')
-	    continue;
-	}
+                  ungetc (c, fp);
+                  shared_library_fullname = NULL; size = 0;
+                  len = getline (&shared_library_fullname, &size, fp);
+                  if (len >= 0)
+                    {
+                      /* Success: filled shared_library_fullname.  */
+                      if (len > 0 && shared_library_fullname[len - 1] == '\n')
+                        shared_library_fullname[len - 1] = '\0';
+                    }
+                }
+              break;
+            }
+          while (c = getc (fp), c != EOF && c != '\n')
+            continue;
+        }
       fclose (fp);
     }
 #endif
 }
 
-#endif /* (WIN32 or Cygwin) / (Unix except Cygwin) */
+#endif /* WIN32 / Unix */
 
 /* Return the full pathname of the current shared library.
    Return NULL if unknown.
@@ -395,7 +387,7 @@
 static char *
 get_shared_library_fullname ()
 {
-#if !(defined _WIN32 || defined __WIN32__ || defined __CYGWIN__)
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
   static bool tried_find_shared_library_fullname;
   if (!tried_find_shared_library_fullname)
     {
@@ -422,69 +414,69 @@
   if (!initialized)
     {
       /* At this point, orig_prefix and curr_prefix likely have already been
-	 set through the main program's set_program_name_and_installdir
-	 function.  This is sufficient in the case that the library has
-	 initially been installed in the same orig_prefix.  But we can do
-	 better, to also cover the cases that 1. it has been installed
-	 in a different prefix before being moved to orig_prefix and (later)
-	 to curr_prefix, 2. unlike the program, it has not moved away from
-	 orig_prefix.  */
+         set through the main program's set_program_name_and_installdir
+         function.  This is sufficient in the case that the library has
+         initially been installed in the same orig_prefix.  But we can do
+         better, to also cover the cases that 1. it has been installed
+         in a different prefix before being moved to orig_prefix and (later)
+         to curr_prefix, 2. unlike the program, it has not moved away from
+         orig_prefix.  */
       const char *orig_installprefix = INSTALLPREFIX;
       const char *orig_installdir = INSTALLDIR;
       char *curr_prefix_better;
 
       curr_prefix_better =
-	compute_curr_prefix (orig_installprefix, orig_installdir,
-			     get_shared_library_fullname ());
+        compute_curr_prefix (orig_installprefix, orig_installdir,
+                             get_shared_library_fullname ());
 
       set_relocation_prefix (orig_installprefix,
-			     curr_prefix_better != NULL
-			     ? curr_prefix_better
-			     : curr_prefix);
+                             curr_prefix_better != NULL
+                             ? curr_prefix_better
+                             : curr_prefix);
 
       if (curr_prefix_better != NULL)
-	free (curr_prefix_better);
+        free (curr_prefix_better);
 
       initialized = 1;
     }
 #endif
 
   /* Note: It is not necessary to perform case insensitive comparison here,
-     even for DOS-like filesystems, because the pathname argument was
+     even for DOS-like file systems, because the pathname argument was
      typically created from the same Makefile variable as orig_prefix came
      from.  */
   if (orig_prefix != NULL && curr_prefix != NULL
       && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
     {
       if (pathname[orig_prefix_len] == '\0')
-	{
-	  /* pathname equals orig_prefix.  */
-	  char *result = (char *) xmalloc (strlen (curr_prefix) + 1);
+        {
+          /* pathname equals orig_prefix.  */
+          char *result = (char *) xmalloc (strlen (curr_prefix) + 1);
 
 #ifdef NO_XMALLOC
-	  if (result != NULL)
+          if (result != NULL)
 #endif
-	    {
-	      strcpy (result, curr_prefix);
-	      return result;
-	    }
-	}
+            {
+              strcpy (result, curr_prefix);
+              return result;
+            }
+        }
       else if (ISSLASH (pathname[orig_prefix_len]))
-	{
-	  /* pathname starts with orig_prefix.  */
-	  const char *pathname_tail = &pathname[orig_prefix_len];
-	  char *result =
-	    (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+        {
+          /* pathname starts with orig_prefix.  */
+          const char *pathname_tail = &pathname[orig_prefix_len];
+          char *result =
+            (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
 
 #ifdef NO_XMALLOC
-	  if (result != NULL)
+          if (result != NULL)
 #endif
-	    {
-	      memcpy (result, curr_prefix, curr_prefix_len);
-	      strcpy (result + curr_prefix_len, pathname_tail);
-	      return result;
-	    }
-	}
+            {
+              memcpy (result, curr_prefix, curr_prefix_len);
+              strcpy (result + curr_prefix_len, pathname_tail);
+              return result;
+            }
+        }
     }
   /* Nothing to relocate.  */
   return pathname;
diff --git a/libcharset/lib/relocatable.h b/libcharset/lib/relocatable.h
index 5dfd710..68fe83e 100644
--- a/libcharset/lib/relocatable.h
+++ b/libcharset/lib/relocatable.h
@@ -1,5 +1,5 @@
 /* Provide relocatable packages.
-   Copyright (C) 2003, 2005, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
    This program is free software; you can redistribute it and/or modify it
@@ -46,7 +46,7 @@
    instead of "/").  */
 extern RELOCATABLE_DLL_EXPORTED void
        set_relocation_prefix (const char *orig_prefix,
-			      const char *curr_prefix);
+                              const char *curr_prefix);
 
 /* Returns the pathname, relocated according to the current installation
    directory.
@@ -65,8 +65,8 @@
    file, and the current pathname of this file.
    Returns it, freshly allocated.  Returns NULL upon failure.  */
 extern char * compute_curr_prefix (const char *orig_installprefix,
-				   const char *orig_installdir,
-				   const char *curr_pathname);
+                                   const char *orig_installdir,
+                                   const char *curr_pathname);
 
 #else