begin to rework mailcap parsing a "bit".
[apps/madmutt.git] / lib-lib / file.c
index b51b1ff..67b1d74 100644 (file)
@@ -252,6 +252,43 @@ 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,