cli.c - frontends - front-ends for some sites (experiment)
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
cli.c (2498B)
---
1 #include <sys/socket.h>
2 #include <sys/types.h>
3
4 #include <ctype.h>
5 #include <errno.h>
6 #include <netdb.h>
7 #include <stdarg.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <time.h>
12 #include <unistd.h>
13
14 #include "https.h"
15 #include "reddit.h"
16 #include "util.h"
17
18 #define OUT(s) (fputs((s), stdout))
19 #define OUTESCAPE(s) (printescape(s))
20
21 /* print: ignore control-characters */
22 void
23 printescape(const char *s)
24 {
25 for (; *s; ++s)
26 if (!iscntrl((unsigned char)*s))
27 fputc(*s, stdout);
28 }
29
30 void
31 printitem(struct item *item)
32 {
33 if (!item || !item->title[0])
34 return;
35
36 printf("title: %s\n", item->title);
37 printf("url: %s\n", item->url);
38 printf("subreddit: %s\n", item->subreddit);
39 printf("author: %s\n", item->author);
40 printf("thumbnail: %s\n", item->thumbnail);
41 printf("ups: %ld\n", item->ups);
42 printf("downs: %ld\n", item->downs);
43 printf("num_comments: %ld\n", item->num_comments);
44
45 struct tm *tm = gmtime(&(item->created_utc));
46 printf("created_utc: %lld\n", (long long)item->created_utc);
47 printf("created_utc: %s", asctime(tm));
48
49 if (item->is_video) {
50 printf("is_video: %d\n", item->is_video);
51 printf("duration: %ld\n", item->duration);
52 printf("dash_url: %s\n", item->dash_url);
53 }
54
55 printf("===\n");
56 }
57
58 int
59 render(struct list_response *r)
60 {
61 size_t i;
62
63 if (pledge("stdio", NULL) == -1) {
64 fprintf(stderr, "pledge: %s\n", strerror(errno));
65 exit(1);
66 }
67
68 for (i = 0; i < r->nitems; i++)
69 printitem(&(r->items[i]));
70
71 if (r->before[0])
72 printf("before pagination token: %s\n", r->before);
73 if (r->after[0])
74 printf("after pagination token: %s\n", r->after);
75
76 return 0;
77 }
78
79 static void
80 usage(const char *argv0)
81 {
82 fprintf(stderr, "usage: %s [subreddit]\n", argv0);
83 exit(1);
84 }
85
86 int
87 main(int argc, char *argv[])
88 {
89 struct list_response *r;
90 char subreddit[1024] = "";
91
92 if (pledge("stdio dns inet rpath unveil", NULL) == -1) {
93 fprintf(stderr, "pledge: %s\n", strerror(errno));
94 exit(1);
95 }
96 if (unveil(TLS_CA_CERT_FILE, "r") == -1) {
97 fprintf(stderr, "unveil: %s\n", strerror(errno));
98 exit(1);
99 }
100 if (unveil(NULL, NULL) == -1) {
101 fprintf(stderr, "unveil: %s\n", strerror(errno));
102 exit(1);
103 }
104
105 if (argc > 1) {
106 if (!uriencode(argv[1], subreddit, sizeof(subreddit)))
107 usage(argv[0]);
108 }
109
110 r = reddit_list(subreddit, 100, "", ""); /* TODO: pagination */
111 if (!r || r->nitems == 0) {
112 OUT("No items found\n");
113 exit(1);
114 }
115
116 render(r);
117
118 return 0;
119 }