git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 1/2] pkt-line: add packet_writel() and packet_read_line_gently()

From
Ben Peart <peartben@gmail.com>
Date
Mar 24, 2017, 15:27 UTC
Message-ID
<20170324152726.14632-2-benpeart@microsoft.com>
In-Reply-To
<20170324152726.14632-1-benpeart@microsoft.com>

Add packet_writel() which writes multiple lines in a single call and then calls packet_flush_gently(). Add packet_read_line_gently() to enable reading a line without dying on EOF.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
---
 pkt-line.c | 31 +++++++++++++++++++++++++++++++
 pkt-line.h | 11 +++++++++++
 2 files changed, 42 insertions(+)
diff --git a/pkt-line.c b/pkt-line.c
index d4b6bfe076..2788aa1af6 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -171,6 +171,25 @@ int packet_write_fmt_gently(int fd, const char *fmt, ...)
 	return status;
 }
 
+int packet_writel(int fd, const char *line, ...)
+{
+	va_list args;
+	int err;
+	va_start(args, line);
+	for (;;) {
+		if (!line)
+			break;
+		if (strlen(line) > LARGE_PACKET_DATA_MAX)
+			return -1;
+		err = packet_write_fmt_gently(fd, "%s\n", line);
+		if (err)
+			return err;
+		line = va_arg(args, const char*);
+	}
+	va_end(args);
+	return packet_flush_gently(fd);
+}
+
 static int packet_write_gently(const int fd_out, const char *buf, size_t size)
 {
 	static char packet_write_buffer[LARGE_PACKET_MAX];
@@ -323,6 +342,18 @@ char *packet_read_line(int fd, int *len_p)
 	return packet_read_line_generic(fd, NULL, NULL, len_p);
 }
 
+int packet_read_line_gently(int fd, int *dst_len, char** dst_line)
+{
+	int len = packet_read(fd, NULL, NULL,
+		packet_buffer, sizeof(packet_buffer),
+		PACKET_READ_CHOMP_NEWLINE|PACKET_READ_GENTLE_ON_EOF);
+	if (dst_len)
+		*dst_len = len;
+	if (dst_line)
+		*dst_line = (len > 0) ? packet_buffer : NULL;
+	return len;
+}
+
 char *packet_read_line_buf(char **src, size_t *src_len, int *dst_len)
 {
 	return packet_read_line_generic(-1, src, src_len, dst_len);
diff --git a/pkt-line.h b/pkt-line.h
index 18eac64830..cb3eda9695 100644
--- a/pkt-line.h
+++ b/pkt-line.h
@@ -25,6 +25,7 @@ void packet_buf_flush(struct strbuf *buf);
 void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
 int packet_flush_gently(int fd);
 int packet_write_fmt_gently(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
+int packet_writel(int fd, const char *line, ...);
 int write_packetized_from_fd(int fd_in, int fd_out);
 int write_packetized_from_buf(const char *src_in, size_t len, int fd_out);
 
@@ -74,6 +75,16 @@ int packet_read(int fd, char **src_buffer, size_t *src_len, char
 char *packet_read_line(int fd, int *size);
 
 /*
+ * Convenience wrapper for packet_read that sets the PACKET_READ_GENTLE_ON_EOF
+ * and CHOMP_NEWLINE options. The return value specifies the number of bytes
+ * read into the buffer or -1 on truncated input. if the *dst_line parameter
+ * is not NULL it will return NULL for a flush packet and otherwise points to
+ * a static buffer (that may be overwritten by subsequent calls). If the size
+ * parameter is not NULL, the length of the packet is written to it.
+ */
+int packet_read_line_gently(int fd, int *size, char** dst_line);
+
+/*
  * Same as packet_read_line, but read from a buf rather than a descriptor;
  * see packet_read for details on how src_* is used.
  */
-- 
2.12.0.gvfs.1.43.g876ba2a
Previous: Ben PeartNext: Torsten Bögershausen
Message 10 of 15 in “Refactor the filter process code into a reusable module”
  1. 0/2 Refactor the filter process code into a reusable moduleBen Peart, Mar 24, 2017
  2. 2/2 sub-process: refactor the filter process code into a reusable moduleBen Peart, Mar 24, 2017
  3. Jonathan TanMar 27, 2017
  4. Ben PeartMar 27, 2017
  5. 1/4 t7800: remove whitespace before redirectBen Peart, Mar 24, 2017
  6. Ben PeartMar 24, 2017
  7. 2/4 t7800: cleanup cruft left behind by testsBen Peart, Mar 24, 2017
  8. 3/4 difftool: handle modified symlinks in dir-diff modeBen Peart, Mar 24, 2017
  9. 4/4 Git 2.12.1Ben Peart, Mar 24, 2017
  10. 1/2 pkt-line: add packet_writel() and packet_read_line_gently()Ben Peart, Mar 24, 2017
  11. Torsten BögershausenMar 25, 2017
  12. Ben PeartMar 27, 2017
  13. Torsten BögershausenMar 30, 2017
  14. Ben PeartMar 30, 2017
  15. Torsten BögershausenMar 30, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.