From: Lars Schneider <redacted>
packet_write() has two shortcomings. First, it uses format_packet() which
lets the caller only send string data via "%s". That means it cannot be
used for arbitrary data that may contain NULs. Second, it will always
die on error.
Add packet_write_gently() which writes arbitrary data and returns `0` for
success and `-1` for an error.
Signed-off-by: Lars Schneider <redacted>
---
pkt-line.c | 12 ++++++++++++
pkt-line.h | 1 +
2 files changed, 13 insertions(+)
diff --git a/pkt-line.c b/pkt-line.c
index e6b8410..4f25748 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -3,6 +3,7 @@
#include "run-command.h"
char packet_buffer[LARGE_PACKET_MAX];
+char packet_write_buffer[LARGE_PACKET_MAX];
static const char *packet_trace_prefix = "git";
static struct trace_key trace_packet = TRACE_KEY_INIT(PACKET);
static struct trace_key trace_pack = TRACE_KEY_INIT(PACKFILE);
@@ -141,6 +142,17 @@ void packet_write(int fd, const char *fmt, ...)
write_or_die(fd, buf.buf, buf.len);
}
+int packet_write_gently(const int fd_out, const char *buf, size_t size)
+{
+ if (size > PKTLINE_DATA_MAXLEN)
+ return -1;
+ packet_trace(buf, size, 1);
+ memmove(packet_write_buffer + 4, buf, size);
+ size += 4;
+ set_packet_header(packet_write_buffer, size);
+ return (write_in_full(fd_out, packet_write_buffer, size) == size ? 0 : -1);
+}
+
void packet_buf_write(struct strbuf *buf, const char *fmt, ...)
{
va_list args;diff --git a/pkt-line.h b/pkt-line.h
index 3cb9d91..88584f1 100644
--- a/pkt-line.h
+++ b/pkt-line.h
@@ -77,6 +77,7 @@ char *packet_read_line_buf(char **src_buf, size_t *src_len, int *size);
#define DEFAULT_PACKET_MAX 1000
#define LARGE_PACKET_MAX 65520
+#define PKTLINE_DATA_MAXLEN (LARGE_PACKET_MAX - 4)
extern char packet_buffer[LARGE_PACKET_MAX];
#endif
--
2.9.2