Commit Diff


commit - 23fbe390bd2006b2da54d7ed1fdd5e9615e58d4b
commit + 66926cfc3a240fee6da318457f40e62cc246fdc9
blob - d6a99253ffffc262530b8630b09829f1dab17e61
blob + 47a94afe0da6f6a6dd2afeb1f06da63c983a8589
--- kamid/ChangeLog
+++ kamid/ChangeLog
@@ -1,3 +1,7 @@
+2022-05-23  Omar Polo  <op@omarpolo.com>
+
+	* client.c (tread): allow "jumbo" reads
+
 2022-05-22  Omar Polo  <op@omarpolo.com>
 
 	* client.c (handle_message): allow "jumbo" writes
blob - 29b640835134e4aea8b320ba987c21af9b39f0b8
blob + a906118a4be90368060771d0784128b29cb69255
--- kamid/client.c
+++ kamid/client.c
@@ -637,7 +637,7 @@ static void
 do_send(void)
 {
 	size_t	 len;
-	void	*data;
+	uint8_t	*data;
 
 	len = EVBUFFER_LENGTH(evb);
 	data = EVBUFFER_DATA(evb);
@@ -645,8 +645,18 @@ do_send(void)
 #if DEBUG_PACKETS
 	hexdump("outgoing packet", data, len);
 #endif
-	client_send_listener(IMSG_BUF, data, len);
-	evbuffer_drain(evb, len);
+
+	while (len > IMSG_MAXSIZE) {
+		client_send_listener(IMSG_BUF, data, IMSG_MAXSIZE);
+		evbuffer_drain(evb, IMSG_MAXSIZE);
+		len -= IMSG_MAXSIZE;
+		data += IMSG_MAXSIZE;
+	}
+
+	if (len != 0) {
+		client_send_listener(IMSG_BUF, data, len);
+		evbuffer_drain(evb, len);
+	}
 }
 
 static void
@@ -1487,12 +1497,12 @@ serialize_stat(const char *fname, struct stat *sb, str
 static void
 tread(struct np_msg_header *hdr, const uint8_t *data, size_t len)
 {
+	static char	 buf[MSIZE9P - HEADERSIZE - 4];
 	struct fid	*f;
 	ssize_t		 r;
 	size_t		 howmuch;
 	uint64_t	 off;
 	uint32_t	 fid, count;
-	char		 buf[2048];
 
 	/* fid[4] offset[8] count[4] */
 	if (!NPREAD32("fid", &fid, &data, &len) ||