commit 21c15082bac137408154535db95264f9d7c7c3df
parent 14dcc0b12380771566374aa5203741f96ba0c6dd
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Sun, 14 Mar 2021 14:20:32 -0500
util.c: made mv more robust
Diffstat:
M | util.c | | | 21 | ++++++++++++--------- |
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/util.c b/util.c
@@ -156,7 +156,8 @@ int
mv(char *oldpath, char *newpath)
{
char buf[BUFSIZ];
- FILE *old, *new;
+ FILE *old = NULL, *new = NULL;
+ int c;
/* try simply renaming */
if (rename(oldpath, newpath) == -1) {
@@ -164,16 +165,14 @@ mv(char *oldpath, char *newpath)
* copy content of the file */
if (errno == EXDEV) {
if ((old = fopen(oldpath, "r")) == NULL)
- return -1;
+ goto err;
- if ((new = fopen(newpath, "w")) == NULL) {
- fclose(old);
- return -1;
- }
+ if ((new = fopen(newpath, "w")) == NULL)
+ goto err;
- /* TODO proper error handling */
- while (fgets(buf, BUFSIZ, old) != NULL)
- fputs(buf, new);
+ while ((c = fread(buf, sizeof(char), BUFSIZ, old)) > 0)
+ if (fwrite(buf, sizeof(char), c, new) < c)
+ goto err;
fclose(old);
fclose(new);
@@ -183,6 +182,10 @@ mv(char *oldpath, char *newpath)
}
return 0;
+err:
+ if (old) fclose(old);
+ if (new) fclose(new);
+ return -1;
}
/* drop lines matching a, add lines matching b, while retaining reverse