Skip to content

Commit f5615d2

Browse files
spearcegitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 609621a commit f5615d2

File tree

2 files changed

+76
-12
lines changed

2 files changed

+76
-12
lines changed

pkt-line.c

Lines changed: 72 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,51 @@ void packet_flush(int fd)
4242
safe_write(fd, "0000", 4);
4343
}
4444

45+
void packet_buf_flush(struct strbuf *buf)
46+
{
47+
strbuf_add(buf, "0000", 4);
48+
}
49+
4550
#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)
4753
{
48-
static char buffer[1000];
4954
static char hexchar[] = "0123456789abcdef";
50-
va_list args;
5155
unsigned n;
5256

53-
va_start(args, fmt);
5457
n = vsnprintf(buffer + 4, sizeof(buffer) - 4, fmt, args);
55-
va_end(args);
5658
if (n >= sizeof(buffer)-4)
5759
die("protocol error: impossibly long line");
5860
n += 4;
5961
buffer[0] = hex(n >> 12);
6062
buffer[1] = hex(n >> 8);
6163
buffer[2] = hex(n >> 4);
6264
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);
6376
safe_write(fd, buffer, n);
6477
}
6578

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+
6690
static void safe_read(int fd, void *buffer, unsigned size)
6791
{
6892
ssize_t ret = read_in_full(fd, buffer, size);
@@ -72,15 +96,11 @@ static void safe_read(int fd, void *buffer, unsigned size)
7296
die("The remote end hung up unexpectedly");
7397
}
7498

75-
int packet_read_line(int fd, char *buffer, unsigned size)
99+
static int packet_length(const char *linelen)
76100
{
77101
int n;
78-
unsigned len;
79-
char linelen[4];
80-
81-
safe_read(fd, linelen, 4);
102+
int len = 0;
82103

83-
len = 0;
84104
for (n = 0; n < 4; n++) {
85105
unsigned char c = linelen[n];
86106
len <<= 4;
@@ -96,8 +116,20 @@ int packet_read_line(int fd, char *buffer, unsigned size)
96116
len += c - 'A' + 10;
97117
continue;
98118
}
99-
die("protocol error: bad line length character");
119+
return -1;
100120
}
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");
101133
if (!len)
102134
return 0;
103135
len -= 4;
@@ -107,3 +139,31 @@ int packet_read_line(int fd, char *buffer, unsigned size)
107139
buffer[len] = 0;
108140
return len;
109141
}
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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22
#define PKTLINE_H
33

44
#include "git-compat-util.h"
5+
#include "strbuf.h"
56

67
/*
78
* Silly packetized line writing interface
89
*/
910
void packet_flush(int fd);
1011
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)));
1114

1215
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);
1317
ssize_t safe_write(int, const void *, ssize_t);
1418

1519
#endif

0 commit comments

Comments
 (0)