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);
--
⑨