Last active
September 22, 2024 12:24
-
-
Save rexim/a6636976d12f67ea530ece118a700317 to your computer and use it in GitHub Desktop.
TCC patch that enables including files via HTTPS using CURL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@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