summaryrefslogtreecommitdiff
path: root/curlfilter.c
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2017-10-31 13:23:59 +0100
committerLars-Dominik Braun <lars@6xq.net>2017-10-31 13:23:59 +0100
commit854459cb11d29093bf8dc6e98c3cfb6ba208ec6c (patch)
treead5f8232108c900ae1356161ceb394a348cd637f /curlfilter.c
downloadcurlfilter-854459cb11d29093bf8dc6e98c3cfb6ba208ec6c.tar.gz
curlfilter-854459cb11d29093bf8dc6e98c3cfb6ba208ec6c.tar.bz2
curlfilter-854459cb11d29093bf8dc6e98c3cfb6ba208ec6c.zip
Initial commit
Diffstat (limited to 'curlfilter.c')
-rw-r--r--curlfilter.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/curlfilter.c b/curlfilter.c
new file mode 100644
index 0000000..5984edc
--- /dev/null
+++ b/curlfilter.c
@@ -0,0 +1,46 @@
+#define _GNU_SOURCE
+#include <dlfcn.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <curl/curl.h>
+#include <pcre.h>
+/* the function is actually a macro, which prevents us from redefining it
+ * properly */
+#undef curl_easy_setopt
+
+typedef CURLcode (*orig_curl_easy_setopt) (CURL *handle, CURLoption option, ...);
+
+static pcre *re = NULL;
+
+CURL_EXTERN CURLcode curl_easy_setopt (CURL *handle, CURLoption option, ...) {
+ va_list args;
+ va_start (args, option);
+ void *parameter = va_arg (args, void *);
+
+ if (re != NULL && option == CURLOPT_URL) {
+ int matches[3];
+ if (pcre_exec (re, NULL, parameter, strlen (parameter), 0, 0, matches, 3) >= 0) {
+ /* not allowed */
+ return CURLE_URL_MALFORMAT;
+ }
+ }
+
+ orig_curl_easy_setopt orig_setopt;
+ orig_setopt = (orig_curl_easy_setopt) dlsym (RTLD_NEXT, "curl_easy_setopt");
+ return orig_setopt (handle, option, parameter);
+}
+
+void init () {
+ const char * const pattern = getenv ("CURLFILTER_PATTERN");
+ const char *errmsg = NULL;
+ int errpos;
+ if (pattern == NULL) {
+ fprintf (stderr, "Environment variable CURLFILTER_PATTERN is not set\n");
+ return;
+ }
+ if ((re = pcre_compile (pattern, 0, &errmsg, &errpos, NULL)) == NULL) {
+ fprintf (stderr, "Cannot compile regex %s: %s\n", pattern, errmsg);
+ return;
+ }
+}