@@ -42,27 +42,51 @@ void packet_flush(int fd)
42
42
safe_write (fd , "0000" , 4 );
43
43
}
44
44
45
+ void packet_buf_flush (struct strbuf * buf )
46
+ {
47
+ strbuf_add (buf , "0000" , 4 );
48
+ }
49
+
45
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 )
47
53
{
48
- static char buffer [1000 ];
49
54
static char hexchar [] = "0123456789abcdef" ;
50
- va_list args ;
51
55
unsigned n ;
52
56
53
- va_start (args , fmt );
54
57
n = vsnprintf (buffer + 4 , sizeof (buffer ) - 4 , fmt , args );
55
- va_end (args );
56
58
if (n >= sizeof (buffer )- 4 )
57
59
die ("protocol error: impossibly long line" );
58
60
n += 4 ;
59
61
buffer [0 ] = hex (n >> 12 );
60
62
buffer [1 ] = hex (n >> 8 );
61
63
buffer [2 ] = hex (n >> 4 );
62
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 );
63
76
safe_write (fd , buffer , n );
64
77
}
65
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
+
66
90
static void safe_read (int fd , void * buffer , unsigned size )
67
91
{
68
92
ssize_t ret = read_in_full (fd , buffer , size );
@@ -72,15 +96,11 @@ static void safe_read(int fd, void *buffer, unsigned size)
72
96
die ("The remote end hung up unexpectedly" );
73
97
}
74
98
75
- int packet_read_line ( int fd , char * buffer , unsigned size )
99
+ static int packet_length ( const char * linelen )
76
100
{
77
101
int n ;
78
- unsigned len ;
79
- char linelen [4 ];
80
-
81
- safe_read (fd , linelen , 4 );
102
+ int len = 0 ;
82
103
83
- len = 0 ;
84
104
for (n = 0 ; n < 4 ; n ++ ) {
85
105
unsigned char c = linelen [n ];
86
106
len <<= 4 ;
@@ -96,8 +116,20 @@ int packet_read_line(int fd, char *buffer, unsigned size)
96
116
len += c - 'A' + 10 ;
97
117
continue ;
98
118
}
99
- die ( "protocol error: bad line length character" ) ;
119
+ return -1 ;
100
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" );
101
133
if (!len )
102
134
return 0 ;
103
135
len -= 4 ;
@@ -107,3 +139,31 @@ int packet_read_line(int fd, char *buffer, unsigned size)
107
139
buffer [len ] = 0 ;
108
140
return len ;
109
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
+ }
0 commit comments