[2773] in BarnOwl Developers
[PATCH 1/2] Fixed :unsub to make it work if ~/.zephyr.subs is a symlink (trac 133)
daemon@ATHENA.MIT.EDU (Jason Gross)
Sat Nov 13 23:22:39 2010
From: Jason Gross <jgross@MIT.EDU>
To: barnowl-dev@mit.edu
Cc: Jason <jgross@mit.edu>
Date: Sat, 13 Nov 2010 23:22:35 -0500
From: Jason <jgross@mit.edu>
rename() fails if the new name is a symlink (despite the man page for
rename saying that it should overwrite the file!?). I've changed
owl_util_file_deleteline to call canonicalize_file_name on the passed
file name first. The new (backup) file is written in the resolved
directory, not the directory where the symlink itself is found.
Additionally, I corrected free(filename) to owl_free(filename) in the
two places that it occurred.
---
util.c | 32 ++++++++++++++++++++++----------
1 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/util.c b/util.c
index 6546c73..e00da2e 100644
--- a/util.c
+++ b/util.c
@@ -384,7 +384,7 @@ char *owl_util_stripnewlines(const char *in)
*/
int owl_util_file_deleteline(const char *filename, const char *line, int backup)
{
- char *backupfile, *newfile, *buf = NULL;
+ char *actual_filename, *backupfile, *newfile, *buf = NULL;
FILE *old, *new;
struct stat st;
int numremoved = 0;
@@ -400,22 +400,32 @@ int owl_util_file_deleteline(const char *filename, const char *line, int backup)
return 0;
}
- newfile = owl_sprintf("%s.new", filename);
+ /* canonicalize filename and handle errors */
+ actual_filename = canonicalize_file_name(filename);
+ if (actual_filename == NULL) {
+ owl_function_error("Cannot canonicalize file name %s: %s",
+ actual_filename, strerror(errno));
+ return 0;
+ }
+
+ newfile = owl_sprintf("%s.new", actual_filename);
if ((new = fopen(newfile, "w")) == NULL) {
owl_function_error("Cannot open %s (for writing): %s",
- filename, strerror(errno));
- free(newfile);
+ actual_filename, strerror(errno));
+ owl_free(newfile);
fclose(old);
+ free(actual_filename);
return 0;
}
if (fchmod(fileno(new), st.st_mode & 0777) != 0) {
owl_function_error("Cannot set permissions on %s: %s",
- filename, strerror(errno));
+ actual_filename, strerror(errno));
unlink(newfile);
fclose(new);
- free(newfile);
+ owl_free(newfile);
fclose(old);
+ free(actual_filename);
return 0;
}
@@ -430,9 +440,9 @@ int owl_util_file_deleteline(const char *filename, const char *line, int backup)
fclose(old);
if (backup) {
- backupfile = owl_sprintf("%s.backup", filename);
+ backupfile = owl_sprintf("%s.backup", actual_filename);
unlink(backupfile);
- if (link(filename, backupfile) != 0) {
+ if (link(actual_filename, backupfile) != 0) {
owl_function_error("Cannot link %s: %s", backupfile, strerror(errno));
owl_free(backupfile);
unlink(newfile);
@@ -442,15 +452,17 @@ int owl_util_file_deleteline(const char *filename, const char *line, int backup)
owl_free(backupfile);
}
- if (rename(newfile, filename) != 0) {
+ if (rename(newfile, actual_filename) != 0) {
owl_function_error("Cannot move %s to %s: %s",
- newfile, filename, strerror(errno));
+ newfile, actual_filename, strerror(errno));
numremoved = 0;
}
unlink(newfile);
owl_free(newfile);
+ free(actual_filename);
+
return numremoved;
}
--
1.7.1