Blame


1 497977d5 2021-01-23 op /*
2 497977d5 2021-01-23 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 497977d5 2021-01-23 op *
4 497977d5 2021-01-23 op * Permission to use, copy, modify, and distribute this software for any
5 497977d5 2021-01-23 op * purpose with or without fee is hereby granted, provided that the above
6 497977d5 2021-01-23 op * copyright notice and this permission notice appear in all copies.
7 497977d5 2021-01-23 op *
8 497977d5 2021-01-23 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 497977d5 2021-01-23 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 497977d5 2021-01-23 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 497977d5 2021-01-23 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 497977d5 2021-01-23 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 497977d5 2021-01-23 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 497977d5 2021-01-23 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 497977d5 2021-01-23 op */
16 497977d5 2021-01-23 op
17 497977d5 2021-01-23 op #include <string.h>
18 497977d5 2021-01-23 op
19 497977d5 2021-01-23 op #include "gmid.h"
20 497977d5 2021-01-23 op
21 58173ca2 2021-01-27 op int flag2, flag3, bflag, cflag, hflag, Nflag, Vflag, vflag;
22 58173ca2 2021-01-27 op
23 497977d5 2021-01-23 op int
24 497977d5 2021-01-23 op main(int argc, char **argv)
25 497977d5 2021-01-23 op {
26 497977d5 2021-01-23 op struct iri iri;
27 497977d5 2021-01-23 op struct tls_config *conf;
28 497977d5 2021-01-23 op struct tls *ctx;
29 9adde3d8 2021-01-23 op char iribuf[GEMINI_URL_LEN], buf[GEMINI_URL_LEN];
30 497977d5 2021-01-23 op const char *parse_err = "unknown error", *port = "1965";
31 58173ca2 2021-01-27 op const char *hostname;
32 497977d5 2021-01-23 op char *t;
33 58173ca2 2021-01-27 op int ch;
34 58173ca2 2021-01-27 op int handshake;
35 497977d5 2021-01-23 op ssize_t len;
36 497977d5 2021-01-23 op
37 58173ca2 2021-01-27 op hostname = NULL;
38 58173ca2 2021-01-27 op while ((ch = getopt(argc, argv, "23cbH:hNVv")) != -1) {
39 497977d5 2021-01-23 op switch (ch) {
40 497977d5 2021-01-23 op case '2':
41 497977d5 2021-01-23 op flag2 = 1;
42 497977d5 2021-01-23 op break;
43 497977d5 2021-01-23 op case '3':
44 497977d5 2021-01-23 op flag3 = 1;
45 497977d5 2021-01-23 op break;
46 497977d5 2021-01-23 op case 'b':
47 497977d5 2021-01-23 op bflag = 1;
48 497977d5 2021-01-23 op break;
49 497977d5 2021-01-23 op case 'c':
50 497977d5 2021-01-23 op cflag = 1;
51 497977d5 2021-01-23 op break;
52 58173ca2 2021-01-27 op case 'H':
53 58173ca2 2021-01-27 op hostname = optarg;
54 58173ca2 2021-01-27 op break;
55 497977d5 2021-01-23 op case 'h':
56 497977d5 2021-01-23 op hflag = 1;
57 497977d5 2021-01-23 op break;
58 497977d5 2021-01-23 op case 'N':
59 497977d5 2021-01-23 op Nflag = 1;
60 497977d5 2021-01-23 op break;
61 497977d5 2021-01-23 op case 'V':
62 497977d5 2021-01-23 op Vflag = 1;
63 497977d5 2021-01-23 op break;
64 58173ca2 2021-01-27 op case 'v':
65 58173ca2 2021-01-27 op vflag = 1;
66 58173ca2 2021-01-27 op break;
67 497977d5 2021-01-23 op default:
68 58173ca2 2021-01-27 op fprintf(stderr, "USAGE: %s [-23cbhNVv] [-H hostname]\n",
69 58173ca2 2021-01-27 op *argv);
70 497977d5 2021-01-23 op return 1;
71 497977d5 2021-01-23 op }
72 497977d5 2021-01-23 op }
73 497977d5 2021-01-23 op argc -= optind;
74 497977d5 2021-01-23 op argv += optind;
75 497977d5 2021-01-23 op
76 497977d5 2021-01-23 op if ((bflag + cflag + hflag + Vflag) > 1)
77 497977d5 2021-01-23 op errx(1, "only one of bchr flags can be used.");
78 497977d5 2021-01-23 op
79 497977d5 2021-01-23 op if (flag2 + flag3 > 1)
80 497977d5 2021-01-23 op errx(1, "only -2 or -3 can be specified at the same time.");
81 497977d5 2021-01-23 op
82 497977d5 2021-01-23 op if (argc != 1)
83 497977d5 2021-01-23 op errx(1, "missing IRI");
84 497977d5 2021-01-23 op
85 497977d5 2021-01-23 op if (strlcpy(iribuf, argv[0], sizeof(iribuf)) >= sizeof(iribuf))
86 497977d5 2021-01-23 op errx(1, "request too long: %s", argv[0]);
87 9adde3d8 2021-01-23 op if (strlcpy(buf, argv[0], sizeof(buf)) >= sizeof(iribuf))
88 497977d5 2021-01-23 op errx(1, "request too long: %s", argv[0]);
89 9adde3d8 2021-01-23 op if (strlcat(buf, "\r\n", sizeof(buf)) >= sizeof(buf))
90 497977d5 2021-01-23 op errx(1, "request too long: %s", argv[0]);
91 497977d5 2021-01-23 op
92 497977d5 2021-01-23 op if (!parse_iri(iribuf, &iri, &parse_err))
93 497977d5 2021-01-23 op errx(1, "invalid IRI: %s", parse_err);
94 497977d5 2021-01-23 op
95 497977d5 2021-01-23 op if (Vflag)
96 497977d5 2021-01-23 op errx(0, "IRI: OK");
97 497977d5 2021-01-23 op
98 497977d5 2021-01-23 op if ((conf = tls_config_new()) == NULL)
99 497977d5 2021-01-23 op errx(1, "tls_config_new");
100 497977d5 2021-01-23 op
101 497977d5 2021-01-23 op tls_config_insecure_noverifycert(conf);
102 497977d5 2021-01-23 op if (Nflag)
103 497977d5 2021-01-23 op tls_config_insecure_noverifyname(conf);
104 497977d5 2021-01-23 op
105 497977d5 2021-01-23 op if (flag2 && tls_config_set_protocols(conf, TLS_PROTOCOL_TLSv1_2) == -1)
106 497977d5 2021-01-23 op errx(1, "cannot set TLSv1.2");
107 497977d5 2021-01-23 op if (flag3 && tls_config_set_protocols(conf, TLS_PROTOCOL_TLSv1_3) == -1)
108 497977d5 2021-01-23 op errx(1, "cannot set TLSv1.3");
109 497977d5 2021-01-23 op
110 497977d5 2021-01-23 op if ((ctx = tls_client()) == NULL)
111 497977d5 2021-01-23 op errx(1, "tls_client creation failed");
112 497977d5 2021-01-23 op
113 497977d5 2021-01-23 op if (tls_configure(ctx, conf) == -1)
114 497977d5 2021-01-23 op errx(1, "tls_configure: %s", tls_error(ctx));
115 497977d5 2021-01-23 op
116 d760973a 2021-01-23 op if (*iri.port != '\0')
117 d760973a 2021-01-23 op port = iri.port;
118 58173ca2 2021-01-27 op
119 58173ca2 2021-01-27 op if (hostname == NULL)
120 58173ca2 2021-01-27 op hostname = iri.host;
121 58173ca2 2021-01-27 op
122 58173ca2 2021-01-27 op if (tls_connect_servername(ctx, iri.host, port, hostname) == -1)
123 497977d5 2021-01-23 op errx(1, "tls_connect: %s", tls_error(ctx));
124 497977d5 2021-01-23 op
125 58173ca2 2021-01-27 op for (handshake = 0; !handshake;) {
126 58173ca2 2021-01-27 op switch (tls_handshake(ctx)) {
127 58173ca2 2021-01-27 op case 0:
128 58173ca2 2021-01-27 op case -1:
129 58173ca2 2021-01-27 op handshake = 1;
130 58173ca2 2021-01-27 op break;
131 58173ca2 2021-01-27 op }
132 58173ca2 2021-01-27 op }
133 497977d5 2021-01-23 op
134 58173ca2 2021-01-27 op if (vflag)
135 58173ca2 2021-01-27 op printf("%s", buf);
136 58173ca2 2021-01-27 op if (tls_write(ctx, buf, strlen(buf)) == -1)
137 58173ca2 2021-01-27 op errx(1, "tls_write: %s", tls_error(ctx));
138 58173ca2 2021-01-27 op
139 497977d5 2021-01-23 op for (;;) {
140 f62aab51 2021-01-23 op switch (len = tls_read(ctx, buf, sizeof(buf))) {
141 f62aab51 2021-01-23 op case 0:
142 f62aab51 2021-01-23 op case -1:
143 f62aab51 2021-01-23 op goto end;
144 f62aab51 2021-01-23 op case TLS_WANT_POLLIN:
145 f62aab51 2021-01-23 op case TLS_WANT_POLLOUT:
146 f62aab51 2021-01-23 op continue;
147 f62aab51 2021-01-23 op }
148 497977d5 2021-01-23 op
149 497977d5 2021-01-23 op if (bflag) {
150 497977d5 2021-01-23 op bflag = 0;
151 497977d5 2021-01-23 op if ((t = strchr(buf, '\r')) != NULL)
152 497977d5 2021-01-23 op t += 2;
153 497977d5 2021-01-23 op else if ((t = strchr(buf, '\n')) != NULL)
154 497977d5 2021-01-23 op t += 1;
155 497977d5 2021-01-23 op else
156 497977d5 2021-01-23 op continue;
157 497977d5 2021-01-23 op len -= t - buf;
158 497977d5 2021-01-23 op write(1, t, len);
159 497977d5 2021-01-23 op continue;
160 497977d5 2021-01-23 op }
161 497977d5 2021-01-23 op
162 497977d5 2021-01-23 op if (cflag) {
163 497977d5 2021-01-23 op write(1, buf, 2);
164 497977d5 2021-01-23 op write(1, "\n", 1);
165 497977d5 2021-01-23 op break;
166 497977d5 2021-01-23 op }
167 497977d5 2021-01-23 op
168 497977d5 2021-01-23 op if (hflag) {
169 497977d5 2021-01-23 op t = strchr(buf, '\r');
170 497977d5 2021-01-23 op if (t == NULL)
171 497977d5 2021-01-23 op t = strchr(buf, '\n');
172 497977d5 2021-01-23 op if (t == NULL)
173 497977d5 2021-01-23 op t = &buf[len];
174 497977d5 2021-01-23 op write(1, buf, t - buf);
175 497977d5 2021-01-23 op write(1, "\n", 1);
176 497977d5 2021-01-23 op break;
177 497977d5 2021-01-23 op }
178 497977d5 2021-01-23 op
179 497977d5 2021-01-23 op write(1, buf, len);
180 497977d5 2021-01-23 op }
181 f62aab51 2021-01-23 op end:
182 497977d5 2021-01-23 op
183 497977d5 2021-01-23 op tls_close(ctx);
184 497977d5 2021-01-23 op tls_free(ctx);
185 497977d5 2021-01-23 op
186 497977d5 2021-01-23 op return 0;
187 497977d5 2021-01-23 op }