Movatterモバイル変換


[0]ホーム

URL:


This is the mail archive of thelibc-alpha@sourceware.orgmailing list for theglibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav:[Date Prev] [Date Next][Thread Prev] [Thread Next]
Other format:[Raw text]

[PATCH 15/18] posix: Add common function to get home directory


This patch adds a common function to get the full home directoryfrom a user.  No functional changes expected.Checked on x86_64-linux-gnu.* posix/glob.c (get_home_directory): New function.(glob): Use get_home_directory.--- posix/glob.c | 145 +++++++++++++++++++++++------------------------------------ 1 file changed, 56 insertions(+), 89 deletions(-)diff --git a/posix/glob.c b/posix/glob.cindex d2cb871..c85342a 100644--- a/posix/glob.c+++ b/posix/glob.c@@ -265,6 +265,44 @@ next_brace_sub (const char *cp, int flags)   return *cp != '\0' ? cp : NULL; } +/* Obtain the full home directory path from user 'user_name' and writes it+   on char_array 'home_dir'.  */+static bool+get_home_directory (const char *user_name, struct char_array *home_dir)+{+  struct passwd *p;+#if defined HAVE_GETPWNAM_R || defined _LIBC+  struct passwd pwbuf;+  int save = errno;+  struct scratch_buffer pwtmpbuf;+  scratch_buffer_init (&pwtmpbuf);++  while (getpwnam_r (user_name, &pwbuf, pwtmpbuf.data, pwtmpbuf.length, &p)+ != 0)+    {+      if (errno != ERANGE)+{+  p = NULL;+  break;+}+      if (!scratch_buffer_grow (&pwtmpbuf))+return false;+      __set_errno (save);+    }+#else+  p = getpwnam (pwtmpbuf.data);+#endif++  bool retval = false;+  if (p != NULL)+    {+      if (char_array_set_str (home_dir, p->pw_dir))+retval = true;+    }+  scratch_buffer_free (&pwtmpbuf);+  return retval;+}+  /* Do glob searching for PATTERN, placing results in PGLOB.    The bits defined above may be set in FLAGS.@@ -650,38 +688,8 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),       success = __getlogin_r (user_name, sizeof (user_name)) == 0;       if (success) {-  struct passwd *p;-#   if defined HAVE_GETPWNAM_R || defined _LIBC-  struct passwd pwbuf;-  int save = errno;-  struct scratch_buffer pwtmpbuf;-  scratch_buffer_init (&pwtmpbuf);--  while (getpwnam_r (user_name, &pwbuf,-     pwtmpbuf.data, pwtmpbuf.length, &p)- != 0)-    {-      if (errno != ERANGE)-{-  p = NULL;-  break;-}-      if (!scratch_buffer_grow (&pwtmpbuf))-goto err_nospace;-      __set_errno (save);-    }-#   else-  p = getpwnam (pwtmpbuf.data);-#   endif-  if (p != NULL)-    {-      if (!char_array_set_str (&home_dir, p->pw_dir))-{-  scratch_buffer_free (&pwtmpbuf);-  goto err_nospace;-}-    }-  scratch_buffer_free (&pwtmpbuf);+  if (!get_home_directory (user_name, &home_dir))+    goto err_nospace; }     }   if (char_array_is_empty (&home_dir))@@ -694,10 +702,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),       else {   if (!char_array_set_str (&home_dir, "~"))-    {-      retval = GLOB_NOSPACE;-      goto out;-    }+    goto err_nospace; }     } #  endif /* WINDOWS32 */@@ -778,59 +783,21 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int),     }    /* Look up specific user's home directory.  */-  {-    struct passwd *p;-    struct scratch_buffer pwtmpbuf;-    scratch_buffer_init (&pwtmpbuf);--#  if defined HAVE_GETPWNAM_R || defined _LIBC-    struct passwd pwbuf;-    int save = errno;--    while (getpwnam_r (user_name, &pwbuf,-       pwtmpbuf.data, pwtmpbuf.length, &p) != 0)-      {-if (errno != ERANGE)-  {-    p = NULL;-    break;-  }-if (!scratch_buffer_grow (&pwtmpbuf))-  {-    retval = GLOB_NOSPACE;-    goto out;-  }-__set_errno (save);-      }-#  else-    p = getpwnam (user_name);-#  endif--    /* If we found a home directory use this.  */-    if (p != NULL)-      {-if (!char_array_set_str (&dirname, p->pw_dir))-  {-    scratch_buffer_free (&pwtmpbuf);-    retval = GLOB_NOSPACE;-    goto out;-  }--dirlen = strlen (p->pw_dir);-dirname_modified = true;-      }-    else-      {-if (flags & GLOB_TILDE_CHECK)-  {-  /* We have to regard it as an error if we cannot find the-     home directory.  */-    retval = GLOB_NOMATCH;-    goto out;-  }-      }-    scratch_buffer_free (&pwtmpbuf);-  }+  if (get_home_directory (user_name, &dirname))+    {+      dirlen = char_array_size (&dirname) - 1;+      dirname_modified = true;+    }+  else+    {+      if (flags & GLOB_TILDE_CHECK)+       /* We have to regard it as an error if we cannot find the+  home directory.  */+        {+  retval = GLOB_NOMATCH;+  goto out;+}+    } } # endif/* Not Amiga && not WINDOWS32.  */     }-- 2.7.4

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav:[Date Prev] [Date Next][Thread Prev] [Thread Next]

[8]ページ先頭

©2009-2026 Movatter.jp