From: Chris Allegretta Date: Mon, 22 Jan 2001 22:17:08 +0000 (+0000) Subject: real_dir_from_tilde() - Rewritten using getpwent (suggected by Adam) X-Git-Tag: v0.9.99pre2~14 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=ee733e6d4cc784c1af123717fb71876345bc62d6;p=nano.git 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 --- diff --git a/ChangeLog b/ChangeLog index 1cb58777..978b679a 100644 --- 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 909c7eae..d7a1719a 100644 --- a/files.c +++ b/files.c @@ -29,6 +29,7 @@ #include #include #include +#include #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);