annotate plugins/links/links.c @ 992:462e12e434fb

cmake: add CMake configuration
author David Demelier <markand@malikania.fr>
date Wed, 10 Feb 2021 21:31:32 +0100
parents daaf92c097e6
children 936cbd66b4b8
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 <err.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <errno.h>
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
992
462e12e434fb cmake: add CMake configuration
David Demelier <markand@malikania.fr>
parents: 990
diff changeset
30 #include <irccd/compat.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] = {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 [TPL_INFO] = "#{nickname}, voici le lien: #{title}"
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 static size_t
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 callback(char *ptr, size_t size, size_t nmemb, struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 fprintf(req->fp, "%.*s", (int)(size * nmemb), ptr);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 if (feof(req->fp) || ferror(req->fp))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 return 0;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 return size * nmemb;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 static const char *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 parse(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 regex_t regex;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 regmatch_t match[2];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 char *ret = NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 if (regcomp(&regex, "<title>([^<]+)<\\/title>", REG_EXTENDED | REG_ICASE) != 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 if (regexec(&regex, req->buf, 2, match, 0) == 0) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 ret = &req->buf[match[1].rm_so];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 ret[match[1].rm_eo - match[1].rm_so] = '\0';
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 }
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 regfree(&regex);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 return ret;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 static const char *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 fmt(const struct req *req, const char *title)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 static char line[IRC_MESSAGE_LEN];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 struct irc_subst subst = {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 .time = time(NULL),
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 .flags = IRC_SUBST_DATE | IRC_SUBST_KEYWORDS | IRC_SUBST_IRC_ATTRS,
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 .keywords = (struct irc_subst_keyword []) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 { "channel", req->chan },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 { "nickname", req->nickname },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 { "origin", req->origin },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 { "server", req->server->name },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 { "title", title }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 .keywordsz = 5
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 irc_subst(line, sizeof (line), templates[TPL_INFO], &subst);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 return line;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 req_finish(struct req *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 complete(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 const char *title;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 if (req->status && (title = parse(req)))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 irc_server_message(req->server, req->chan, fmt(req, title));
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 pthread_join(req->thr, NULL);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 req_finish(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 /*
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 * This function is running in a separate thread.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 static void *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 routine(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 typedef void (*func_t)(void *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 if (curl_easy_perform(req->curl) == 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 req->status = 1;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 irc_bot_post((func_t)complete, req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 req_finish(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 assert(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 if (req->server)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 irc_server_decref(req->server);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 if (req->curl)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 curl_easy_cleanup(req->curl);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 if (req->fp)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 fclose(req->fp);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
161
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 free(req->chan);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 free(req->nickname);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 free(req->origin);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 free(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 }
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 struct req *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 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
170 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 assert(link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 struct req *req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 struct irc_server_user user;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
175
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 if (!(req = calloc(1, sizeof (*req) + PAGE_MAX + 1))) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 free(link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 return NULL;
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 if (!(req->curl = curl_easy_init()))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 goto enomem;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 if (!(req->fp = fmemopen(req->buf, PAGE_MAX, "w")))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 goto enomem;
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 irc_server_incref(server);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 irc_server_split(origin, &user);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 req->link = link;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 req->server = server;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 req->chan = strdup(channel);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 req->nickname = strdup(user.nickname);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 req->origin = strdup(origin);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
192
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 curl_easy_setopt(req->curl, CURLOPT_URL, link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 curl_easy_setopt(req->curl, CURLOPT_FOLLOWLOCATION, 1L);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 curl_easy_setopt(req->curl, CURLOPT_WRITEFUNCTION, callback);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 curl_easy_setopt(req->curl, CURLOPT_WRITEDATA, req);
990
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
197 curl_easy_setopt(req->curl, CURLOPT_TIMEOUT, timeout);
987
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 return req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 enomem:
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 errno = ENOMEM;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 req_finish(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 req_start(struct req *req)
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 typedef void *(*func_t)(void *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 if (pthread_create(&req->thr, NULL, (func_t)routine, req) != 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 req_finish(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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 links_event(const struct irc_event *ev)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 struct req *req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 char *loc, *link, *end;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 if (ev->type != IRC_EVENT_MESSAGE)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 return;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
225
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 /* Parse link. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 if (!(loc = strstr(ev->message.message, "http://")) &&
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 !(loc = strstr(ev->message.message, "https://")))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 return;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 /* Compute end to allocate only what's needed. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 for (end = loc; *end && !isspace(*end); )
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 ++end;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 link = irc_util_strndup(loc, end - loc);
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 /* If the function fails, link is free'd anyway. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 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
239 return;
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 req_start(req);
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 links_set_template(const char *key, const char *value)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 if (strcmp(key, "info") == 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 strlcpy(templates[TPL_INFO], value, sizeof (templates[TPL_INFO]));
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
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 const char *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 links_get_template(const char *key)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 if (strcmp(key, "info") == 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 return templates[TPL_INFO];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
256
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
259
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 const char **
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 links_get_templates(void)
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 static const char *keys[] = { "info", NULL };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
264
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 return keys;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 }
988
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
267
990
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
268 void
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
269 links_set_option(const char *key, const char *value)
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
270 {
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
271 if (strcmp(key, "timeout") == 0)
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
272 timeout = atol(value);
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
273 }
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
274
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
275 const char *
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
276 links_get_option(const char *key)
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
277 {
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
278 static char out[32];
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
279
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
280 if (strcmp(key, "timeout") == 0) {
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
281 snprintf(out, sizeof (out), "%lu", timeout);
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
282 return out;
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
283 }
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
284
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
285 return NULL;
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
286 }
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
287
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
288 const char **
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
289 links_get_options(void)
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
290 {
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
291 static const char *keys[] = { "timeout", NULL };
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
292
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
293 return keys;
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
294 }
daaf92c097e6 plugin links: add timeout support
David Demelier <markand@malikania.fr>
parents: 988
diff changeset
295
988
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
296 const char *links_description = "Parse links from messages";
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
297 const char *links_version = IRCCD_VERSION;
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
298 const char *links_license = "ISC";
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
299 const char *links_author = "David Demelier <markand@malikania.fr>";