File: url_curl.c

package info (click to toggle)
termrec 0.19-2.1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,024 kB
  • sloc: ansic: 8,435; makefile: 182; perl: 16; sh: 15
file content (76 lines) | stat: -rw-r--r-- 2,123 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "config.h"
#ifdef HAVE_CURL_CURL_H

#include <unistd.h>
#include <curl/curl.h>
#include "export.h"
#include "stream.h"
#include "compat.h"
#include "gettext.h"
VISIBILITY_ENABLE
#include "ttyrec.h"
VISIBILITY_DISABLE

#define USER_AGENT "libtermrec/"PACKAGE_VERSION

static void curl_r(int in, int out, const char *arg)
{
    CURL *curl_handle;
    CURLcode res;
    FILE *f = fdopen(out, "w");
    if (!f)
        return close(out), (void)0;

    curl_global_init(CURL_GLOBAL_ALL);
    curl_handle = curl_easy_init();
    curl_easy_setopt(curl_handle, CURLOPT_URL, arg);
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)f);
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, USER_AGENT);
    res = curl_easy_perform(curl_handle);
    if (res != CURLE_OK)
        fprintf(f, "CURL failed: %s\n", curl_easy_strerror(res));
    curl_easy_cleanup(curl_handle);
    fclose(f);
}

static void curl_w(int in, int out, const char *arg)
{
    CURL *curl_handle;
    CURLcode res;
    FILE *f = fdopen(out, "r");
    if (!f)
        return close(out), (void)0;

    curl_global_init(CURL_GLOBAL_ALL);
    curl_handle = curl_easy_init();
    curl_easy_setopt(curl_handle, CURLOPT_URL, arg);
    curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
    curl_easy_setopt(curl_handle, CURLOPT_READDATA, (void *)f);
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, USER_AGENT);
    res = curl_easy_perform(curl_handle);
    if (res != CURLE_OK)
        fprintf(f, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    curl_easy_cleanup(curl_handle);
    fclose(f);
}

int open_curl(const char* url, int mode, const char **error)
{
    if (mode == SM_REPREAD)
    {
        *error = "Watching CURL URLs is not (yet?) supported.";
        return -1;
    }
    else if (mode == SM_APPEND)
    {
        // There's CURLOPT_APPEND but it says it's for FTP only, FTP is dead.
        *error = "Appending via CURL is not (yet?) supported.";
        return -1;
    }

    if (mode&SM_WRITE)
        return filter(curl_w, -1, 1, url, error);
    else
        return filter(curl_r, -1, 0, url, error);
}
#endif