shithub: 9pro

Download patch

ref: 790b9816c5e0f05155e657edc5bd98f8a25780ca
parent: 8a6beae3c1e6459b26839a90f8219f460155e40c
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
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;
 }