-
-
Save rexim/a6636976d12f67ea530ece118a700317 to your computer and use it in GitHub Desktop.
From 84c42091cbae3735c52e895221f3f95a87155756 Mon Sep 17 00:00:00 2001 | |
From: rexim <[email protected]> | |
Date: Wed, 30 Jun 2021 20:43:47 +0700 | |
Subject: [PATCH] Make it possible to include files over https | |
--- | |
Makefile | 2 +- | |
tcc.c | 5 +++++ | |
tccpp.c | 43 +++++++++++++++++++++++++++++++++++++++++++ | |
3 files changed, 49 insertions(+), 1 deletion(-) | |
diff --git a/Makefile b/Makefile | |
index 3ae466f..98de4ce 100644 | |
--- a/Makefile | |
+++ b/Makefile | |
@@ -30,7 +30,7 @@ ifdef CONFIG_WIN32 | |
CFGWIN = -win | |
NATIVE_TARGET = $(ARCH)-win$(if $(findstring arm,$(ARCH)),ce,32) | |
else | |
- LIBS=-lm | |
+ LIBS=-lm -lcurl | |
ifneq ($(CONFIG_ldl),no) | |
LIBS+=-ldl | |
endif | |
diff --git a/tcc.c b/tcc.c | |
index cd887d1..7a5e53f 100644 | |
--- a/tcc.c | |
+++ b/tcc.c | |
@@ -23,6 +23,7 @@ | |
# include "libtcc.c" | |
#endif | |
#include "tcctools.c" | |
+#include <curl/curl.h> | |
static const char help[] = | |
"Tiny C Compiler "TCC_VERSION" - Copyright (C) 2001-2006 Fabrice Bellard\n" | |
@@ -257,6 +258,10 @@ redo: | |
s = tcc_new(); | |
opt = tcc_parse_args(s, &argc, &argv, 1); | |
+ if (curl_global_init(CURL_GLOBAL_DEFAULT) != 0) { | |
+ tcc_error("Could not initialize Global cURL context. (Yes, your C compiler is using curl Kappa)"); | |
+ } | |
+ | |
if ((n | t) == 0) { | |
if (opt == OPT_HELP) | |
return printf(help), 1; | |
diff --git a/tccpp.c b/tccpp.c | |
index 76f9e42..0b86a41 100644 | |
--- a/tccpp.c | |
+++ b/tccpp.c | |
@@ -20,6 +20,8 @@ | |
#include "tcc.h" | |
+#include <curl/curl.h> | |
+ | |
/********************************************************/ | |
/* global variables */ | |
@@ -1798,6 +1800,47 @@ ST_FUNC void preprocess(int is_bof) | |
buf[len - 2] = '\0'; | |
} | |
+ // Hacked by https://tsoding.github.io/ | |
+ // Available to everyone under Public Domain | |
+ if (strncmp("https://", buf, 8) == 0) { | |
+ CURLU *url = curl_url(); | |
+ if (curl_url_set(url, CURLUPART_URL, buf, 0)) { | |
+ tcc_error("Could not parse the include URL"); | |
+ } | |
+ | |
+ char *path; | |
+ if (curl_url_get(url, CURLUPART_PATH, &path, 0)) { | |
+ tcc_error("Could not extract path from the include URL"); | |
+ } | |
+ | |
+ const char *file_name = tcc_basename(path); | |
+ | |
+ CURL *curl = curl_easy_init(); | |
+ if (curl == NULL) { | |
+ tcc_error("Could not initialize cURL context"); | |
+ } | |
+ | |
+ FILE *download_file = fopen(file_name, "w"); | |
+ if (download_file == NULL) { | |
+ tcc_error("Could not open file %s: %s", file_name, strerror(errno)); | |
+ } | |
+ | |
+ curl_easy_setopt(curl, CURLOPT_URL, buf); | |
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, download_file); | |
+ CURLcode res = curl_easy_perform(curl); | |
+ if (res != CURLE_OK) { | |
+ tcc_error("Could not download %s: %s\n", buf, curl_easy_strerror(res)); | |
+ } | |
+ | |
+ strncpy(buf, file_name, sizeof(buf) - 1); | |
+ | |
+ curl_free(path); | |
+ curl_url_cleanup(url); | |
+ curl_easy_cleanup(curl); | |
+ | |
+ fclose(download_file); | |
+ } | |
+ | |
if (s1->include_stack_ptr >= s1->include_stack + INCLUDE_STACK_SIZE) | |
tcc_error("#include recursion too deep"); | |
/* store current file in stack, but increment stack later below */ | |
-- | |
2.20.1 | |
@rexim
Hi there .
FYI : another approach to SUBJ: To use LD_PRELOAD + dll with hookup open/close/stat libc functions . And replace open() library-call with opened "curl " subprocess file-descriptor .
eg:
$LD_PRELOAD=./libhook_library.so tcc -run mysource_with_https_includes.c
The flow
-: tcc/gcc tries to open() filename "https://xxxxx/pppp.h"
-: library implements open() function -- "see" filename contains "https://" -- and instead of open file , returns file descriptor like : return fileno( popen("curl url ", "r") ).
(other filenames (not contains "https://") - just bypass to original libc open() call )
Example : (tested with tcc/ tcc -run/ gcc / clang ) .
https://github.com/alexander-vla/hook_up_open_curl/blob/main/libinclude_hook.c
from video
https://www.youtube.com/watch?v=4vSyqK3SK-0
@theoparis Hi. I have made some changes, and now it should be able to work on the latest TCC.
https://gist.github.com/13m0n4de/84912522cce6db31da069baf1add04f8
@inRm3D done!