nkiss

WIP
git clone git://git.nihaljere.xyz/nkiss
Log | Files | Refs

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:
Mutil.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