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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
987
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * links.c -- links plugin
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <ctype.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <errno.h>
1011
a35537c50f09 irccd: hide conn implementation
David Demelier <markand@malikania.fr>
parents: 1007
diff changeset
22 #include <pthread.h>
987
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <regex.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <stdio.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <stdlib.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <string.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <curl/curl.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
1011
a35537c50f09 irccd: hide conn implementation
David Demelier <markand@malikania.fr>
parents: 1007
diff changeset
30 #include <irccd/config.h>
987
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include <irccd/irccd.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include <irccd/limits.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include <irccd/server.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <irccd/subst.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include <irccd/util.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 /*
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 * Since most websites are now bloated, we need a very large page size to
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 * analyse. Use 5MB for now.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 #define PAGE_MAX 5242880
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 struct req {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 pthread_t thr;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 CURL *curl;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 struct irc_server *server;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 int status;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 char *link;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 char *chan;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 char *nickname;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 char *origin;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 FILE *fp;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 char buf[];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 enum {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 TPL_INFO
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 static size_t
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 callback(char *ptr, size_t size, size_t nmemb, struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 fprintf(req->fp, "%.*s", (int)(size * nmemb), ptr);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 if (feof(req->fp) || ferror(req->fp))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 return 0;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 return size * nmemb;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
1033
330a5db51c62 plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents: 1031
diff changeset
89 static char *
987
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 parse(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 regex_t regex;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 regmatch_t match[2];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 char *ret = NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
1031
a20060091063 plugin links: whitespace
David Demelier <markand@malikania.fr>
parents: 1011
diff changeset
96 if (regcomp(&regex, "<title>([^<]+)<\\/title>", REG_EXTENDED | REG_ICASE) != 0)
987
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 if (regexec(&regex, req->buf, 2, match, 0) == 0) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 ret = &req->buf[match[1].rm_so];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 ret[match[1].rm_eo - match[1].rm_so] = '\0';
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 regfree(&regex);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
105
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 return ret;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 struct irc_subst subst = {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 .time = time(NULL),
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 .flags = IRC_SUBST_DATE | IRC_SUBST_KEYWORDS | IRC_SUBST_IRC_ATTRS,
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 .keywords = (struct irc_subst_keyword []) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 { "channel", req->chan },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 { "nickname", req->nickname },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 { "origin", req->origin },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 .keywordsz = 5
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
182
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 irc_subst(line, sizeof (line), templates[TPL_INFO], &subst);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 return line;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
187
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 req_finish(struct req *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 complete(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 {
1033
330a5db51c62 plugin links: remove basic entities
David Demelier <markand@malikania.fr>
parents: 1031
diff changeset
194 char *title;
987
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
195
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 if (req->status && (title = parse(req)))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 irc_server_message(req->server, req->chan, fmt(req, title));
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 pthread_join(req->thr, NULL);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 req_finish(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 /*
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 * This function is running in a separate thread.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 static void *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 routine(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 typedef void (*func_t)(void *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 if (curl_easy_perform(req->curl) == 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 req->status = 1;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 irc_bot_post((func_t)complete, req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 req_finish(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 assert(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 if (req->server)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 irc_server_decref(req->server);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 if (req->curl)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 curl_easy_cleanup(req->curl);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 if (req->fp)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 fclose(req->fp);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
1007
936cbd66b4b8 plugin links: fix a leak
David Demelier <markand@malikania.fr>
parents: 992
diff changeset
231 free(req->link);
987
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 free(req->chan);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 free(req->nickname);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 free(req->origin);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 free(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
237
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 static struct req *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 req_new(struct irc_server *server, const char *origin, const char *channel, char *link)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 assert(link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 struct req *req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 struct irc_server_user user;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 if (!(req = calloc(1, sizeof (*req) + PAGE_MAX + 1))) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 free(link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 if (!(req->curl = curl_easy_init()))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 goto enomem;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 if (!(req->fp = fmemopen(req->buf, PAGE_MAX, "w")))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 goto enomem;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
254
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 irc_server_incref(server);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 irc_server_split(origin, &user);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 req->link = link;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 req->server = server;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 req->chan = strdup(channel);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 req->nickname = strdup(user.nickname);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 req->origin = strdup(origin);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
262
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 curl_easy_setopt(req->curl, CURLOPT_URL, link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 curl_easy_setopt(req->curl, CURLOPT_FOLLOWLOCATION, 1L);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 curl_easy_setopt(req->curl, CURLOPT_WRITEFUNCTION, callback);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
268
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 return req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
270
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 enomem:
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 errno = ENOMEM;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 req_finish(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
274
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
277
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 req_start(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 typedef void *(*func_t)(void *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
282
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 if (pthread_create(&req->thr, NULL, (func_t)routine, req) != 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 req_finish(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
286
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 links_event(const struct irc_event *ev)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 struct req *req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 char *loc, *link, *end;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
292
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 if (ev->type != IRC_EVENT_MESSAGE)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 return;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
295
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 /* Parse link. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 if (!(loc = strstr(ev->message.message, "http://")) &&
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 !(loc = strstr(ev->message.message, "https://")))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 return;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
300
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 /* Compute end to allocate only what's needed. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 for (end = loc; *end && !isspace(*end); )
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 ++end;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 link = irc_util_strndup(loc, end - loc);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
306
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 /* If the function fails, link is free'd anyway. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 if (!(req = req_new(ev->server, ev->message.origin, ev->message.channel, link)))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 return;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
310
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 req_start(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
313
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 links_set_template(const char *key, const char *value)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
320
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 const char *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 links_get_template(const char *key)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 if (strcmp(key, "info") == 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 return templates[TPL_INFO];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
326
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 const char **
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 links_get_templates(void)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 static const char *keys[] = { "info", NULL };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
334
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 return keys;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
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>";