ref: 790b9816c5e0f05155e657edc5bd98f8a25780ca
parent: 8a6beae3c1e6459b26839a90f8219f460155e40c
author: Sigrid Haflínudóttir <[email protected]>
date: Wed May 20 13:18:43 EDT 2020
9gc: try reconnecting
--- a/9gc.c
+++ b/9gc.c
@@ -25,6 +25,7 @@
Error = 1<<0,
Eof = 1<<1,
Joined = 1<<2,
+ Disconnected = 1<<3,
};
typedef struct C9aux C9aux;
@@ -38,11 +39,11 @@
uint8_t wrbuf[Msize];
uint32_t wroff;
uint32_t wrend;
- uint64_t chatoff;
};
static const char *nick;
static int printjoin;
+static uint64_t chatoff;
static uint8_t *
ctxread(C9ctx *ctx, uint32_t size, int *err)
@@ -62,6 +63,7 @@
if (r == 0) {
a->flags |= Eof;
} else {
+ a->flags |= Disconnected;
*err = 1;
perror("ctxread");
}
@@ -191,7 +193,7 @@
case Rread:
write(1, r->read.data, r->read.size);
- a->chatoff += r->read.size;
+ chatoff += r->read.size;
/* fallthrough */
case Ropen:
if ((a->flags & Joined) == 0 && printjoin) {
@@ -198,7 +200,7 @@
c9write(ctx, &tag, Chatfid, 0, buf, snprintf(buf, sizeof(buf), "JOIN %s to chat\n", nick));
a->flags |= Joined;
}
- c9read(ctx, &tag, Chatfid, a->chatoff, Msize);
+ c9read(ctx, &tag, Chatfid, chatoff, Msize);
break;
case Rerror:
@@ -420,14 +422,23 @@
return 1;
}
- if ((a = registry()) == NULL)
- return 1;
if (noecho && tcgetattr(0, &t) == 0) {
t.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &t);
}
- while (chatrw(a) == 0 && wrsend(a) == 0);
+ for (;;) {
+ if ((a = registry()) == NULL)
+ return 1;
+ while (chatrw(a) == 0 && wrsend(a) == 0);
+ if (a->flags & Disconnected) {
+ a->flags = 0;
+ printf("reconnecting...\n");
+ free(a);
+ } else {
+ exit(1);
+ }
+ }
return 0;
}