280
return (val < 0) ? val : (val << 8) | hex2chr(linelen + 2);
281
}
282
283
-int packet_read(int fd, char **src_buf, size_t *src_len,
284
- char *buffer, unsigned size, int options)
283
+enum packet_read_status packet_read_with_status(int fd, char **src_buffer,
284
+ size_t *src_len, char *buffer,
285
+ unsigned size, int *pktlen,
286
+ int options)
287
{
286
- int len, ret;
288
+ int len;
289
char linelen[4];
290
289
- ret = get_packet_data(fd, src_buf, src_len, linelen, 4, options);
290
- if (ret < 0)
291
- return ret;
291
+ if (get_packet_data(fd, src_buffer, src_len, linelen, 4, options) < 0) {
292
+ *pktlen = -1;
293
+ return PACKET_READ_EOF;
294
+ }
295
+
296
len = packet_length(linelen);
293
- if (len < 0)
297
+
298
+ if (len < 0) {
299
die("protocol error: bad line length character: %.4s", linelen);
295
- if (!len) {
300
+ } else if (!len) {
301
packet_trace("0000", 4, 0);
297
- return 0;
302
+ *pktlen = 0;
303
+ return PACKET_READ_FLUSH;
304
+ } else if (len < 4) {
305
+ die("protocol error: bad line length %d", len);
306
}
307
+
308
len -= 4;
300
- if (len >= size)
309
+ if ((unsigned)len >= size)
310
die("protocol error: bad line length %d", len);
302
- ret = get_packet_data(fd, src_buf, src_len, buffer, len, options);
303
- if (ret < 0)
304
- return ret;
311
+
312
+ if (get_packet_data(fd, src_buffer, src_len, buffer, len, options) < 0) {
313
+ *pktlen = -1;
314
+ return PACKET_READ_EOF;
315
+ }
316
317
if ((options & PACKET_READ_CHOMP_NEWLINE) &&
318
len && buffer[len-1] == '\n')
320
321
buffer[len] = 0;
322
packet_trace(buffer, len, 0);
312
- return len;
323
+ *pktlen = len;
324
+ return PACKET_READ_NORMAL;
325
+}
326
+
327
+int packet_read(int fd, char **src_buffer, size_t *src_len,
328
+ char *buffer, unsigned size, int options)
329
+{
330
+ int pktlen = -1;
331
+
332
+ packet_read_with_status(fd, src_buffer, src_len, buffer, size,
333
+ &pktlen, options);
334
+
335
+ return pktlen;
336
}
337
338
static char *packet_read_line_generic(int fd,