diff options
author | Junio C Hamano <junkio@cox.net> | 2006-09-10 01:06:33 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-09-10 13:36:35 -0700 |
commit | 49a52b1d1fb120f52de3a67f1e4e5ae81512ab81 (patch) | |
tree | 47a0c3903f39026b2a907616177fde61adf79f65 /sideband.c | |
parent | a41fae9c46a4cb5e59cc1a17d19f6a3a6cbfbb2f (diff) | |
download | git-49a52b1d1fb120f52de3a67f1e4e5ae81512ab81.tar.gz |
Move sideband client side support into reusable form.
This moves the receiver side of the sideband support from
fetch-clone.c to sideband.c and its header file, so that
archiver protocol can use it.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'sideband.c')
-rw-r--r-- | sideband.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/sideband.c b/sideband.c new file mode 100644 index 0000000000..861f6219db --- /dev/null +++ b/sideband.c @@ -0,0 +1,48 @@ +#include "pkt-line.h" +#include "sideband.h" + +/* + * Receive multiplexed output stream over git native protocol. + * in_stream is the input stream from the remote, which carries data + * in pkt_line format with band designator. Demultiplex it into out + * and err and return error appropriately. Band #1 carries the + * primary payload. Things coming over band #2 is not necessarily + * error; they are usually informative message on the standard error + * stream, aka "verbose"). A message over band #3 is a signal that + * the remote died unexpectedly. A flush() concludes the stream. + */ +int recv_sideband(const char *me, int in_stream, int out, int err, char *buf, int bufsz) +{ + while (1) { + int len = packet_read_line(in_stream, buf, bufsz); + if (len == 0) + break; + if (len < 1) { + len = sprintf(buf, "%s: protocol error: no band designator\n", me); + safe_write(err, buf, len); + return SIDEBAND_PROTOCOL_ERROR; + } + len--; + switch (buf[0] & 0xFF) { + case 3: + safe_write(err, "remote: ", 8); + safe_write(err, buf+1, len); + safe_write(err, "\n", 1); + return SIDEBAND_REMOTE_ERROR; + case 2: + safe_write(err, "remote: ", 8); + safe_write(err, buf+1, len); + continue; + case 1: + safe_write(out, buf+1, len); + continue; + default: + len = sprintf(buf + 1, + "%s: protocol error: bad band #%d\n", + me, buf[0] & 0xFF); + safe_write(err, buf+1, len); + return SIDEBAND_PROTOCOL_ERROR; + } + } + return 0; +} |