Mercurial > irccd
annotate plugins/links/links.c @ 1091:52be05336310
irccdctl: misc cleanups
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 21 Jul 2021 16:06:36 +0200 |
parents | 8f26ee9cc6dd |
children | ae8b91ec4e4a |
rev | line source |
---|---|
987 | 1 /* |
2 * links.c -- links plugin | |
3 * | |
4 * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <assert.h> | |
20 #include <ctype.h> | |
21 #include <errno.h> | |
1011
a35537c50f09
irccd: hide conn implementation
David Demelier <markand@malikania.fr>
parents:
1007
diff
changeset
|
22 #include <pthread.h> |
987 | 23 #include <regex.h> |
24 #include <stdio.h> | |
25 #include <stdlib.h> | |
26 #include <string.h> | |
27 | |
28 #include <curl/curl.h> | |
29 | |
1011
a35537c50f09
irccd: hide conn implementation
David Demelier <markand@malikania.fr>
parents:
1007
diff
changeset
|
30 #include <irccd/config.h> |
987 | 31 #include <irccd/irccd.h> |
32 #include <irccd/limits.h> | |
33 #include <irccd/server.h> | |
34 #include <irccd/subst.h> | |
35 #include <irccd/util.h> | |
36 | |
37 /* | |
38 * Since most websites are now bloated, we need a very large page size to | |
39 * analyse. Use 5MB for now. | |
40 */ | |
41 #define PAGE_MAX 5242880 | |
42 | |
43 struct req { | |
44 pthread_t thr; | |
45 CURL *curl; | |
46 struct irc_server *server; | |
47 int status; | |
48 char *link; | |
49 char *chan; | |
50 char *nickname; | |
51 char *origin; | |
52 FILE *fp; | |
53 char buf[]; | |
54 }; | |
55 | |
56 enum { | |
57 TPL_INFO | |
58 }; | |
59 | |
990
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
60 static unsigned long timeout = 30; |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
61 |
987 | 62 static char templates[][512] = { |
1007
936cbd66b4b8
plugin links: fix a leak
David Demelier <markand@malikania.fr>
parents:
992
diff
changeset
|
63 [TPL_INFO] = "link from #{nickname}: #{title}" |
987 | 64 }; |
65 | |
1033
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
66 static const struct { |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
67 const char *key; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
68 int repl; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
69 } entities[] = { |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
70 { "quot", '"' }, |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
71 { "amp", '&' }, |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
72 { "apos", '\'' }, |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
73 { "lt", '<' }, |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
74 { "gt", '>' }, |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
75 { NULL, 0 } |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
76 }; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
77 |
987 | 78 static size_t |
79 callback(char *ptr, size_t size, size_t nmemb, struct req *req) | |
80 { | |
81 fprintf(req->fp, "%.*s", (int)(size * nmemb), ptr); | |
82 | |
83 if (feof(req->fp) || ferror(req->fp)) | |
84 return 0; | |
85 | |
86 return size * nmemb; | |
87 } | |
88 | |
1033
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
89 static char * |
987 | 90 parse(struct req *req) |
91 { | |
92 regex_t regex; | |
93 regmatch_t match[2]; | |
94 char *ret = NULL; | |
95 | |
1031
a20060091063
plugin links: whitespace
David Demelier <markand@malikania.fr>
parents:
1011
diff
changeset
|
96 if (regcomp(®ex, "<title>([^<]+)<\\/title>", REG_EXTENDED | REG_ICASE) != 0) |
987 | 97 return NULL; |
98 | |
99 if (regexec(®ex, req->buf, 2, match, 0) == 0) { | |
100 ret = &req->buf[match[1].rm_so]; | |
101 ret[match[1].rm_eo - match[1].rm_so] = '\0'; | |
102 } | |
103 | |
104 regfree(®ex); | |
105 | |
106 return ret; | |
107 } | |
108 | |
1033
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
109 static int |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
110 find_entity(const char *key) |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
111 { |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
112 for (size_t i = 0; entities[i].key; ++i) |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
113 if (strcmp(entities[i].key, key) == 0) |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
114 return entities[i].repl; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
115 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
116 return EOF; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
117 } |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
118 |
987 | 119 static const char * |
1033
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
120 untitle(char *title) |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
121 { |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
122 static char ret[256] = {0}; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
123 char *save; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
124 int repl; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
125 FILE *fp = NULL; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
126 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
127 if (!(fp = fmemopen(ret, sizeof (ret) - 1, "w"))) |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
128 goto fallback; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
129 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
130 for (char *p = title; *p; ) { |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
131 /* Standard character. */ |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
132 if (*p != '&') { |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
133 if (fputc(*p++, fp) == EOF) |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
134 goto fallback; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
135 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
136 continue; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
137 } |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
138 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
139 /* HTML entity. */ |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
140 save = ++p; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
141 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
142 while (*p && *p != ';') |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
143 ++p; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
144 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
145 /* Found an entity. */ |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
146 if (*p == ';') { |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
147 *p++ = '\0'; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
148 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
149 if ((repl = find_entity(save)) != EOF) |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
150 fputc(repl, fp); |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
151 } |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
152 } |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
153 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
154 fclose(fp); |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
155 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
156 return ret; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
157 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
158 fallback: |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
159 if (fp) |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
160 fclose(fp); |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
161 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
162 return title; |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
163 } |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
164 |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
165 static const char * |
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
166 fmt(const struct req *req, char *title) |
987 | 167 { |
168 static char line[IRC_MESSAGE_LEN]; | |
1033
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
169 |
987 | 170 struct irc_subst subst = { |
171 .time = time(NULL), | |
172 .flags = IRC_SUBST_DATE | IRC_SUBST_KEYWORDS | IRC_SUBST_IRC_ATTRS, | |
173 .keywords = (struct irc_subst_keyword []) { | |
174 { "channel", req->chan }, | |
175 { "nickname", req->nickname }, | |
176 { "origin", req->origin }, | |
177 { "server", req->server->name }, | |
1033
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
178 { "title", untitle(title) } |
987 | 179 }, |
180 .keywordsz = 5 | |
181 }; | |
182 | |
183 irc_subst(line, sizeof (line), templates[TPL_INFO], &subst); | |
184 | |
185 return line; | |
186 } | |
187 | |
188 static void | |
189 req_finish(struct req *); | |
190 | |
191 static void | |
192 complete(struct req *req) | |
193 { | |
1033
330a5db51c62
plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents:
1031
diff
changeset
|
194 char *title; |
987 | 195 |
196 if (req->status && (title = parse(req))) | |
197 irc_server_message(req->server, req->chan, fmt(req, title)); | |
198 | |
199 pthread_join(req->thr, NULL); | |
200 req_finish(req); | |
201 } | |
202 | |
203 /* | |
204 * This function is running in a separate thread. | |
205 */ | |
206 static void * | |
207 routine(struct req *req) | |
208 { | |
209 typedef void (*func_t)(void *); | |
210 | |
211 if (curl_easy_perform(req->curl) == 0) | |
212 req->status = 1; | |
213 | |
214 irc_bot_post((func_t)complete, req); | |
215 | |
216 return NULL; | |
217 } | |
218 | |
219 static void | |
220 req_finish(struct req *req) | |
221 { | |
222 assert(req); | |
223 | |
224 if (req->server) | |
225 irc_server_decref(req->server); | |
226 if (req->curl) | |
227 curl_easy_cleanup(req->curl); | |
228 if (req->fp) | |
229 fclose(req->fp); | |
230 | |
1007
936cbd66b4b8
plugin links: fix a leak
David Demelier <markand@malikania.fr>
parents:
992
diff
changeset
|
231 free(req->link); |
987 | 232 free(req->chan); |
233 free(req->nickname); | |
234 free(req->origin); | |
235 free(req); | |
236 } | |
237 | |
238 static struct req * | |
239 req_new(struct irc_server *server, const char *origin, const char *channel, char *link) | |
240 { | |
241 assert(link); | |
242 | |
243 struct req *req; | |
244 struct irc_server_user user; | |
245 | |
246 if (!(req = calloc(1, sizeof (*req) + PAGE_MAX + 1))) { | |
247 free(link); | |
248 return NULL; | |
249 } | |
250 if (!(req->curl = curl_easy_init())) | |
251 goto enomem; | |
252 if (!(req->fp = fmemopen(req->buf, PAGE_MAX, "w"))) | |
253 goto enomem; | |
254 | |
255 irc_server_incref(server); | |
256 irc_server_split(origin, &user); | |
257 req->link = link; | |
258 req->server = server; | |
259 req->chan = strdup(channel); | |
260 req->nickname = strdup(user.nickname); | |
261 req->origin = strdup(origin); | |
262 | |
263 curl_easy_setopt(req->curl, CURLOPT_URL, link); | |
264 curl_easy_setopt(req->curl, CURLOPT_FOLLOWLOCATION, 1L); | |
265 curl_easy_setopt(req->curl, CURLOPT_WRITEFUNCTION, callback); | |
266 curl_easy_setopt(req->curl, CURLOPT_WRITEDATA, req); | |
990
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
267 curl_easy_setopt(req->curl, CURLOPT_TIMEOUT, timeout); |
987 | 268 |
269 return req; | |
270 | |
271 enomem: | |
272 errno = ENOMEM; | |
273 req_finish(req); | |
274 | |
275 return NULL; | |
276 } | |
277 | |
278 static void | |
279 req_start(struct req *req) | |
280 { | |
281 typedef void *(*func_t)(void *); | |
282 | |
283 if (pthread_create(&req->thr, NULL, (func_t)routine, req) != 0) | |
284 req_finish(req); | |
285 } | |
286 | |
287 void | |
288 links_event(const struct irc_event *ev) | |
289 { | |
290 struct req *req; | |
291 char *loc, *link, *end; | |
292 | |
293 if (ev->type != IRC_EVENT_MESSAGE) | |
294 return; | |
295 | |
296 /* Parse link. */ | |
297 if (!(loc = strstr(ev->message.message, "http://")) && | |
298 !(loc = strstr(ev->message.message, "https://"))) | |
299 return; | |
300 | |
301 /* Compute end to allocate only what's needed. */ | |
302 for (end = loc; *end && !isspace(*end); ) | |
303 ++end; | |
304 | |
305 link = irc_util_strndup(loc, end - loc); | |
306 | |
307 /* If the function fails, link is free'd anyway. */ | |
308 if (!(req = req_new(ev->server, ev->message.origin, ev->message.channel, link))) | |
309 return; | |
310 | |
311 req_start(req); | |
312 } | |
313 | |
314 void | |
315 links_set_template(const char *key, const char *value) | |
316 { | |
317 if (strcmp(key, "info") == 0) | |
1079
8f26ee9cc6dd
misc: unconditionnally add BSD->POSIX extensions
David Demelier <markand@malikania.fr>
parents:
1065
diff
changeset
|
318 irc_util_strlcpy(templates[TPL_INFO], value, sizeof (templates[TPL_INFO])); |
987 | 319 } |
320 | |
321 const char * | |
322 links_get_template(const char *key) | |
323 { | |
324 if (strcmp(key, "info") == 0) | |
325 return templates[TPL_INFO]; | |
326 | |
327 return NULL; | |
328 } | |
329 | |
330 const char ** | |
331 links_get_templates(void) | |
332 { | |
333 static const char *keys[] = { "info", NULL }; | |
334 | |
335 return keys; | |
336 } | |
988
2e02fbb8b32b
irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents:
987
diff
changeset
|
337 |
990
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
338 void |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
339 links_set_option(const char *key, const char *value) |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
340 { |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
341 if (strcmp(key, "timeout") == 0) |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
342 timeout = atol(value); |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
343 } |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
344 |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
345 const char * |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
346 links_get_option(const char *key) |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
347 { |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
348 static char out[32]; |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
349 |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
350 if (strcmp(key, "timeout") == 0) { |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
351 snprintf(out, sizeof (out), "%lu", timeout); |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
352 return out; |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
353 } |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
354 |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
355 return NULL; |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
356 } |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
357 |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
358 const char ** |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
359 links_get_options(void) |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
360 { |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
361 static const char *keys[] = { "timeout", NULL }; |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
362 |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
363 return keys; |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
364 } |
daaf92c097e6
plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents:
988
diff
changeset
|
365 |
988
2e02fbb8b32b
irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents:
987
diff
changeset
|
366 const char *links_description = "Parse links from messages"; |
2e02fbb8b32b
irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents:
987
diff
changeset
|
367 const char *links_version = IRCCD_VERSION; |
2e02fbb8b32b
irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents:
987
diff
changeset
|
368 const char *links_license = "ISC"; |
2e02fbb8b32b
irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents:
987
diff
changeset
|
369 const char *links_author = "David Demelier <markand@malikania.fr>"; |