]> git.wh0rd.org Git - nano.git/commitdiff
real_dir_from_tilde() - Rewritten using getpwent (suggected by Adam)
authorChris Allegretta <chrisa@asty.org>
Mon, 22 Jan 2001 22:17:08 +0000 (22:17 +0000)
committerChris Allegretta <chrisa@asty.org>
Mon, 22 Jan 2001 22:17:08 +0000 (22:17 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@498 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
files.c

index 1cb587779dfcb15cb9476689effca71f05f284e2..978b679a71b5fb43b24315f1017288071eca1a21 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +12,8 @@ General
          discovered by David Sobon).
   username_tab_completion()
        - Optimization and removal of useless vars (Rocco).
+  real_dir_from_tilde()
+       - Rewritten using getpwent (suggested by Adam).
 - global.c:
        - Don't define toggles global or toggle_init_one if using --tiny.
 - nano.c:
diff --git a/files.c b/files.c
index 909c7eaeb82484937a0e9857e68207273d0423d7..d7a1719a2ba30eeec74f396bf06cde628df72d71 100644 (file)
--- a/files.c
+++ b/files.c
@@ -29,6 +29,7 @@
 #include <errno.h>
 #include <ctype.h>
 #include <dirent.h>
+#include <pwd.h>
 
 #include "config.h"
 #include "proto.h"
@@ -581,8 +582,9 @@ int do_writeout_void(void)
  */
 char *real_dir_from_tilde(char *buf)
 {
-    char *dirtmp = NULL, *line = NULL, byte[1], *lineptr;
-    int fd, i, status, searchctr = 1;
+    char *dirtmp = NULL;
+    int searchctr = 1;
+    struct passwd *userdata;
 
     if (buf[0] == '~') {
        if (buf[1] == '~')
@@ -599,51 +601,22 @@ char *real_dir_from_tilde(char *buf)
            }
        } else if (buf[1] != 0) {
 
-           if ((fd = open("/etc/passwd", O_RDONLY)) == -1)
-               goto abort;
-
            /* Figure how how much of of the str we need to compare */
            for (searchctr = 1; buf[searchctr] != '/' &&
                 buf[searchctr] != 0; searchctr++);
 
-           do {
-               i = 0;
-               line = nmalloc(1);
-               while ((status = read(fd, byte, 1)) != 0
-                      && byte[0] != '\n') {
-
-                   line[i] = byte[0];
-                   i++;
-                   line = nrealloc(line, i + 1);
-               }
-               line[i] = 0;
-
-               if (i == 0)
-                   goto abort;
-
-               line[i] = 0;
-               lineptr = strtok(line, ":");
-
-               if (!strncmp(lineptr, &buf[1], searchctr - 1)) {
+           for (userdata = getpwent(); userdata != NULL && 
+                 strncmp(userdata->pw_name, &buf[1], searchctr - 1); 
+                 userdata = getpwent());
 
-                   /* Okay, skip to the password portion now */
-                   for (i = 0; i <= 4 && lineptr != NULL; i++)
-                       lineptr = strtok(NULL, ":");
-
-                   if (lineptr == NULL)
-                       goto abort;
-
-                   /* Else copy the new string into the new buf */
-                   dirtmp = nmalloc(strlen(buf) + 2 + strlen(lineptr));
-
-                   sprintf(dirtmp, "%s%s", lineptr, &buf[searchctr]);
-                   free(line);
-                   break;
-               }
+           if (userdata == NULL) /* No such user or getpwent() failed */
+               goto abort;
 
-               free(line);
+           /* Else copy the new string into the new buf */
+           dirtmp = nmalloc(strlen(buf) + 2 + strlen(userdata->pw_dir));
 
-           } while (status != 0);
+           sprintf(dirtmp, "%s%s", userdata->pw_dir, &buf[searchctr]);
+           endpwent();
        }
     } else
        dirtmp = mallocstrcpy(dirtmp, buf);