pkt-line.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. #include "cache.h"
  2. #include "pkt-line.h"
  3. #include "run-command.h"
  4. char packet_buffer[LARGE_PACKET_MAX];
  5. static const char *packet_trace_prefix = "git";
  6. static struct trace_key trace_packet = TRACE_KEY_INIT(PACKET);
  7. static struct trace_key trace_pack = TRACE_KEY_INIT(PACKFILE);
  8. void packet_trace_identity(const char *prog)
  9. {
  10. packet_trace_prefix = xstrdup(prog);
  11. }
  12. static const char *get_trace_prefix(void)
  13. {
  14. return in_async() ? "sideband" : packet_trace_prefix;
  15. }
  16. static int packet_trace_pack(const char *buf, unsigned int len, int sideband)
  17. {
  18. if (!sideband) {
  19. trace_verbatim(&trace_pack, buf, len);
  20. return 1;
  21. } else if (len && *buf == '\1') {
  22. trace_verbatim(&trace_pack, buf + 1, len - 1);
  23. return 1;
  24. } else {
  25. /* it's another non-pack sideband */
  26. return 0;
  27. }
  28. }
  29. static void packet_trace(const char *buf, unsigned int len, int write)
  30. {
  31. int i;
  32. struct strbuf out;
  33. static int in_pack, sideband;
  34. if (!trace_want(&trace_packet) && !trace_want(&trace_pack))
  35. return;
  36. if (in_pack) {
  37. if (packet_trace_pack(buf, len, sideband))
  38. return;
  39. } else if (starts_with(buf, "PACK") || starts_with(buf, "\1PACK")) {
  40. in_pack = 1;
  41. sideband = *buf == '\1';
  42. packet_trace_pack(buf, len, sideband);
  43. /*
  44. * Make a note in the human-readable trace that the pack data
  45. * started.
  46. */
  47. buf = "PACK ...";
  48. len = strlen(buf);
  49. }
  50. if (!trace_want(&trace_packet))
  51. return;
  52. /* +32 is just a guess for header + quoting */
  53. strbuf_init(&out, len+32);
  54. strbuf_addf(&out, "packet: %12s%c ",
  55. get_trace_prefix(), write ? '>' : '<');
  56. /* XXX we should really handle printable utf8 */
  57. for (i = 0; i < len; i++) {
  58. /* suppress newlines */
  59. if (buf[i] == '\n')
  60. continue;
  61. if (buf[i] >= 0x20 && buf[i] <= 0x7e)
  62. strbuf_addch(&out, buf[i]);
  63. else
  64. strbuf_addf(&out, "\\%o", buf[i]);
  65. }
  66. strbuf_addch(&out, '\n');
  67. trace_strbuf(&trace_packet, &out);
  68. strbuf_release(&out);
  69. }
  70. /*
  71. * If we buffered things up above (we don't, but we should),
  72. * we'd flush it here
  73. */
  74. void packet_flush(int fd)
  75. {
  76. packet_trace("0000", 4, 1);
  77. if (write_in_full(fd, "0000", 4) < 0)
  78. die_errno(_("unable to write flush packet"));
  79. }
  80. void packet_delim(int fd)
  81. {
  82. packet_trace("0001", 4, 1);
  83. if (write_in_full(fd, "0001", 4) < 0)
  84. die_errno(_("unable to write delim packet"));
  85. }
  86. void packet_response_end(int fd)
  87. {
  88. packet_trace("0002", 4, 1);
  89. if (write_in_full(fd, "0002", 4) < 0)
  90. die_errno(_("unable to write stateless separator packet"));
  91. }
  92. int packet_flush_gently(int fd)
  93. {
  94. packet_trace("0000", 4, 1);
  95. if (write_in_full(fd, "0000", 4) < 0)
  96. return error(_("flush packet write failed"));
  97. return 0;
  98. }
  99. void packet_buf_flush(struct strbuf *buf)
  100. {
  101. packet_trace("0000", 4, 1);
  102. strbuf_add(buf, "0000", 4);
  103. }
  104. void packet_buf_delim(struct strbuf *buf)
  105. {
  106. packet_trace("0001", 4, 1);
  107. strbuf_add(buf, "0001", 4);
  108. }
  109. void set_packet_header(char *buf, int size)
  110. {
  111. static char hexchar[] = "0123456789abcdef";
  112. #define hex(a) (hexchar[(a) & 15])
  113. buf[0] = hex(size >> 12);
  114. buf[1] = hex(size >> 8);
  115. buf[2] = hex(size >> 4);
  116. buf[3] = hex(size);
  117. #undef hex
  118. }
  119. static void format_packet(struct strbuf *out, const char *prefix,
  120. const char *fmt, va_list args)
  121. {
  122. size_t orig_len, n;
  123. orig_len = out->len;
  124. strbuf_addstr(out, "0000");
  125. strbuf_addstr(out, prefix);
  126. strbuf_vaddf(out, fmt, args);
  127. n = out->len - orig_len;
  128. if (n > LARGE_PACKET_MAX)
  129. die(_("protocol error: impossibly long line"));
  130. set_packet_header(&out->buf[orig_len], n);
  131. packet_trace(out->buf + orig_len + 4, n - 4, 1);
  132. }
  133. static int packet_write_fmt_1(int fd, int gently, const char *prefix,
  134. const char *fmt, va_list args)
  135. {
  136. static struct strbuf buf = STRBUF_INIT;
  137. strbuf_reset(&buf);
  138. format_packet(&buf, prefix, fmt, args);
  139. if (write_in_full(fd, buf.buf, buf.len) < 0) {
  140. if (!gently) {
  141. check_pipe(errno);
  142. die_errno(_("packet write with format failed"));
  143. }
  144. return error(_("packet write with format failed"));
  145. }
  146. return 0;
  147. }
  148. void packet_write_fmt(int fd, const char *fmt, ...)
  149. {
  150. va_list args;
  151. va_start(args, fmt);
  152. packet_write_fmt_1(fd, 0, "", fmt, args);
  153. va_end(args);
  154. }
  155. int packet_write_fmt_gently(int fd, const char *fmt, ...)
  156. {
  157. int status;
  158. va_list args;
  159. va_start(args, fmt);
  160. status = packet_write_fmt_1(fd, 1, "", fmt, args);
  161. va_end(args);
  162. return status;
  163. }
  164. static int packet_write_gently(const int fd_out, const char *buf, size_t size)
  165. {
  166. static char packet_write_buffer[LARGE_PACKET_MAX];
  167. size_t packet_size;
  168. if (size > sizeof(packet_write_buffer) - 4)
  169. return error(_("packet write failed - data exceeds max packet size"));
  170. packet_trace(buf, size, 1);
  171. packet_size = size + 4;
  172. set_packet_header(packet_write_buffer, packet_size);
  173. memcpy(packet_write_buffer + 4, buf, size);
  174. if (write_in_full(fd_out, packet_write_buffer, packet_size) < 0)
  175. return error(_("packet write failed"));
  176. return 0;
  177. }
  178. void packet_write(int fd_out, const char *buf, size_t size)
  179. {
  180. if (packet_write_gently(fd_out, buf, size))
  181. die_errno(_("packet write failed"));
  182. }
  183. void packet_buf_write(struct strbuf *buf, const char *fmt, ...)
  184. {
  185. va_list args;
  186. va_start(args, fmt);
  187. format_packet(buf, "", fmt, args);
  188. va_end(args);
  189. }
  190. void packet_buf_write_len(struct strbuf *buf, const char *data, size_t len)
  191. {
  192. size_t orig_len, n;
  193. orig_len = buf->len;
  194. strbuf_addstr(buf, "0000");
  195. strbuf_add(buf, data, len);
  196. n = buf->len - orig_len;
  197. if (n > LARGE_PACKET_MAX)
  198. die(_("protocol error: impossibly long line"));
  199. set_packet_header(&buf->buf[orig_len], n);
  200. packet_trace(data, len, 1);
  201. }
  202. int write_packetized_from_fd(int fd_in, int fd_out)
  203. {
  204. static char buf[LARGE_PACKET_DATA_MAX];
  205. int err = 0;
  206. ssize_t bytes_to_write;
  207. while (!err) {
  208. bytes_to_write = xread(fd_in, buf, sizeof(buf));
  209. if (bytes_to_write < 0)
  210. return COPY_READ_ERROR;
  211. if (bytes_to_write == 0)
  212. break;
  213. err = packet_write_gently(fd_out, buf, bytes_to_write);
  214. }
  215. if (!err)
  216. err = packet_flush_gently(fd_out);
  217. return err;
  218. }
  219. int write_packetized_from_buf(const char *src_in, size_t len, int fd_out)
  220. {
  221. int err = 0;
  222. size_t bytes_written = 0;
  223. size_t bytes_to_write;
  224. while (!err) {
  225. if ((len - bytes_written) > LARGE_PACKET_DATA_MAX)
  226. bytes_to_write = LARGE_PACKET_DATA_MAX;
  227. else
  228. bytes_to_write = len - bytes_written;
  229. if (bytes_to_write == 0)
  230. break;
  231. err = packet_write_gently(fd_out, src_in + bytes_written, bytes_to_write);
  232. bytes_written += bytes_to_write;
  233. }
  234. if (!err)
  235. err = packet_flush_gently(fd_out);
  236. return err;
  237. }
  238. static int get_packet_data(int fd, char **src_buf, size_t *src_size,
  239. void *dst, unsigned size, int options)
  240. {
  241. ssize_t ret;
  242. if (fd >= 0 && src_buf && *src_buf)
  243. BUG("multiple sources given to packet_read");
  244. /* Read up to "size" bytes from our source, whatever it is. */
  245. if (src_buf && *src_buf) {
  246. ret = size < *src_size ? size : *src_size;
  247. memcpy(dst, *src_buf, ret);
  248. *src_buf += ret;
  249. *src_size -= ret;
  250. } else {
  251. ret = read_in_full(fd, dst, size);
  252. if (ret < 0)
  253. die_errno(_("read error"));
  254. }
  255. /* And complain if we didn't get enough bytes to satisfy the read. */
  256. if (ret != size) {
  257. if (options & PACKET_READ_GENTLE_ON_EOF)
  258. return -1;
  259. die(_("the remote end hung up unexpectedly"));
  260. }
  261. return ret;
  262. }
  263. int packet_length(const char lenbuf_hex[4])
  264. {
  265. int val = hex2chr(lenbuf_hex);
  266. return (val < 0) ? val : (val << 8) | hex2chr(lenbuf_hex + 2);
  267. }
  268. enum packet_read_status packet_read_with_status(int fd, char **src_buffer,
  269. size_t *src_len, char *buffer,
  270. unsigned size, int *pktlen,
  271. int options)
  272. {
  273. int len;
  274. char linelen[4];
  275. if (get_packet_data(fd, src_buffer, src_len, linelen, 4, options) < 0) {
  276. *pktlen = -1;
  277. return PACKET_READ_EOF;
  278. }
  279. len = packet_length(linelen);
  280. if (len < 0) {
  281. die(_("protocol error: bad line length character: %.4s"), linelen);
  282. } else if (!len) {
  283. packet_trace("0000", 4, 0);
  284. *pktlen = 0;
  285. return PACKET_READ_FLUSH;
  286. } else if (len == 1) {
  287. packet_trace("0001", 4, 0);
  288. *pktlen = 0;
  289. return PACKET_READ_DELIM;
  290. } else if (len == 2) {
  291. packet_trace("0002", 4, 0);
  292. *pktlen = 0;
  293. return PACKET_READ_RESPONSE_END;
  294. } else if (len < 4) {
  295. die(_("protocol error: bad line length %d"), len);
  296. }
  297. len -= 4;
  298. if ((unsigned)len >= size)
  299. die(_("protocol error: bad line length %d"), len);
  300. if (get_packet_data(fd, src_buffer, src_len, buffer, len, options) < 0) {
  301. *pktlen = -1;
  302. return PACKET_READ_EOF;
  303. }
  304. if ((options & PACKET_READ_CHOMP_NEWLINE) &&
  305. len && buffer[len-1] == '\n')
  306. len--;
  307. buffer[len] = 0;
  308. packet_trace(buffer, len, 0);
  309. if ((options & PACKET_READ_DIE_ON_ERR_PACKET) &&
  310. starts_with(buffer, "ERR "))
  311. die(_("remote error: %s"), buffer + 4);
  312. *pktlen = len;
  313. return PACKET_READ_NORMAL;
  314. }
  315. int packet_read(int fd, char **src_buffer, size_t *src_len,
  316. char *buffer, unsigned size, int options)
  317. {
  318. int pktlen = -1;
  319. packet_read_with_status(fd, src_buffer, src_len, buffer, size,
  320. &pktlen, options);
  321. return pktlen;
  322. }
  323. static char *packet_read_line_generic(int fd,
  324. char **src, size_t *src_len,
  325. int *dst_len)
  326. {
  327. int len = packet_read(fd, src, src_len,
  328. packet_buffer, sizeof(packet_buffer),
  329. PACKET_READ_CHOMP_NEWLINE);
  330. if (dst_len)
  331. *dst_len = len;
  332. return (len > 0) ? packet_buffer : NULL;
  333. }
  334. char *packet_read_line(int fd, int *len_p)
  335. {
  336. return packet_read_line_generic(fd, NULL, NULL, len_p);
  337. }
  338. int packet_read_line_gently(int fd, int *dst_len, char **dst_line)
  339. {
  340. int len = packet_read(fd, NULL, NULL,
  341. packet_buffer, sizeof(packet_buffer),
  342. PACKET_READ_CHOMP_NEWLINE|PACKET_READ_GENTLE_ON_EOF);
  343. if (dst_len)
  344. *dst_len = len;
  345. if (dst_line)
  346. *dst_line = (len > 0) ? packet_buffer : NULL;
  347. return len;
  348. }
  349. char *packet_read_line_buf(char **src, size_t *src_len, int *dst_len)
  350. {
  351. return packet_read_line_generic(-1, src, src_len, dst_len);
  352. }
  353. ssize_t read_packetized_to_strbuf(int fd_in, struct strbuf *sb_out)
  354. {
  355. int packet_len;
  356. size_t orig_len = sb_out->len;
  357. size_t orig_alloc = sb_out->alloc;
  358. for (;;) {
  359. strbuf_grow(sb_out, LARGE_PACKET_DATA_MAX);
  360. packet_len = packet_read(fd_in, NULL, NULL,
  361. /* strbuf_grow() above always allocates one extra byte to
  362. * store a '\0' at the end of the string. packet_read()
  363. * writes a '\0' extra byte at the end, too. Let it know
  364. * that there is already room for the extra byte.
  365. */
  366. sb_out->buf + sb_out->len, LARGE_PACKET_DATA_MAX+1,
  367. PACKET_READ_GENTLE_ON_EOF);
  368. if (packet_len <= 0)
  369. break;
  370. sb_out->len += packet_len;
  371. }
  372. if (packet_len < 0) {
  373. if (orig_alloc == 0)
  374. strbuf_release(sb_out);
  375. else
  376. strbuf_setlen(sb_out, orig_len);
  377. return packet_len;
  378. }
  379. return sb_out->len - orig_len;
  380. }
  381. int recv_sideband(const char *me, int in_stream, int out)
  382. {
  383. char buf[LARGE_PACKET_MAX + 1];
  384. int len;
  385. struct strbuf scratch = STRBUF_INIT;
  386. enum sideband_type sideband_type;
  387. while (1) {
  388. len = packet_read(in_stream, NULL, NULL, buf, LARGE_PACKET_MAX,
  389. 0);
  390. if (!demultiplex_sideband(me, buf, len, 0, &scratch,
  391. &sideband_type))
  392. continue;
  393. switch (sideband_type) {
  394. case SIDEBAND_PRIMARY:
  395. write_or_die(out, buf + 1, len - 1);
  396. break;
  397. default: /* errors: message already written */
  398. return sideband_type;
  399. }
  400. }
  401. }
  402. /* Packet Reader Functions */
  403. void packet_reader_init(struct packet_reader *reader, int fd,
  404. char *src_buffer, size_t src_len,
  405. int options)
  406. {
  407. memset(reader, 0, sizeof(*reader));
  408. reader->fd = fd;
  409. reader->src_buffer = src_buffer;
  410. reader->src_len = src_len;
  411. reader->buffer = packet_buffer;
  412. reader->buffer_size = sizeof(packet_buffer);
  413. reader->options = options;
  414. reader->me = "git";
  415. reader->hash_algo = &hash_algos[GIT_HASH_SHA1];
  416. }
  417. enum packet_read_status packet_reader_read(struct packet_reader *reader)
  418. {
  419. struct strbuf scratch = STRBUF_INIT;
  420. if (reader->line_peeked) {
  421. reader->line_peeked = 0;
  422. return reader->status;
  423. }
  424. /*
  425. * Consume all progress packets until a primary payload packet is
  426. * received
  427. */
  428. while (1) {
  429. enum sideband_type sideband_type;
  430. reader->status = packet_read_with_status(reader->fd,
  431. &reader->src_buffer,
  432. &reader->src_len,
  433. reader->buffer,
  434. reader->buffer_size,
  435. &reader->pktlen,
  436. reader->options);
  437. if (!reader->use_sideband)
  438. break;
  439. if (demultiplex_sideband(reader->me, reader->buffer,
  440. reader->pktlen, 1, &scratch,
  441. &sideband_type))
  442. break;
  443. }
  444. if (reader->status == PACKET_READ_NORMAL)
  445. /* Skip the sideband designator if sideband is used */
  446. reader->line = reader->use_sideband ?
  447. reader->buffer + 1 : reader->buffer;
  448. else
  449. reader->line = NULL;
  450. return reader->status;
  451. }
  452. enum packet_read_status packet_reader_peek(struct packet_reader *reader)
  453. {
  454. /* Only allow peeking a single line */
  455. if (reader->line_peeked)
  456. return reader->status;
  457. /* Peek a line by reading it and setting peeked flag */
  458. packet_reader_read(reader);
  459. reader->line_peeked = 1;
  460. return reader->status;
  461. }
  462. void packet_writer_init(struct packet_writer *writer, int dest_fd)
  463. {
  464. writer->dest_fd = dest_fd;
  465. writer->use_sideband = 0;
  466. }
  467. void packet_writer_write(struct packet_writer *writer, const char *fmt, ...)
  468. {
  469. va_list args;
  470. va_start(args, fmt);
  471. packet_write_fmt_1(writer->dest_fd, 0,
  472. writer->use_sideband ? "\001" : "", fmt, args);
  473. va_end(args);
  474. }
  475. void packet_writer_error(struct packet_writer *writer, const char *fmt, ...)
  476. {
  477. va_list args;
  478. va_start(args, fmt);
  479. packet_write_fmt_1(writer->dest_fd, 0,
  480. writer->use_sideband ? "\003" : "ERR ", fmt, args);
  481. va_end(args);
  482. }
  483. void packet_writer_delim(struct packet_writer *writer)
  484. {
  485. packet_delim(writer->dest_fd);
  486. }
  487. void packet_writer_flush(struct packet_writer *writer)
  488. {
  489. packet_flush(writer->dest_fd);
  490. }