1
#include "cache.h"
2
#include "pkt-line.h"
3
4
+const char *packet_trace_prefix = "git";
5
+static const char trace_key[] = "GIT_TRACE_PACKET";
6
+
7
+void packet_trace_identity(const char *prog)
8
+{
9
+ packet_trace_prefix = xstrdup(prog);
10
+}
11
+
12
+static void packet_trace(const char *buf, unsigned int len, int write)
13
+{
14
+ int i;
15
+ struct strbuf out;
16
+
17
+ if (!trace_want(trace_key))
18
+ return;
19
+
20
+ /* +32 is just a guess for header + quoting */
21
+ strbuf_init(&out, len+32);
22
+
23
+ strbuf_addf(&out, "packet: %12s%c ",
24
+ packet_trace_prefix, write ? '>' : '<');
25
+
26
+ if ((len >= 4 && !prefixcmp(buf, "PACK")) ||
27
+ (len >= 5 && !prefixcmp(buf+1, "PACK"))) {
28
+ strbuf_addstr(&out, "PACK ...");
29
+ unsetenv(trace_key);
30
+ }
31
+ else {
32
+ /* XXX we should really handle printable utf8 */
33
+ for (i = 0; i < len; i++) {
34
+ /* suppress newlines */
35
+ if (buf[i] == '\n')
36
+ continue;
37
+ if (buf[i] >= 0x20 && buf[i] <= 0x7e)
38
+ strbuf_addch(&out, buf[i]);
39
+ else
40
+ strbuf_addf(&out, "\\%o", buf[i]);
41
+ }
42
+ }
43
+
44
+ strbuf_addch(&out, '\n');
45
+ trace_strbuf(trace_key, &out);
46
+ strbuf_release(&out);
47
+}
48
+
49
/*
50
* Write a packetized stream, where each line is preceded by
51
* its length (including the header) as a 4-byte hex number.
84
*/
85
void packet_flush(int fd)
86
{
87
+ packet_trace("0000", 4, 1);
88
safe_write(fd, "0000", 4);
89
}
90
91
void packet_buf_flush(struct strbuf *buf)
92
{
93
+ packet_trace("0000", 4, 1);
94
strbuf_add(buf, "0000", 4);
95
}
96
109
buffer[1] = hex(n >> 8);
110
buffer[2] = hex(n >> 4);
111
buffer[3] = hex(n);
112
+ packet_trace(buffer+4, n-4, 1);
113
return n;
114
}
115
178
len = packet_length(linelen);
179
if (len < 0)
180
die("protocol error: bad line length character: %.4s", linelen);
133
- if (!len)
181
+ if (!len) {
182
+ packet_trace("0000", 4, 0);
183
return 0;
184
+ }
185
len -= 4;
186
if (len >= size)
187
die("protocol error: bad line length %d", len);
188
safe_read(fd, buffer, len);
189
buffer[len] = 0;
190
+ packet_trace(buffer, len, 0);
191
return len;
192
}
193
204
if (!len) {
205
*src_buf += 4;
206
*src_len -= 4;
207
+ packet_trace("0000", 4, 0);
208
return 0;
209
}
210
if (*src_len < len)
217
strbuf_add(out, *src_buf, len);
218
*src_buf += len;
219
*src_len -= len;
220
+ packet_trace(out->buf, out->len, 0);
221
return len;
222
}