shithub: oai

Download patch

ref: 57e518e7c5d8a598df2db3a6f3c393036ccf34d4
parent: 9f79e4ff6a2185bcb31b07bd9b68c3c3b240fb35
author: sirjofri <sirjofri@sirjofri.de>
date: Fri Feb 27 18:55:17 EST 2026

addds retry logic (e.g. for rate limiting situations)

--- a/oai.c
+++ b/oai.c
@@ -336,6 +336,31 @@
 	return nil;
 }
 
+static char
+ask(Biobuf *bin, char *what, char *valid)
+{
+	char *s;
+	char c;
+	
+	for (;;) {
+		print("!!! %s ", what);
+		s = Brdstr(bin, '\n', 1);
+		if (!s)
+			break;
+		if (!s[0]) {
+			free(s);
+			continue;
+		}
+		if (strchr(valid, s[0])) {
+			c = s[0];
+			free(s);
+			return c;
+		}
+		free(s);
+	}
+	return 0;
+}
+
 static void
 printusage(OResult *r)
 {
@@ -434,11 +459,21 @@
 			goto Next;
 		}
 		addstrprompt(&req, "user", s);
+Again:
 		res = makerequest(&req);
 		printusage(&res);
 		if (!res.success) {
-			fprint(2, "exiting!\n");
-			exits("fail");
+			fprint(2, "ERROR: %r\n");
+			switch (ask(bin, "Try again (y/n)?", "yn")) {
+			default:
+				fprint(2, "exiting!\n");
+				exits("fail");
+			case 'y':
+				goto Again;
+			case 'n':
+				fprint(2, "bye.\n");
+				exits(nil);
+			}
 		}
 		print("%s%s%s\n\n", res.role, (quiet ? "" : ": "), res.message);
 		addprompt(&req, res.asprompt);
--- a/oailib.c
+++ b/oailib.c
@@ -540,12 +540,16 @@
 	if (pbodyfd < 0)
 		sysfatal("webfs pbody open: %r");
 	fprint(pbodyfd, "%J", jreq);
+	jsonfree(jreq);
 	close(pbodyfd);
 	
 	snprint(buf, sizeof buf, "/mnt/web/%d/body", n);
 	body = Bopen(buf, OREAD);
-	if (!body)
-		sysfatal("webfs body open: %r");
+	if (!body) {
+		ret.success = 0;
+		close(ctlfd);
+		return ret;
+	}
 	
 	s = Brdstr(body, 0, 0);
 	Bterm(body);
@@ -570,7 +574,6 @@
 	ret = j2res(jres);
 	
 	free(s);
-	jsonfree(jreq);
 	jsonfree(jres);
 	
 	ret.asprompt = makeprompt(ret.role);
--