X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lib%2Ffile.c;h=67b1d741c9c985364d3997ba6c0ca8c3177a0977;hp=7809db32bedbd1a2c2ce01c7a0beeccf68047b27;hb=49081299c673ceebc38d9a4f0985608cb3aecfce;hpb=1ffe18af5bf2fda6f7dc86c514b56c6a82ec3040 diff --git a/lib-lib/file.c b/lib-lib/file.c index 7809db3..67b1d74 100644 --- a/lib-lib/file.c +++ b/lib-lib/file.c @@ -38,8 +38,6 @@ #include "str.h" #include "file.h" -#include "../lib/debug.h" - #ifndef O_NOFOLLOW # define O_NOFOLLOW 0 #endif @@ -76,7 +74,6 @@ int safe_open(const char *path, int flags) if (lstat (path, &osb) < 0 || fstat(fd, &nsb) < 0 || compare_stat(&osb, &nsb) == -1) { - debug_print(1, ("%s is a symlink!\n", path)); close(fd); return -1; } @@ -255,14 +252,51 @@ int safe_fclose(FILE **f) return r; } +/* If rfc1524_expand_command() is used on a recv'd message, then + * the filename doesn't exist yet, but if its used while sending a message, + * then we need to rename the existing file. + * + * This function returns 0 on successful move, 1 on old file doesn't exist, + * 2 on new file already exists, and 3 on other failure. + */ + +/* note on access(2) use: No dangling symlink problems here due to + * safe_fopen(). + */ +int mutt_rename_file(char *oldfile, char *newfile) +{ + FILE *ofp, *nfp; + + if (access(oldfile, F_OK) != 0) + return 1; + if (access(newfile, F_OK) == 0) + return 2; + + ofp = fopen(oldfile, "r"); + if (!ofp) + return 3; + + nfp = safe_fopen(newfile, "w"); + if (!nfp) { + fclose (ofp); + return 3; + } + + mutt_copy_stream(ofp, nfp); + fclose(nfp); + fclose(ofp); + mutt_unlink(oldfile); + return 0; +} + /* Read a line from ``fp'' into the dynamically allocated ``s'', * increasing ``s'' if necessary. The ending "\n" or "\r\n" is removed. * If a line ends with "\", this char and the linefeed is removed, * and the next line is read too. */ -char *mutt_read_line(char *s, size_t *size, FILE * fp, int *line) +char *mutt_read_line(char *s, ssize_t *size, FILE * fp, int *line) { - size_t offset = 0; + ssize_t offset = 0; char *ch; if (!s) { @@ -311,7 +345,7 @@ int mutt_copy_stream(FILE *fin, FILE *fout) char buf[BUFSIZ]; size_t l; - while ((l = fread(buf, 1, sizeof (buf), fin)) > 0) { + while ((l = fread(buf, 1, sizeof(buf), fin)) > 0) { if (fwrite(buf, 1, l, fout) != l) return -1; } @@ -319,17 +353,16 @@ int mutt_copy_stream(FILE *fin, FILE *fout) return 0; } -int mutt_copy_bytes(FILE *in, FILE *out, size_t size) +int mutt_copy_bytes(FILE *in, FILE *out, ssize_t size) { char buf[BUFSIZ]; while (size > 0) { - size_t chunk = MIN(size, sizeof(buf)); + size_t chunk = MIN(size, ssizeof(buf)); if ((chunk = fread(buf, 1, chunk, in)) < 1) break; if (fwrite(buf, 1, chunk, out) != chunk) { - debug_print(1, ("fwrite() returned short byte count\n")); return -1; } size -= chunk;