@matheusbsbs / matheus-bagliano / commits / f5615d2467
Fork 0

pkt-line: Add strbuf based functions

These routines help to work with pkt-line values inside of a strbuf, permitting simple formatting of buffered network messages. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Shawn O. Pearce committed Oct 30, 2009 at 17:47 UTC f5615d246770a2796e60b06dd5e17f5e79d5dd0c
2 files changed +76 -12
pkt-line.c
+72 -12
@@ -42,17 +42,19 @@ void packet_flush(int fd)
42 safe_write(fd, "0000", 4);
43 }
44
45 +void packet_buf_flush(struct strbuf *buf)
46 +{
47 + strbuf_add(buf, "0000", 4);
48 +}
49 +
50 #define hex(a) (hexchar[(a) & 15])
46 -void packet_write(int fd, const char *fmt, ...)
51 +static char buffer[1000];
52 +static unsigned format_packet(const char *fmt, va_list args)
53 {
48 - static char buffer[1000];
54 static char hexchar[] = "0123456789abcdef";
50 - va_list args;
55 unsigned n;
56
53 - va_start(args, fmt);
57 n = vsnprintf(buffer + 4, sizeof(buffer) - 4, fmt, args);
55 - va_end(args);
58 if (n >= sizeof(buffer)-4)
59 die("protocol error: impossibly long line");
60 n += 4;
@@ -60,9 +62,31 @@ void packet_write(int fd, const char *fmt, ...)
62 buffer[1] = hex(n >> 8);
63 buffer[2] = hex(n >> 4);
64 buffer[3] = hex(n);
65 + return n;
66 +}
67 +
68 +void packet_write(int fd, const char *fmt, ...)
69 +{
70 + va_list args;
71 + unsigned n;
72 +
73 + va_start(args, fmt);
74 + n = format_packet(fmt, args);
75 + va_end(args);
76 safe_write(fd, buffer, n);
77 }
78
79 +void packet_buf_write(struct strbuf *buf, const char *fmt, ...)
80 +{
81 + va_list args;
82 + unsigned n;
83 +
84 + va_start(args, fmt);
85 + n = format_packet(fmt, args);
86 + va_end(args);
87 + strbuf_add(buf, buffer, n);
88 +}
89 +
90 static void safe_read(int fd, void *buffer, unsigned size)
91 {
92 ssize_t ret = read_in_full(fd, buffer, size);
@@ -72,15 +96,11 @@ static void safe_read(int fd, void *buffer, unsigned size)
96 die("The remote end hung up unexpectedly");
97 }
98
75 -int packet_read_line(int fd, char *buffer, unsigned size)
99 +static int packet_length(const char *linelen)
100 {
101 int n;
78 - unsigned len;
79 - char linelen[4];
80 -
81 - safe_read(fd, linelen, 4);
102 + int len = 0;
103
83 - len = 0;
104 for (n = 0; n < 4; n++) {
105 unsigned char c = linelen[n];
106 len <<= 4;
@@ -96,8 +116,20 @@ int packet_read_line(int fd, char *buffer, unsigned size)
116 len += c - 'A' + 10;
117 continue;
118 }
99 - die("protocol error: bad line length character");
119 + return -1;
120 }
121 + return len;
122 +}
123 +
124 +int packet_read_line(int fd, char *buffer, unsigned size)
125 +{
126 + int len;
127 + char linelen[4];
128 +
129 + safe_read(fd, linelen, 4);
130 + len = packet_length(linelen);
131 + if (len < 0)
132 + die("protocol error: bad line length character");
133 if (!len)
134 return 0;
135 len -= 4;
@@ -107,3 +139,31 @@ int packet_read_line(int fd, char *buffer, unsigned size)
139 buffer[len] = 0;
140 return len;
141 }
142 +
143 +int packet_get_line(struct strbuf *out,
144 + char **src_buf, size_t *src_len)
145 +{
146 + int len;
147 +
148 + if (*src_len < 4)
149 + return -1;
150 + len = packet_length(*src_buf);
151 + if (len < 0)
152 + return -1;
153 + if (!len) {
154 + *src_buf += 4;
155 + *src_len -= 4;
156 + return 0;
157 + }
158 + if (*src_len < len)
159 + return -2;
160 +
161 + *src_buf += 4;
162 + *src_len -= 4;
163 + len -= 4;
164 +
165 + strbuf_add(out, *src_buf, len);
166 + *src_buf += len;
167 + *src_len -= len;
168 + return len;
169 +}
pkt-line.h
+4
@@ -2,14 +2,18 @@
2 #define PKTLINE_H
3
4 #include "git-compat-util.h"
5 +#include "strbuf.h"
6
7 /*
8 * Silly packetized line writing interface
9 */
10 void packet_flush(int fd);
11 void packet_write(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
12 +void packet_buf_flush(struct strbuf *buf);
13 +void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
14
15 int packet_read_line(int fd, char *buffer, unsigned size);
16 +int packet_get_line(struct strbuf *out, char **src_buf, size_t *src_len);
17 ssize_t safe_write(int, const void *, ssize_t);
18
19 #endif