sbotc.cView |
---|
24 | 24 … | #include <sys/select.h> |
25 | 25 … | #include <sys/socket.h> |
26 | 26 … | #include <sys/stat.h> |
27 | 27 … | #include <sys/un.h> |
| 28 … | +#include <termios.h> |
28 | 29 … | #include <unistd.h> |
29 | 30 … | |
30 | 31 … | #include <sodium.h> |
31 | 32 … | |
103 | 104 … | 0x08, 0x39, 0xb7, 0x55, 0x84, 0x5a, 0x9f, 0xfb |
104 | 105 … | }; |
105 | 106 … | |
106 | 107 … | static void usage() { |
107 | | - fputs("usage: sbotc [-j] [-T] [-l]\n" |
| 108 … | + fputs("usage: sbotc [-j] [-T] [-l] [-r]\n" |
108 | 109 … | " [ -n | [-c <cap>] [-k <key>] [-K <keypair_seed>] ]\n" |
109 | 110 … | " [ [-s <host>] [-p <port>] [ -4 | -6 ] | [-u <socket_path>] ]\n" |
110 | 111 … | " [ -a | [-t <type>] <method> [<argument>...] ]\n", stderr); |
111 | 112 … | exit(EXIT_FAILURE); |
856 | 857 … | return in == stream_state_ended_ok && out == stream_state_ended_ok ? 0 : |
857 | 858 … | in == stream_state_ended_error || out == stream_state_ended_error ? 2 : 1; |
858 | 859 … | } |
859 | 860 … | |
860 | | -static int muxrpc_duplex(struct boxs *bs, int infd, int outfd, enum pkt_type in_ptype, int req_id, bool no_newline) { |
| 861 … | +static int muxrpc_duplex(struct boxs *bs, int infd, int outfd, enum pkt_type in_ptype, int req_id, bool no_newline, bool raw) { |
861 | 862 … | int rc; |
862 | 863 … | fd_set rd; |
863 | 864 … | int sfd = bs->s; |
864 | 865 … | int maxfd = infd > sfd ? infd : sfd; |
865 | 866 … | enum stream_state in = stream_state_open; |
866 | 867 … | enum stream_state out = stream_state_open; |
867 | 868 … | |
868 | 869 … | while (out == stream_state_open |
869 | | - || (in == stream_state_open && out != stream_state_ended_error)) { |
| 870 … | + || (!raw && in == stream_state_open && out != stream_state_ended_error)) { |
870 | 871 … | FD_ZERO(&rd); |
871 | 872 … | if (in == stream_state_open) FD_SET(infd, &rd); |
872 | 873 … | if (out == stream_state_open) FD_SET(sfd, &rd); |
873 | 874 … | rc = select(maxfd + 1, &rd, 0, 0, NULL); |
956 | 957 … | ssize_t len; |
957 | 958 … | bool test = false; |
958 | 959 … | bool noauth = false; |
959 | 960 … | bool no_newline = false; |
| 961 … | + bool raw = false; |
960 | 962 … | bool host_arg = false; |
961 | 963 … | bool port_arg = false; |
962 | 964 … | bool key_arg = false; |
963 | 965 … | bool shs_cap_key_str_arg = false; |
998 | 1000 … | case '4': ipv4_arg = true; break; |
999 | 1001 … | case '6': ipv6_arg = true; break; |
1000 | 1002 … | case 'a': passthrough = true; break; |
1001 | 1003 … | case 'l': no_newline = true; break; |
| 1004 … | + case 'r': raw = true; break; |
1002 | 1005 … | default: usage(); |
1003 | 1006 … | } |
1004 | 1007 … | } |
1005 | 1008 … | if (i < argc) methodstr = argv[i++]; |
1133 | 1136 … | } |
1134 | 1137 … | |
1135 | 1138 … | muxrpc_call(&bs, method, argument, type, typestr, 1); |
1136 | 1139 … | |
| 1140 … | + struct termios orig_tc; |
| 1141 … | + if (raw) { |
| 1142 … | + struct termios raw_tc; |
| 1143 … | + rc = tcgetattr(STDIN_FILENO, &orig_tc); |
| 1144 … | + if (rc < 0) warnx("tcgetattr"); |
| 1145 … | + raw_tc = orig_tc; |
| 1146 … | + raw_tc.c_lflag &= ~(ICANON | ECHO); |
| 1147 … | + rc = tcsetattr(STDIN_FILENO, TCSANOW, &raw_tc); |
| 1148 … | + if (rc < 0) warnx("tcgetattr"); |
| 1149 … | + } |
| 1150 … | + |
1137 | 1151 … | switch (type) { |
1138 | 1152 … | case muxrpc_type_async: |
1139 | 1153 … | rc = muxrpc_read_async(&bs, STDOUT_FILENO, 1, no_newline); |
1140 | 1154 … | break; |
1148 | 1162 … | rc = muxrpc_write_sink(&bs, STDIN_FILENO, ptype, 1, no_newline); |
1149 | 1163 … | } |
1150 | 1164 … | break; |
1151 | 1165 … | case muxrpc_type_duplex: |
1152 | | - rc = muxrpc_duplex(&bs, STDIN_FILENO, STDOUT_FILENO, ptype, 1, no_newline); |
| 1166 … | + rc = muxrpc_duplex(&bs, STDIN_FILENO, STDOUT_FILENO, ptype, 1, no_newline, raw); |
1153 | 1167 … | break; |
1154 | 1168 … | } |
1155 | 1169 … | |
| 1170 … | + if (raw) { |
| 1171 … | + rc = tcsetattr(STDIN_FILENO, TCSANOW, &orig_tc); |
| 1172 … | + if (rc < 0) warnx("tcsetattr"); |
| 1173 … | + } |
| 1174 … | + |
1156 | 1175 … | bs_end(&bs); |
1157 | 1176 … | close(s); |
1158 | 1177 … | return rc; |
1159 | 1178 … | } |