commit 02571aa1629b9b5c719efd01e80dfd26b96db27e from: Omar Polo date: Sat Jan 29 17:04:56 2022 UTC fetch_fid: return int instead of exiting on write(2) errors commit - 424338c25a4f53a85d832acd81761de9857e88e7 commit + 02571aa1629b9b5c719efd01e80dfd26b96db27e blob - c6d43653826cba945951b69e51ca1d0b9013d135 blob + a205d6b295360cd36e7c40e6572f08d5a299f20c --- kamiftp/ftp.c +++ kamiftp/ftp.c @@ -685,12 +685,13 @@ draw_progress(const char *pre, const struct progress * fflush(stdout); } -static void +static int fetch_fid(int fid, int fd, const char *name) { struct progress p = {0}; struct np_stat st; size_t r; + int ret = 0; char buf[BUFSIZ]; do_stat(fid, &st); @@ -707,8 +708,10 @@ fetch_fid(int fid, int fd, const char *name) for (off = 0; off < r; off += nw) if ((nw = write(fd, buf + off, r - off)) == 0 || - nw == -1) - err(1, "write"); + nw == -1) { + ret = -1; + goto end; + } p.done += r; draw_progress(name, &p); @@ -722,9 +725,11 @@ fetch_fid(int fid, int fd, const char *name) #endif } +end: putchar('\n'); do_clunk(fid); + return ret; } static void @@ -1102,7 +1107,10 @@ cmd_edit(int argc, const char **argv) strlcpy(p, *argv, sizeof(p)); name = basename(p); - fetch_fid(nfid, tmpfd, name); + if (fetch_fid(nfid, tmpfd, name)) { + warn("failed fetch or can't write %s", sfn); + goto end; + } close(tmpfd); spawn(ed, sfn, NULL); @@ -1166,7 +1174,8 @@ cmd_get(int argc, const char **argv) return; } - fetch_fid(nfid, fd, l); + if (fetch_fid(nfid, fd, l) == -1) + warn("write %s", l); close(fd); } @@ -1328,7 +1337,7 @@ static void cmd_page(int argc, const char **argv) { struct qid qid; - int nfid, tmpfd, miss; + int nfid, tmpfd, miss, r; char sfn[TMPFSTRLEN], p[PATH_MAX], *name, *errstr; const char *pager; @@ -1362,9 +1371,11 @@ cmd_page(int argc, const char **argv) strlcpy(p, *argv, sizeof(p)); name = basename(p); - fetch_fid(nfid, tmpfd, name); + if ((r = fetch_fid(nfid, tmpfd, name)) == -1) + warn("write %s", sfn); close(tmpfd); - spawn(pager, sfn, NULL); + if (r != -1) + spawn(pager, sfn, NULL); unlink(sfn); }