]> git.ipfire.org Git - thirdparty/git.git/blob - t/helper/test-pkt-line.c
Merge branch 'rs/column-leakfix' into maint-2.43
[thirdparty/git.git] / t / helper / test-pkt-line.c
1 #include "git-compat-util.h"
2 #include "test-tool.h"
3 #include "pkt-line.h"
4 #include "write-or-die.h"
5
6 static void pack_line(const char *line)
7 {
8 if (!strcmp(line, "0000") || !strcmp(line, "0000\n"))
9 packet_flush(1);
10 else if (!strcmp(line, "0001") || !strcmp(line, "0001\n"))
11 packet_delim(1);
12 else
13 packet_write_fmt(1, "%s", line);
14 }
15
16 static void pack(int argc, const char **argv)
17 {
18 if (argc) { /* read from argv */
19 int i;
20 for (i = 0; i < argc; i++)
21 pack_line(argv[i]);
22 } else { /* read from stdin */
23 char line[LARGE_PACKET_MAX];
24 while (fgets(line, sizeof(line), stdin)) {
25 pack_line(line);
26 }
27 }
28 }
29
30 static void pack_raw_stdin(void)
31 {
32 struct strbuf sb = STRBUF_INIT;
33
34 if (strbuf_read(&sb, 0, 0) < 0)
35 die_errno("failed to read from stdin");
36 packet_write(1, sb.buf, sb.len);
37 strbuf_release(&sb);
38 }
39
40 static void unpack(void)
41 {
42 struct packet_reader reader;
43 packet_reader_init(&reader, 0, NULL, 0,
44 PACKET_READ_GENTLE_ON_EOF |
45 PACKET_READ_CHOMP_NEWLINE);
46
47 while (packet_reader_read(&reader) != PACKET_READ_EOF) {
48 switch (reader.status) {
49 case PACKET_READ_EOF:
50 break;
51 case PACKET_READ_NORMAL:
52 printf("%s\n", reader.line);
53 break;
54 case PACKET_READ_FLUSH:
55 printf("0000\n");
56 break;
57 case PACKET_READ_DELIM:
58 printf("0001\n");
59 break;
60 case PACKET_READ_RESPONSE_END:
61 printf("0002\n");
62 break;
63 }
64 }
65 }
66
67 static void unpack_sideband(void)
68 {
69 struct packet_reader reader;
70 packet_reader_init(&reader, 0, NULL, 0,
71 PACKET_READ_GENTLE_ON_EOF |
72 PACKET_READ_CHOMP_NEWLINE);
73
74 while (packet_reader_read(&reader) != PACKET_READ_EOF) {
75 int band;
76 int fd;
77
78 switch (reader.status) {
79 case PACKET_READ_EOF:
80 break;
81 case PACKET_READ_NORMAL:
82 band = reader.line[0] & 0xff;
83 if (band < 1 || band > 2)
84 continue; /* skip non-sideband packets */
85 fd = band;
86
87 write_or_die(fd, reader.line + 1, reader.pktlen - 1);
88 break;
89 case PACKET_READ_FLUSH:
90 return;
91 case PACKET_READ_DELIM:
92 case PACKET_READ_RESPONSE_END:
93 break;
94 }
95 }
96 }
97
98 static int send_split_sideband(void)
99 {
100 const char *part1 = "Hello,";
101 const char *primary = "\001primary: regular output\n";
102 const char *part2 = " world!\n";
103
104 send_sideband(1, 2, part1, strlen(part1), LARGE_PACKET_MAX);
105 packet_write(1, primary, strlen(primary));
106 send_sideband(1, 2, part2, strlen(part2), LARGE_PACKET_MAX);
107 packet_response_end(1);
108
109 return 0;
110 }
111
112 static int receive_sideband(void)
113 {
114 return recv_sideband("sideband", 0, 1);
115 }
116
117 int cmd__pkt_line(int argc, const char **argv)
118 {
119 if (argc < 2)
120 die("too few arguments");
121
122 if (!strcmp(argv[1], "pack"))
123 pack(argc - 2, argv + 2);
124 else if (!strcmp(argv[1], "pack-raw-stdin"))
125 pack_raw_stdin();
126 else if (!strcmp(argv[1], "unpack"))
127 unpack();
128 else if (!strcmp(argv[1], "unpack-sideband"))
129 unpack_sideband();
130 else if (!strcmp(argv[1], "send-split-sideband"))
131 send_split_sideband();
132 else if (!strcmp(argv[1], "receive-sideband"))
133 receive_sideband();
134 else
135 die("invalid argument '%s'", argv[1]);
136
137 return 0;
138 }