changeset 43197:4934ed73c7a4

(Fsubstitute_in_file_name): If the file name includes ~user, and there's no such user, don't discard everything before ~user.
author Eli Zaretskii <eliz@gnu.org>
date Fri, 08 Feb 2002 19:16:31 +0000
parents 006c566af674
children e0854e3f00b9
files src/fileio.c
diffstat 1 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c	Fri Feb 08 19:04:27 2002 +0000
+++ b/src/fileio.c	Fri Feb 08 19:16:31 2002 +0000
@@ -2025,6 +2025,7 @@
   int total = 0;
   int substituted = 0;
   unsigned char *xnm;
+  struct passwd *pw;
   Lisp_Object handler;
 
   CHECK_STRING (filename);
@@ -2063,8 +2064,27 @@
 #endif /* VMS */
 	      || IS_DIRECTORY_SEP (p[-1])))
 	{
-	  nm = p;
-	  substituted = 1;
+	  for (s = p; *s && (!IS_DIRECTORY_SEP (*s)
+#ifdef VMS
+			      && *s != ':'
+#endif /* VMS */
+			      ); s++);
+	  if (s > p + 1)
+	    {
+	      o = (unsigned char *) alloca (s - p + 1);
+	      bcopy ((char *) p, o, s - p);
+	      o [s - p] = 0;
+
+	      pw = (struct passwd *) getpwnam (o + 1);
+	    }
+	  /* If we have ~/ or ~user and `user' exists, discard
+	     everything up to ~.  But if `user' does not exist, leave
+	     ~user alone, it might be a literal file name.  */
+	  if (s == p + 1 || pw)
+	    {
+	      nm = p;
+	      substituted = 1;
+	    }
 	}
 #ifdef DOS_NT
       /* see comment in expand-file-name about drive specifiers */