pkt-line: add packet_read_line_gently()
authorBen Peart <peartben@gmail.com>
Fri, 5 May 2017 15:27:55 +0000 (11:27 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 8 May 2017 01:57:26 +0000 (10:57 +0900)
Add packet_read_line_gently() to enable reading a line without dying on
EOF.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
pkt-line.c
pkt-line.h
index 6f05b1a4a8bea31686f50ea906987a701148f166..7db9119573abe2c8308bd37c670c027c07b425c8 100644 (file)
@@ -323,6 +323,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);
index 18eac6483095319806f4c9b301b0f84e0c68d38c..66ef610fc4f7de2f6b7572f1e5fb36438c5dec19 100644 (file)
@@ -73,6 +73,17 @@ 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 or when the number of
+ * bytes copied is zero 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.