iimprove stream read and write error handling - stagit-gemini - Stagit for gemini protocol Openbsd Err thinkerwim.openbsd.amsterdam 70 hgit clone git://thinkerwim.org/stagit-gemini.git URL:git://thinkerwim.org/stagit-gemini.git thinkerwim.org 70 1Log /git/stagit-gemini/log.gph thinkerwim.org 70 1Files /git/stagit-gemini/files.gph thinkerwim.org 70 1Refs /git/stagit-gemini/refs.gph thinkerwim.org 70 1README /git/stagit-gemini/file/README.gph thinkerwim.org 70 1LICENSE /git/stagit-gemini/file/LICENSE.gph thinkerwim.org 70 i--- Err thinkerwim.openbsd.amsterdam 70 1commit cbb963db3795ea24cd0d68f73b415f9fc48922cc /git/stagit-gemini/commit/cbb963db3795ea24cd0d68f73b415f9fc48922cc.gph thinkerwim.org 70 1parent 1dd611d990843966e50b23dac30617d6aa5b2b2e /git/stagit-gemini/commit/1dd611d990843966e50b23dac30617d6aa5b2b2e.gph thinkerwim.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org thinkerwim.org 70 iDate: Sat, 19 Mar 2022 12:51:57 +0100 Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 iimprove stream read and write error handling Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 iDiffstat: Err thinkerwim.openbsd.amsterdam 70 i M stagit-gopher-index.c | 13 +++++++++++++ Err thinkerwim.openbsd.amsterdam 70 i M stagit-gopher.c | 35 ++++++++++++++++++++++++------- Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i2 files changed, 40 insertions(+), 8 deletions(-) Err thinkerwim.openbsd.amsterdam 70 i--- Err thinkerwim.openbsd.amsterdam 70 1diff --git a/stagit-gopher-index.c b/stagit-gopher-index.c /git/stagit-gemini/file/stagit-gopher-index.c.gph thinkerwim.org 70 i@@ -20,6 +20,16 @@ static const char *relpath = ""; Err thinkerwim.openbsd.amsterdam 70 i static char description[255] = "Repositories"; Err thinkerwim.openbsd.amsterdam 70 i static char *name = ""; Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i+/* Handle read or write errors for a FILE * stream */ Err thinkerwim.openbsd.amsterdam 70 i+void Err thinkerwim.openbsd.amsterdam 70 i+checkfileerror(FILE *fp, const char *name, int mode) Err thinkerwim.openbsd.amsterdam 70 i+{ Err thinkerwim.openbsd.amsterdam 70 i+ if (mode == 'r' && ferror(fp)) Err thinkerwim.openbsd.amsterdam 70 i+ errx(1, "read error: %s", name); Err thinkerwim.openbsd.amsterdam 70 i+ else if (mode == 'w' && (fflush(fp) || ferror(fp))) Err thinkerwim.openbsd.amsterdam 70 i+ errx(1, "write error: %s", name); Err thinkerwim.openbsd.amsterdam 70 i+} Err thinkerwim.openbsd.amsterdam 70 i+ Err thinkerwim.openbsd.amsterdam 70 i /* Format `len' columns of characters. If string is shorter pad the rest Err thinkerwim.openbsd.amsterdam 70 i * with characters `pad`. */ Err thinkerwim.openbsd.amsterdam 70 i int Err thinkerwim.openbsd.amsterdam 70 i@@ -289,6 +299,7 @@ main(int argc, char *argv[]) Err thinkerwim.openbsd.amsterdam 70 i description[strcspn(description, "\t\r\n")] = '\0'; Err thinkerwim.openbsd.amsterdam 70 i else Err thinkerwim.openbsd.amsterdam 70 i description[0] = '\0'; Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fp, "description", 'r'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fp); Err thinkerwim.openbsd.amsterdam 70 i } Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i@@ -303,5 +314,7 @@ main(int argc, char *argv[]) Err thinkerwim.openbsd.amsterdam 70 i git_repository_free(repo); Err thinkerwim.openbsd.amsterdam 70 i git_libgit2_shutdown(); Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(stdout, "", 'w'); Err thinkerwim.openbsd.amsterdam 70 i+ Err thinkerwim.openbsd.amsterdam 70 i return ret; Err thinkerwim.openbsd.amsterdam 70 i } Err thinkerwim.openbsd.amsterdam 70 1diff --git a/stagit-gopher.c b/stagit-gopher.c /git/stagit-gemini/file/stagit-gopher.c.gph thinkerwim.org 70 i@@ -83,6 +83,16 @@ static char lastoidstr[GIT_OID_HEXSZ + 2]; /* id + newline + NUL byte */ Err thinkerwim.openbsd.amsterdam 70 i static FILE *rcachefp, *wcachefp; Err thinkerwim.openbsd.amsterdam 70 i static const char *cachefile; Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i+/* Handle read or write errors for a FILE * stream */ Err thinkerwim.openbsd.amsterdam 70 i+void Err thinkerwim.openbsd.amsterdam 70 i+checkfileerror(FILE *fp, const char *name, int mode) Err thinkerwim.openbsd.amsterdam 70 i+{ Err thinkerwim.openbsd.amsterdam 70 i+ if (mode == 'r' && ferror(fp)) Err thinkerwim.openbsd.amsterdam 70 i+ errx(1, "read error: %s", name); Err thinkerwim.openbsd.amsterdam 70 i+ else if (mode == 'w' && (fflush(fp) || ferror(fp))) Err thinkerwim.openbsd.amsterdam 70 i+ errx(1, "write error: %s", name); Err thinkerwim.openbsd.amsterdam 70 i+} Err thinkerwim.openbsd.amsterdam 70 i+ Err thinkerwim.openbsd.amsterdam 70 i /* Format `len' columns of characters. If string is shorter pad the rest Err thinkerwim.openbsd.amsterdam 70 i * with characters `pad`. */ Err thinkerwim.openbsd.amsterdam 70 i int Err thinkerwim.openbsd.amsterdam 70 i@@ -878,6 +888,7 @@ writelog(FILE *fp, const git_oid *oid) Err thinkerwim.openbsd.amsterdam 70 i writeheader(fpfile, ci->summary); Err thinkerwim.openbsd.amsterdam 70 i printshowfile(fpfile, ci); Err thinkerwim.openbsd.amsterdam 70 i writefooter(fpfile); Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fpfile, path, 'w'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fpfile); Err thinkerwim.openbsd.amsterdam 70 i } Err thinkerwim.openbsd.amsterdam 70 i err: Err thinkerwim.openbsd.amsterdam 70 i@@ -1018,14 +1029,13 @@ writeblob(git_object *obj, const char *fpath, const char *filename, size_t files Err thinkerwim.openbsd.amsterdam 70 i fprintf(fp, " (%zuB)\n", filesize); Err thinkerwim.openbsd.amsterdam 70 i fputs("---\n", fp); Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i- if (git_blob_is_binary((git_blob *)obj)) { Err thinkerwim.openbsd.amsterdam 70 i+ if (git_blob_is_binary((git_blob *)obj)) Err thinkerwim.openbsd.amsterdam 70 i fputs("Binary file.\n", fp); Err thinkerwim.openbsd.amsterdam 70 i- } else { Err thinkerwim.openbsd.amsterdam 70 i+ else Err thinkerwim.openbsd.amsterdam 70 i lc = writeblobgph(fp, (git_blob *)obj); Err thinkerwim.openbsd.amsterdam 70 i- if (ferror(fp)) Err thinkerwim.openbsd.amsterdam 70 i- err(1, "fwrite"); Err thinkerwim.openbsd.amsterdam 70 i- } Err thinkerwim.openbsd.amsterdam 70 i+ Err thinkerwim.openbsd.amsterdam 70 i writefooter(fp); Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fp, fpath, 'w'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fp); Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i return lc; Err thinkerwim.openbsd.amsterdam 70 i@@ -1337,6 +1347,7 @@ main(int argc, char *argv[]) Err thinkerwim.openbsd.amsterdam 70 i if (fpread) { Err thinkerwim.openbsd.amsterdam 70 i if (!fgets(description, sizeof(description), fpread)) Err thinkerwim.openbsd.amsterdam 70 i description[0] = '\0'; Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fpread, path, 'r'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fpread); Err thinkerwim.openbsd.amsterdam 70 i } Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i@@ -1349,8 +1360,9 @@ main(int argc, char *argv[]) Err thinkerwim.openbsd.amsterdam 70 i if (fpread) { Err thinkerwim.openbsd.amsterdam 70 i if (!fgets(cloneurl, sizeof(cloneurl), fpread)) Err thinkerwim.openbsd.amsterdam 70 i cloneurl[0] = '\0'; Err thinkerwim.openbsd.amsterdam 70 i- cloneurl[strcspn(cloneurl, "\n")] = '\0'; Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fpread, path, 'r'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fpread); Err thinkerwim.openbsd.amsterdam 70 i+ cloneurl[strcspn(cloneurl, "\n")] = '\0'; Err thinkerwim.openbsd.amsterdam 70 i } Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i /* check LICENSE */ Err thinkerwim.openbsd.amsterdam 70 i@@ -1408,13 +1420,15 @@ main(int argc, char *argv[]) Err thinkerwim.openbsd.amsterdam 70 i while (!feof(rcachefp)) { Err thinkerwim.openbsd.amsterdam 70 i n = fread(buf, 1, sizeof(buf), rcachefp); Err thinkerwim.openbsd.amsterdam 70 i if (ferror(rcachefp)) Err thinkerwim.openbsd.amsterdam 70 i- err(1, "fread"); Err thinkerwim.openbsd.amsterdam 70 i+ break; Err thinkerwim.openbsd.amsterdam 70 i if (fwrite(buf, 1, n, fp) != n || Err thinkerwim.openbsd.amsterdam 70 i fwrite(buf, 1, n, wcachefp) != n) Err thinkerwim.openbsd.amsterdam 70 i- err(1, "fwrite"); Err thinkerwim.openbsd.amsterdam 70 i+ break; Err thinkerwim.openbsd.amsterdam 70 i } Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(rcachefp, cachefile, 'r'); Err thinkerwim.openbsd.amsterdam 70 i fclose(rcachefp); Err thinkerwim.openbsd.amsterdam 70 i } Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(wcachefp, tmppath, 'w'); Err thinkerwim.openbsd.amsterdam 70 i fclose(wcachefp); Err thinkerwim.openbsd.amsterdam 70 i } else { Err thinkerwim.openbsd.amsterdam 70 i if (head) Err thinkerwim.openbsd.amsterdam 70 i@@ -1424,6 +1438,7 @@ main(int argc, char *argv[]) Err thinkerwim.openbsd.amsterdam 70 i fprintf(fp, "[0|Atom feed|%s/atom.xml|server|port]\n", relpath); Err thinkerwim.openbsd.amsterdam 70 i fprintf(fp, "[0|Atom feed (tags)|%s/tags.xml|server|port]\n", relpath); Err thinkerwim.openbsd.amsterdam 70 i writefooter(fp); Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fp, "log.gph", 'w'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fp); Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i /* files for HEAD */ Err thinkerwim.openbsd.amsterdam 70 i@@ -1432,6 +1447,7 @@ main(int argc, char *argv[]) Err thinkerwim.openbsd.amsterdam 70 i if (head) Err thinkerwim.openbsd.amsterdam 70 i writefiles(fp, head); Err thinkerwim.openbsd.amsterdam 70 i writefooter(fp); Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fp, "files.gph", 'w'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fp); Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i /* summary page with branches and tags */ Err thinkerwim.openbsd.amsterdam 70 i@@ -1439,16 +1455,19 @@ main(int argc, char *argv[]) Err thinkerwim.openbsd.amsterdam 70 i writeheader(fp, "Refs"); Err thinkerwim.openbsd.amsterdam 70 i writerefs(fp); Err thinkerwim.openbsd.amsterdam 70 i writefooter(fp); Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fp, "refs.gph", 'w'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fp); Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i /* Atom feed */ Err thinkerwim.openbsd.amsterdam 70 i fp = efopen("atom.xml", "w"); Err thinkerwim.openbsd.amsterdam 70 i writeatom(fp, 1); Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fp, "atom.xml", 'w'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fp); Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i /* Atom feed for tags / releases */ Err thinkerwim.openbsd.amsterdam 70 i fp = efopen("tags.xml", "w"); Err thinkerwim.openbsd.amsterdam 70 i writeatom(fp, 0); Err thinkerwim.openbsd.amsterdam 70 i+ checkfileerror(fp, "tags.xml", 'w'); Err thinkerwim.openbsd.amsterdam 70 i fclose(fp); Err thinkerwim.openbsd.amsterdam 70 i Err thinkerwim.openbsd.amsterdam 70 i /* rename new cache file on success */ Err thinkerwim.openbsd.amsterdam 70 .