gopher.c - frontends - front-ends for some sites (experiment)
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
gopher.c (1753B)
---
1 #include <sys/types.h>
2
3 #include <ctype.h>
4 #include <errno.h>
5 #include <locale.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <unistd.h>
10 #include <wchar.h>
11
12 #include "duckduckgo.h"
13 #include "https.h"
14 #include "util.h"
15
16 #define OUT(s) fputs(s, stdout)
17 #define OUTTEXT(s) gophertext(stdout, s, strlen(s))
18
19 static const char *host = "127.0.0.1", *port = "70";
20
21 int
22 main(void)
23 {
24 struct duckduckgo_results *results;
25 struct duckduckgo_result *result;
26 char *p, *search = NULL;
27 size_t i;
28
29 setlocale(LC_CTYPE, "");
30
31 if ((p = getenv("SERVER_NAME")))
32 host = p;
33 if ((p = getenv("SERVER_PORT")))
34 port = p;
35 if (!(p = getenv("X_GOPHER_SEARCH"))) /* geomyidae */
36 p = getenv("SEARCHREQUEST"); /* gophernicus */
37 if (p)
38 search = p;
39
40 if (pledge("stdio dns inet rpath unveil", NULL) == -1) {
41 fprintf(stderr, "pledge: %s\n", strerror(errno));
42 exit(1);
43 }
44 if (unveil(TLS_CA_CERT_FILE, "r") == -1) {
45 fprintf(stderr, "unveil: %s\n", strerror(errno));
46 exit(1);
47 }
48 if (unveil(NULL, NULL) == -1) {
49 fprintf(stderr, "unveil: %s\n", strerror(errno));
50 exit(1);
51 }
52
53 if (search == NULL) {
54 printf("3\tSpecify a search term\t%s\t%s\r\n", host, port);
55 printf(".\r\n");
56 exit(1);
57 }
58
59 if ((results = duckduckgo_search(search))) {
60 for (i = 0; i < results->nitems; i++) {
61 result = &(results->items[i]);
62
63 OUT("h");
64 OUTTEXT(result->title);
65 OUT("\tURL:");
66 OUTTEXT(result->urldecoded);
67 printf("\t%s\t%s\r\n", host, port);
68
69 /* TODO: multi-line wrap ? */
70 OUT("h");
71 OUTTEXT(result->description);
72 OUT("\tURL:");
73 OUTTEXT(result->urldecoded);
74 printf("\t%s\t%s\r\n", host, port);
75
76 printf("i\t\t%s\t%s\r\n", host, port);
77 printf("i\t\t%s\t%s\r\n", host, port);
78 }
79 }
80 printf(".\r\n");
81
82 return 0;
83 }