commit ee733e6d4cc784c1af123717fb71876345bc62d6
parent 60cd6aa04f2de56459525f52a123742ea15814bc
Author: Chris Allegretta <chrisa@asty.org>
Date: Mon, 22 Jan 2001 22:17:08 +0000
real_dir_from_tilde() - Rewritten using getpwent (suggected by Adam)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@498 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Diffstat:
M | ChangeLog | | | 2 | ++ |
M | files.c | | | 53 | +++++++++++++---------------------------------------- |
2 files changed, 15 insertions(+), 40 deletions(-)
diff --git 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
@@ -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);