summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2011-11-17 17:20:22 -0600
committerKamil Kaminski <kamilkss@gmail.com>2011-11-17 17:20:22 -0600
commit7355004fe46fc6bba1da254ef37b64be0d77d532 (patch)
tree041e17c0cf86a8f04ee6be739a1e92472f030cab
parent320f1c2347e3270a82b90bf03bf0ea1c48ad4eb2 (diff)
downloadsandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.tar.gz
sandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.tar.bz2
sandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.zip
add 2 curl examples
-rw-r--r--Makefile11
-rw-r--r--curl_tofile.c59
-rw-r--r--curl_tomem.c100
3 files changed, 167 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index 07d4312..67ad147 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,9 @@
BINS = ascii class depipe_strings dup fpipe pipe realloc strpbrk strsep \
tokenizer getopt prime_mask linked_list pi_bbp string_tokenizer \
tcpserver tcpclient regexp
+
+CURL = curl_tomem curl_tofile
+
CC = gcc
CFLAGS = -Wall -std=gnu99 -pedantic
DBGFLAGS = -g -O0
@@ -11,13 +14,15 @@ else
endif
LDFLAGS = -lm
-all: $(BINS)
+all: $(BINS) $(CURL)
$(BINS): %: %.c
- $(CC) $(CFLAGS) $^ -o $@
+ $(CC) $(CFLAGS) $^ -o $@
+$(CURL): %: %.c
+ $(CC) `curl-config --libs` $(CFLAGS) $^ -o $@
.PHONY: clean
clean:
- rm -f ./$(BINS)
+ rm -f ./$(BINS) ./$(CURL)
diff --git a/curl_tofile.c b/curl_tofile.c
new file mode 100644
index 0000000..7cd25ca
--- /dev/null
+++ b/curl_tofile.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <curl/curl.h>
+
+size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata)
+{
+ /* return size * nmemb; */
+ return fwrite(ptr, size, nmemb, (FILE *) userdata);
+}
+
+int main(int argc, char **argv)
+{
+ if (argc != 2)
+ {
+ fprintf(stderr, "usage: %s <url>\n", argv[0]);
+ return 1;
+ }
+
+ CURL *curl_handle;
+ CURLcode ret;
+
+ curl_handle = curl_easy_init();
+ if (curl_handle)
+ {
+ curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);
+ curl_easy_setopt(curl_handle, CURLOPT_HEADER, 1L);
+ /* some servers don't like requests that are made without a user-agent
+ * field, so we provide one */
+ curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+ char err_buff[CURL_ERROR_SIZE];
+ curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, err_buff);
+ /* send all data to this function */
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
+
+ /* by default passes NULL aka stdout */
+ FILE *fl;
+ if ((fl = fopen("dump.curl", "w")))
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, fl);
+ else
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, stdout);
+
+ if ((ret = curl_easy_perform(curl_handle)) != CURLE_OK)
+ fprintf(stderr, "%s\n", err_buff);
+ else
+ {
+ /* ask for the content-type */
+ char *ct;
+ ret = curl_easy_getinfo(curl_handle, CURLINFO_CONTENT_TYPE, &ct);
+ if ((CURLE_OK == ret) && ct)
+ printf("Content-Type: %s\n", ct);
+ }
+
+ /* always cleanup */
+ fclose(fl);
+ curl_easy_cleanup(curl_handle);
+ }
+
+ return 0;
+}
+
diff --git a/curl_tomem.c b/curl_tomem.c
new file mode 100644
index 0000000..e30cfae
--- /dev/null
+++ b/curl_tomem.c
@@ -0,0 +1,100 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* dump curl result into a memory instead of FILE * */
+struct curl_inmem
+{
+ char *memory;
+ size_t size; /* size is used as an index */
+};
+typedef struct curl_inmem curl_inmem_t;
+
+void dump_curlmem(void *data)
+{
+ curl_inmem_t *mem = (curl_inmem_t *) data;
+ size_t iter = 0;
+ while (iter < mem->size)
+ putchar(mem->memory[iter++]);
+}
+
+size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata)
+{
+ size_t realsize = size * nmemb;
+ curl_inmem_t *mem = (curl_inmem_t *) userdata;
+
+ mem->memory = realloc(mem->memory, mem->size + realsize + 1);
+ if (!mem->memory)
+ {
+ perror("failed to resize curl in memory");
+ exit(EXIT_FAILURE);
+ }
+
+ memcpy(&(mem->memory[mem->size]), ptr, realsize);
+ mem->size += realsize;
+ mem->memory[mem->size] = 0;
+
+ return realsize;
+}
+
+int main(int argc, char **argv)
+{
+ if (argc != 2)
+ {
+ fprintf(stderr, "usage: %s <url>\n", argv[0]);
+ return 1;
+ }
+
+ CURL *curl_handle;
+ CURLcode ret;
+
+ curl_global_init(CURL_GLOBAL_ALL);
+ curl_handle = curl_easy_init();
+ if (curl_handle)
+ {
+ curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);
+ curl_easy_setopt(curl_handle, CURLOPT_HEADER, 1L);
+ /* some servers don't like requests that are made without a user-agent
+ * field, so we provide one */
+ curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+ char err_buff[CURL_ERROR_SIZE];
+ curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, err_buff);
+
+ /* by default passes NULL aka stdout */
+ curl_inmem_t chunk = { 0, 0 };
+ chunk.memory = (char *) malloc(sizeof(char));
+ if (!chunk.memory)
+ perror("failed to create a chunk");
+ else
+ {
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &chunk);
+ /* send all data to this function */
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
+ }
+
+ if ((ret = curl_easy_perform(curl_handle)) != CURLE_OK)
+ fprintf(stderr, "%s\n", err_buff);
+ else
+ {
+ /* ask for the content-type */
+ char *ct;
+ ret = curl_easy_getinfo(curl_handle, CURLINFO_CONTENT_TYPE, &ct);
+ if ((CURLE_OK == ret) && ct)
+ printf("Content-Type: %s\n", ct);
+ }
+
+ /* print out */
+ dump_curlmem(&chunk);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl_handle);
+ if (chunk.memory)
+ free(chunk.memory);
+ /* we're done with libcurl, so clean it up */
+ curl_global_cleanup();
+ }
+
+ return 0;
+}
+