Commit 1bd0ce28 authored by Chris Allegretta's avatar Chris Allegretta
Browse files

Okay, now the permissions should be fixed too

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@390 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
No related merge requests found
Showing with 79 additions and 82 deletions
+79 -82
......@@ -13,6 +13,8 @@ General
- OOPS, line up link/unlink/rename check if conditional with
top if conditional. Option -l has been broken for 9 versions,
no one noticed?!
- Added saving perms at end of link so we can apply them to the
new file if --nofollow is used.
- winio.c:
edit_add()
- Off by one display error (fix by Rocco Corsi).
......
......@@ -302,7 +302,7 @@ int write_file(char *name, int tmp)
char buf[PATH_MAX + 1];
filestruct *fileptr;
int fd, mask = 0, realexists, anyexists;
struct stat st, st2;
struct stat st, lst, st2;
static char *realname = NULL;
if (!strcmp(name, "")) {
......@@ -321,13 +321,11 @@ int write_file(char *name, int tmp)
realname = mallocstrcpy(realname, name);
#endif
/* Save the state of file at the end of the symlink */
/* Save the state of file at the end of the symlink (if there is one) */
realexists = stat(realname, &st);
/* Check to see if the file is a regular file and FOLLOW_SYMLINKS is
set. If so then don't do the delete and recreate code which would
cause unexpected behavior */
anyexists = lstat(realname, &st);
/* Stat the link itself for the check... */
anyexists = lstat(realname, &lst);
/* New case: if the file exists, just give up */
if (tmp && anyexists != -1)
......@@ -335,7 +333,7 @@ int write_file(char *name, int tmp)
/* NOTE: If you change this statement, you MUST CHANGE the if
statement below (that starts "if ((!ISSET(FOLLOW_SYMLINKS)...")
to reflect whether or not to link/unlink/rename the file */
else if (ISSET(FOLLOW_SYMLINKS) || !S_ISLNK(st.st_mode)) {
else if (ISSET(FOLLOW_SYMLINKS) || !S_ISLNK(lst.st_mode) || tmp) {
/* Use O_EXCL if tmp == 1, I suppose */
if (tmp)
......@@ -434,8 +432,9 @@ int write_file(char *name, int tmp)
return -1;
}
if ((!ISSET(FOLLOW_SYMLINKS) && S_ISLNK(st.st_mode)) || tmp) {
if (realexists == -1) {
if (realexists == -1 || tmp ||
(!ISSET(FOLLOW_SYMLINKS) && S_ISLNK(lst.st_mode))) {
/* Use default umask as file permisions if file is a new file. */
mask = umask(0);
umask(mask);
......@@ -444,10 +443,11 @@ int write_file(char *name, int tmp)
mask = 0600;
else
mask = 0666 & ~mask;
} else
mask = st.st_mode;
} else {
if (!tmp && (!ISSET(FOLLOW_SYMLINKS) && S_ISLNK(lst.st_mode))) {
/* Use permissions from file we are overwriting. */
mask = st.st_mode;
if (unlink(realname) == -1) {
if (errno != ENOENT) {
statusbar(_("Could not open %s for writing: %s"),
......@@ -456,9 +456,6 @@ int write_file(char *name, int tmp)
return -1;
}
}
}
if (!tmp) {
if (link(buf, realname) != -1)
unlink(buf);
else if (errno != EPERM) {
......@@ -477,7 +474,6 @@ int write_file(char *name, int tmp)
statusbar(_("Could not set permissions %o on %s: %s"),
mask, realname, strerror(errno));
}
if (!tmp) {
strncpy(filename, realname, 132);
statusbar(_("Wrote %d lines"), lineswritten);
......@@ -521,10 +517,11 @@ int do_writeout(int exiting)
#endif
#ifdef NANO_EXTRA
if (exiting && !ISSET(TEMP_OPT) && !strcasecmp(answer, "zzy") && !did_cred) {
if (exiting && !ISSET(TEMP_OPT) && !strcasecmp(answer, "zzy")
&& !did_cred) {
do_credits();
did_cred = 1;
return - 1;
return -1;
}
#endif
if (strcmp(answer, filename)) {
......@@ -559,7 +556,7 @@ static char **homedirs;
/* Return a malloc()ed string containing the actual directory, used
* to convert ~user and ~/ notation...
*/
char *real_dir_from_tilde (char *buf)
char *real_dir_from_tilde(char *buf)
{
char *dirtmp = NULL, *line = NULL, byte[1], *lineptr;
int fd, i, status, searchctr = 1;
......@@ -573,25 +570,24 @@ char *real_dir_from_tilde (char *buf)
sprintf(dirtmp, "%s/%s", getenv("HOME"), &buf[2]);
}
}
else if (buf[1] != 0) {
} else if (buf[1] != 0) {
if((fd = open("/etc/passwd", O_RDONLY)) == -1)
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++)
;
buf[searchctr] != 0; searchctr++);
do {
i = 0;
line = nmalloc(1);
while ((status = read(fd, byte, 1)) != 0 && byte[0] != '\n') {
while ((status = read(fd, byte, 1)) != 0
&& byte[0] != '\n') {
line[i] = byte[0];
i++;
line = nrealloc(line, i+1);
line = nrealloc(line, i + 1);
}
line[i] = 0;
......@@ -622,13 +618,12 @@ char *real_dir_from_tilde (char *buf)
} while (status != 0);
}
}
else
} else
dirtmp = mallocstrcpy(dirtmp, buf);
return dirtmp;
abort:
abort:
dirtmp = mallocstrcpy(dirtmp, buf);
return dirtmp;
}
......@@ -685,7 +680,7 @@ char **username_tab_completion(char *buf, int *num_matches)
int fd, i = 0, status = 1;
char byte[1];
if((fd = open("/etc/passwd", O_RDONLY)) == -1) {
if ((fd = open("/etc/passwd", O_RDONLY)) == -1) {
return NULL;
}
......@@ -706,7 +701,7 @@ char **username_tab_completion(char *buf, int *num_matches)
line[i] = byte[0];
i++;
line = nrealloc(line, i+1);
line = nrealloc(line, i + 1);
}
if (i == 0)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment