cli.c - frontends - front-ends for some sites (experiment) (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- cli.c (1418B) --- 1 #include <sys/types.h> 2 3 #include <ctype.h> 4 #include <err.h> 5 #include <errno.h> 6 #include <locale.h> 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <string.h> 10 #include <unistd.h> 11 #include <wchar.h> 12 13 #include "duckduckgo.h" 14 #include "https.h" 15 #include "util.h" 16 17 #define OUT(s) fputs((s), stdout) 18 #define OUTESCAPE(s) printescape((s)) 19 20 /* print: ignore control-characters */ 21 void 22 printescape(const char *s) 23 { 24 for (; *s; ++s) 25 if (!iscntrl((unsigned char)*s)) 26 fputc(*s, stdout); 27 } 28 29 int 30 main(int argc, char *argv[]) 31 { 32 struct duckduckgo_results *results; 33 struct duckduckgo_result *result; 34 char buf[512]; 35 size_t i; 36 37 setlocale(LC_CTYPE, ""); 38 39 if (pledge("stdio dns inet rpath unveil", NULL) == -1) { 40 fprintf(stderr, "pledge: %s\n", strerror(errno)); 41 exit(1); 42 } 43 if (unveil(TLS_CA_CERT_FILE, "r") == -1) { 44 fprintf(stderr, "unveil: %s\n", strerror(errno)); 45 exit(1); 46 } 47 if (unveil(NULL, NULL) == -1) { 48 fprintf(stderr, "unveil: %s\n", strerror(errno)); 49 exit(1); 50 } 51 52 if (argc != 2) { 53 fprintf(stderr, "usage: %s <search>\n", argv[0]); 54 exit(1); 55 } 56 57 results = duckduckgo_search(argv[1]); 58 if (pledge("stdio", NULL) == -1) 59 err(1, "pledge"); 60 61 if (results) { 62 for (i = 0; i < results->nitems; i++) { 63 result = &(results->items[i]); 64 65 if (utf8pad(buf, sizeof(buf), result->title, 70, ' ') != -1) 66 OUTESCAPE(buf); 67 OUT(" "); 68 OUTESCAPE(result->urldecoded); 69 OUT("\n"); 70 } 71 } 72 73 return 0; 74 }