first release

This commit is contained in:
Daniele Linguaglossa 2023-07-13 16:29:58 +02:00
parent ff4e656a53
commit 11a62e71e9
11 changed files with 951 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
.vscode
dist
src/challenge.c

8
Makefile Normal file
View File

@ -0,0 +1,8 @@
include tools/Makefile
include src/Makefile
default: all
all: embed libdzonerzy libdzonerzy-gen
clean: clean-tools clean-libdzonerzy

BIN
res/dzonerzy.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

50
src/Makefile Normal file
View File

@ -0,0 +1,50 @@
CC = $(shell which gcc)
PANDOC = $(shell which pandoc)
OBJDUMP = $(shell which objdump)
OBJCOPY = $(shell which objcopy)
READELF = $(shell which readelf)
OUTPUT = libdzonerzy.so
SRC_INC_DIR = src/include
CFLAGS = -Wno-error=unused-parameter -Wno-error=unused-const-variable -std=c99 -O0 -shared -fPIC -I$(SRC_INC_DIR) -Wno-int-conversion -Wno-div-by-zero
LDFLAGS =
EMBED_TOOL = tools/bin/embed
EMBED_ARGS = -f=h
DIST = dist
SRC_DIR = src
RAW_DIST = dist/raw
SITE_DIST = dist/site
AWK_UTIL = awk '/^\s*\[[0-9]+\]\s+([^\.].+)/ {print $$2}'
AWK_UTIL_NOCRLF = awk '/^\s*\[[0-9]+\]\s+([^\.].+)/ {printf $$2" "}'
PANDOC_ARGS = --standalone --table-of-contents --section-divs --email-obfuscation=references --css=main.css --include-after-body=$(RAW_DIST)/footer.html
libdzonerzy:
@echo "/* DO NOT EDIT THIS FILE - it is machine generated */" > $(SRC_DIR)/res.h
@mkdir -p $(DIST)
@mkdir -p $(RAW_DIST)
@mkdir -p $(SITE_DIST)
@$(foreach file, $(wildcard res/*), $(EMBED_TOOL) -i $(file) -o $(SRC_INC_DIR)/$(notdir $(file)).h $(EMBED_ARGS);)
@ls $(SRC_INC_DIR)/*.h | xargs -n1 basename | sed 's/^/#include </' | sed 's/$$/>/' >> $(SRC_DIR)/res.h
$(CC) $(CFLAGS) $(LDFLAGS) -o $(DIST)/$(OUTPUT) $(SRC_DIR)/libdzonerzy.so.c $(SRC_DIR)/challenge.o
libdzonerzy-dump:
@$(READELF) -S -W $(DIST)/$(OUTPUT) | $(AWK_UTIL) | xargs dirname {} | sort | uniq | xargs -I{} mkdir -p $(RAW_DIST)/{}
@$(foreach fn, $(shell $(READELF) -S -W $(DIST)/$(OUTPUT) | $(AWK_UTIL_NOCRLF)), $(OBJCOPY) $(DIST)/$(OUTPUT) --dump-section $(fn)=/dev/stdout | cat | head -c -1 > $(RAW_DIST)/$(fn);)
libdzonerzy-gen: libdzonerzy-dump
@mkdir -p $(SITE_DIST)/assets/
@$(foreach page, $(wildcard $(RAW_DIST)/pages/*), $(PANDOC) $(PANDOC_ARGS) --from=markdown --to=html --output=$(shell echo $(SITE_DIST)/$(notdir $(page)) | sed 's/\.md/\.html/') $(page);)
@cp $(RAW_DIST)/main.css $(SITE_DIST)/main.css
@cp $(RAW_DIST)/sitemap.xml $(SITE_DIST)/sitemap.xml
@cp -r $(RAW_DIST)/embed/* $(SITE_DIST)/assets/
@chmod -R 666 $(SITE_DIST)/*
clean-libdzonerzy:
@echo "/* DO NOT EDIT THIS FILE - it is machine generated */" > $(SRC_DIR)/res.h
rm -rf $(DIST)
rm -f $(SRC_INC_DIR)/*.h

BIN
src/challenge.o Normal file

Binary file not shown.

261
src/libdzonerzy.so.c Normal file
View File

@ -0,0 +1,261 @@
/*
Copyright:
(C) 2022-2023 Daniele 'dzonerzy' Linguaglossa - http://libdzonerzy.so
This file is part of libdzonerzy.so.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
*/
#define _POSIX_C_SOURCE 200809L
#include "libdzonerzy.so.h"
#include "res.h"
// this is a shared object library
#define MAIN_CSS \
CSS_COMMENT("main.css") \
CSS_NEWLINE() \
CSS_SELECTOR("html,body") \
CSS_PROPERTY("margin", "0") \
CSS_PROPERTY("padding", "0") \
CSS_PROPERTY("width", "100%") \
CSS_END_SELECTOR() \
CSS_SELECTOR("body") \
CSS_PROPERTY("font-family", "monospace") \
CSS_PROPERTY("font-size", "1.23em") \
CSS_PROPERTY("background-color", "#ddd") \
CSS_PROPERTY("display", "flex") \
CSS_PROPERTY("flex-direction", "column") \
CSS_END_SELECTOR() \
CSS_SELECTOR("#title-block-header, #TOC") \
CSS_PROPERTY("border", "1px solid #222") \
CSS_PROPERTY("border-radius", "15px") \
CSS_PROPERTY("background-color", "#ccc") \
CSS_PROPERTY("color", "#000") \
CSS_PROPERTY("margin", "1em") \
CSS_PROPERTY("padding", "1em") \
CSS_END_SELECTOR() \
CSS_SELECTOR("footer") \
CSS_PROPERTY("border", "1px solid #222") \
CSS_PROPERTY("border-radius", "15px") \
CSS_PROPERTY("background-color", "#ccc") \
CSS_PROPERTY("color", "#000") \
CSS_PROPERTY("margin", "1em") \
CSS_PROPERTY("padding", "1em") \
CSS_PROPERTY("flex-shrink", "0") \
CSS_PROPERTY("display", "flex") \
CSS_PROPERTY("flex-direction", "column") \
CSS_PROPERTY("justify-content", "center") \
CSS_PROPERTY("align-items", "center") \
CSS_PROPERTY("font-size", "0.9em") \
CSS_END_SELECTOR() \
CSS_SELECTOR("div.hearth") \
CSS_PROPERTY("display", "flex") \
CSS_PROPERTY("justify-content", "center") \
CSS_PROPERTY("align-items", "center") \
CSS_PROPERTY("margin-left", "0.2em") \
CSS_PROPERTY("margin-right", "0.2em") \
CSS_PROPERTY("font-size", "1.5em") \
CSS_PROPERTY("padding", "0px") \
CSS_PROPERTY("animation", "bounce 1s infinite") \
CSS_PROPERTY("color", "#d00000") \
CSS_END_SELECTOR() \
CSS_SELECTOR("b.author") \
CSS_PROPERTY("color", "#000") \
CSS_PROPERTY("text-transform", "uppercase") \
CSS_END_SELECTOR() \
CSS_SELECTOR("p.author::before") \
CSS_PROPERTY("text-transform", "lowercase") \
CSS_PROPERTY("font-weight", "normal") \
CSS_PROPERTY("content", "'by '") \
CSS_END_SELECTOR() \
CSS_SELECTOR("p.date::before") \
CSS_PROPERTY("text-transform", "lowercase") \
CSS_PROPERTY("font-weight", "normal") \
CSS_PROPERTY("content", "'written on '") \
CSS_END_SELECTOR() \
CSS_SELECTOR("p.date") \
CSS_PROPERTY("text-transform", "capitalize") \
CSS_PROPERTY("font-weight", "bold") \
CSS_END_SELECTOR() \
CSS_SELECTOR("p.author") \
CSS_PROPERTY("text-transform", "uppercase") \
CSS_PROPERTY("font-weight", "bold") \
CSS_END_SELECTOR() \
CSS_SELECTOR("h1.title") \
CSS_PROPERTY("text-align", "center") \
CSS_END_SELECTOR() \
CSS_SELECTOR("section") \
CSS_PROPERTY("margin", "1em") \
CSS_PROPERTY("flex", "1 0 auto") \
CSS_END_SELECTOR() \
CSS_SELECTOR("h1 h2 h3 h4 h5 h6") \
CSS_PROPERTY("font-family", "monospace") \
CSS_PROPERTY("clear", "both") \
CSS_END_SELECTOR() \
CSS_SELECTOR("img") \
CSS_PROPERTY("padding", "2px") \
CSS_PROPERTY("border", "2px dashed #333") \
CSS_PROPERTY("background-color", "#fff") \
CSS_PROPERTY("color", "#000") \
CSS_PROPERTY("height", "12em") \
CSS_PROPERTY("float", "right") \
CSS_PROPERTY("clear", "right") \
CSS_PROPERTY("margin-left", "1em") \
CSS_PROPERTY("margin-bottom", "1em") \
CSS_END_SELECTOR() \
CSS_SELECTOR("figcaption") \
CSS_PROPERTY("display", "none") \
CSS_END_SELECTOR() \
CSS_SELECTOR("@keyframes bounce") \
CSS_SELECTOR("from, to") \
CSS_PROPERTY("transform", "scale(1, 1)") \
CSS_END_SELECTOR() \
CSS_SELECTOR("25%") \
CSS_PROPERTY("transform", "scale(0.9, 1.1)") \
CSS_END_SELECTOR() \
CSS_SELECTOR("50%") \
CSS_PROPERTY("transform", "scale(1.1, 0.9)") \
CSS_END_SELECTOR() \
CSS_SELECTOR("75%") \
CSS_PROPERTY("transform", "scale(0.95, 1.05)") \
CSS_END_SELECTOR() \
CSS_END_SELECTOR() \
CSS_SELECTOR("footer > span") \
CSS_PROPERTY("display", "flex") \
CSS_PROPERTY("text-align", "center") \
CSS_PROPERTY("justify-content", "center") \
CSS_PROPERTY("align-items", "center") \
CSS_END_SELECTOR() \
CSS_SELECTOR("pre, code") \
CSS_PROPERTY("min-width", "60vw") \
CSS_PROPERTY("max-width", "80vw") \
CSS_PROPERTY("max-height", "500px") \
CSS_PROPERTY("overflow", "auto") \
CSS_PROPERTY("font-size", "1.1em") \
CSS_PROPERTY("font-family", "monospace") \
CSS_PROPERTY("border-radius", "0.5em") \
CSS_END_SELECTOR() \
CSS_SELECTOR("blockquote, pre") \
CSS_PROPERTY("padding", "1em") \
CSS_PROPERTY("border", "1px solid #111") \
CSS_PROPERTY("background-color", "#9a9091") \
CSS_PROPERTY("color", "#111") \
CSS_PROPERTY("clear", "both") \
CSS_PROPERTY("padding-top", "0.25em") \
CSS_PROPERTY("padding-bottom", "0.25em") \
CSS_END_SELECTOR() \
CSS_SELECTOR("div.sourceCode") \
CSS_PROPERTY("display", "flex") \
CSS_PROPERTY("flex-direction", "column") \
CSS_PROPERTY("justify-content", "center") \
CSS_PROPERTY("align-items", "center") \
CSS_END_SELECTOR() \
CSS_SELECTOR("pre::-webkit-scrollbar") \
CSS_PROPERTY("display", "none") \
CSS_END_SELECTOR()
#define INDEX_MD \
MD_META("DZONERZY's Blog", "DZONERZY") \
MD_META_CUSTOM("Thursday 12 July 2023") \
MD_NEWLINE() \
MD_SECTION1("About") \
MD_IMAGE("Picture of DZONERZY", "assets/dzonerzy.jpg") \
MD_TEXT("Hello world here is dzonerzy, also known as Daniele Linguaglossa,") \
MD_TEXT("I'm an offensive security researcher and developer.") \
MD_NEWLINE() \
MD_TEXT("I'm the author of this blog, and I'm using it to share my") \
MD_TEXT("researches and my projects.") \
MD_NEWLINE() \
MD_TEXT("I'm also the author of the library that powers this blog, ") \
MD_TEXT("yes you heard right, this blog is powered by a ") \
MD_BOLD("shared object") \
MD_TEXT(" that I wrote in C!") \
MD_NEWLINE() \
MD_TEXT("You can find the source code of this blog on my ") \
MD_LINK("git repository", "https://cgit.libdzonerzy.so/libdzonerzy.so/tree") \
MD_TEXT(".") \
MD_NEWLINE() \
MD_SECTION1("Projects") \
MD_TEXT("Here is a list of my projects, that I've made in my spare time, some of them are ") \
MD_TEXT("still in development, but I'm working hard to finish them.") \
MD_NEWLINE() \
MD_LIST(MD_BOLD(MD_LINK("libdzonerzy.so", "https://cgit.libdzonerzy.so/libdzonersy.so/tree/"))) \
MD_TEXT(" -- libdzonerzy.so is a shared object that I wrote in C, it's a library ") \
MD_TEXT("that I use to power this blog.") \
MD_NEWLINE() \
MD_LIST(MD_BOLD(MD_LINK("CaptainHook", "https://cgit.libdzonerzy.so/captainhook/tree/"))) \
MD_TEXT(" -- CaptainHook is the next-gen hooking framework, it's a library that ") \
MD_TEXT("allow to hook functions in a very easy way without knowing the function prototype.") \
MD_NEWLINE() \
MD_SECTION1("FAQ") \
MD_TEXT("Here is a list of frequently asked questions, if you have any other questions ") \
MD_TEXT("feel free to contact me at ") \
MD_BOLD("dzonerzy[at]gmail.com") \
MD_TEXT(".") \
MD_NEWLINE() \
MD_SECTION4(" ") \
MD_NEWLINE() \
MD_LIST(MD_BOLD("Q: ") MD_TEXT("Why this blog is so ugly?")) \
MD_NEWLINE() \
MD_TEXT("Because I'm not a web designer, I'm a developer, and I'm not good at ") \
MD_TEXT("designing things, but I'm working on it, I promise.") \
MD_NEWLINE() \
MD_LIST(MD_BOLD("Q: ") MD_TEXT("Why this blog is so fast?")) \
MD_NEWLINE() \
MD_TEXT("Actually this is a static website, so it's very fast.") \
MD_NEWLINE() \
MD_LIST(MD_BOLD("Q: ") MD_TEXT("What do you do for living?")) \
MD_NEWLINE() \
MD_TEXT("I'm the lead offensive security researcher at ") \
MD_LINK("Sysdig", "https://sysdig.com") \
MD_TEXT(", a cloud security company.") \
MD_NEWLINE() \
MD_LIST(MD_BOLD("Q: ") MD_TEXT("Is Sysdig hiring?")) \
MD_NEWLINE() \
MD_TEXT("Yes, we are always looking for new talents, if you are interested in working ") \
MD_TEXT("with me, feel free to send your resume at ... try to find it :D , ") \
MD_TEXT("hint (") \
MD_BOLD("libdzonerzy.so") \
MD_TEXT(").") \
MD_NEWLINE() \
MD_TEXT("Michele is gayyyyyyyyyyyyyyyyyyyyyyyy")
#define FOOTER_MD \
MD_RAWTAG("footer", "" \
"<span>" \
"Powered by&nbsp;<a href=\"/libdzonerzy.so\">libdzonerzy.so</a>" \
"</span>" \
"<br>" \
"<span>made with <div class='hearth'>&#10084;</div> by&nbsp;<b class='author'>dzonerzy</b></span>") \
MD_NEWLINE()
#define SITEMAP_XML \
XML_URLSET() \
XML_URL("https://libdzonerzy.so/index.html") \
XML_URL("https://libdzonerzy.so/sitemap.xml") \
XML_END_URLSET()
int main(int argc, char **argv)
{
fprintf(stdout, "https://libdzonerzy.so\n");
return EXIT_SUCCESS;
}
// resources
SECTION("main.css")
static const char maincss[] = MAIN_CSS;
SECTION("pages/index.md")
static const char indexmd[] = INDEX_MD;
SECTION("footer.html")
static const char footermd[] = FOOTER_MD;
SECTION("sitemap.xml")
static const char sitemapxml[] = SITEMAP_XML;

282
src/libdzonerzy.so.h Normal file
View File

@ -0,0 +1,282 @@
/*
Copyright:
(C) 2022-2023 Daniele 'dzonerzy' Linguaglossa - http://libdzonerzy.so
This file is part of libdzonerzy.so.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
*/
#pragma once
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdint.h>
#define EXPORT_SYMBOL(return, name) __attribute__((visibility("default"))) return name
#define HIDE_SYMBOL __attribute__((visibility("hidden")))
#define SECTION(x) __attribute__((section(x)))
// section name should be like "articles/article_name.md"
#define ARTICLE(x) SECTION("articles/" x ".md")
/* CSS macros */
// comment macros
#define CSS_COMMENT(x) "/* " x " */\n"
// property macros
#define CSS_PROPERTY(n, v) " " n ": " v ";\n"
// property macros with unescaped values
#define CSS_PROPERTY_UNESCAPED(n, v) " " n " : " v ";\n"
// selector macros
#define CSS_SELECTOR(n) n "{\n"
// end selector macros
#define CSS_END_SELECTOR() "}\n"
// rgb macros
#define CSS_RGB(r, g, b) "rgb(" #r "," #g "," #b ")"
// rgba macros
#define CSS_RGBA(r, g, b, a) "rgba(" #r "," #g "," #b "," #a ")"
// hsl macros
#define CSS_HSL(h, s, l) "hsl(" #h "," #s "," #l ")"
// hsla macros
#define CSS_HSLA(h, s, l, a) "hsla(" #h "," #s "," #l "," #a ")"
// url macros
#define CSS_URL(x) "url(" #x ")"
// new line macros
#define CSS_NEWLINE() "\n"
/* MD macros */
// meta info
#define MD_META(title, author) "% " title "\n" \
"% " author "\n"
#define MD_META_CUSTOM(v) "% " v "\n"
#define MD_META_NAMED(p, v) "% " p ": " v "\n"
#define MD_COMMENT(x) "<!-- " x " -->\n"
// section macros from 1 to 4
#define MD_SECTION1(x) "# " x "\n"
#define MD_SECTION2(x) "## " x "\n"
#define MD_SECTION3(x) "### " x "\n"
#define MD_SECTION4(x) "#### " x "\n"
// bold macros
#define MD_BOLD(x) "**" x "**"
// italic macros
#define MD_ITALIC(x) "*" x "*"
// link macros
#define MD_LINK(x, y) "[" x "](" y ")"
// image macros
#define MD_IMAGE(x, y) "![" x "](" y ")\n\n"
// raw html tag macros
#define MD_RAWTAG(t, c) "<" t ">" c "</" t ">"
// new line macros
#define MD_NEWLINE() "\n\n"
// code macros
#define MD_CODE(x) "`" x "`"
// code block macros
#define MD_CODEBLOCK(x) "```" x "```"
// code block macros with language
#define MD_CODEBLOCK_LANG(l, c) "```" l "\n" c "\n```"
// text macros
#define MD_TEXT(x) x
// list macros
#define MD_LIST(x) "- " x "\n"
// XML macros
// urlset macros
#define XML_URLSET() "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n"
// url macros
#define XML_URL(x) " <url>\n" \
" <loc>" x "</loc>\n" \
" <lastmod>" __DATE__ "</lastmod>\n" \
" </url>\n"
// end urlset macros
#define XML_END_URLSET() "</urlset>\n"
/*#define STACK_SIZE 10 * 1024
enum Flags
{
EQ = 1 << 0,
GT = 1 << 1,
LT = 1 << 2,
};
typedef struct machine
{
uint32_t R;
uint32_t SP;
uint32_t FL;
uint8_t *stack;
} machine_t, *pmachine_t;
#define C_START \
int fd[2]; \
char *b = "a"; \
int fd2; \
int *m; \
int a; \
char *c; \
int *p;
#define sys_write(x, y, z) \
__asm__ __volatile__("syscall" \
: \
: "a"(1), "D"(x), "S"(y), "d"(z))
#define sys_pipe(x) \
__asm__ __volatile__("syscall" \
: \
: "a"(22), "D"(x))
#define sys_close(x) \
__asm__ __volatile__("syscall" \
: \
: "a"(3), "D"(x))
#define sys_fork() \
({ \
int ret; \
__asm__ __volatile__("syscall" \
: "=a"(ret) \
: "a"(57)); \
ret; \
})
#define sys_kill(x, y) \
__asm__ __volatile__("movl %0, %%edi;" \
"movl %1, %%esi;" \
"mov $62, %%rax;" \
"syscall;" \
: \
: "r"(x), "r"(y) \
: "edi", "esi", "rax")
// getpid and save to pid variable
#define sys_getpid() \
({ \
int ret; \
__asm__ __volatile__("syscall" \
: "=a"(ret) \
: "a"(39)); \
ret; \
})
#define sys_open(a1, a2, a3) \
({ \
unsigned long ret; \
__asm__ __volatile__("syscall" \
: "=a"(ret) \
: "a"(2), "D"(a1), "S"(a2), "d"(a3) \
: "rcx", "r11", "memory"); \
ret; \
})
#define sys_mmap(a1, a2, a3, a4, a5, a6) \
({ \
unsigned long ret; \
register long r10 __asm__("r10") = a4; \
register long r8 __asm__("r8") = a5; \
register long r9 __asm__("r9") = a6; \
__asm__ __volatile__("syscall" \
: "=a"(ret) \
: "a"(9), "D"(a1), "S"(a2), \
"d"(a3), "r"(r10), "r"(r8), "r"(r9) \
: "rcx", "r11", "memory"); \
ret; \
})
#define sys_munmap(a1, a2) \
asm volatile("syscall" \
: \
: "a"(11), "D"(a1), "S"(a2) \
: "rcx", "r11", "memory");
#define C_SIGPIPE(c) \
sys_pipe(fd); \
sys_close(fd[0]); \
sys_write(fd[1], b, 1); \
__asm__(".byte " #c);
#define C_SIGTRAP(c) \
__asm__("int3"); \
__asm__(".byte " #c);
#define C_SIGILL(j1, j2, x, k) \
__asm__("ud2"); \
__asm__(".byte " #x); \
if (k) \
{ \
__asm__ __volatile__ goto("jmp %l0" \
: \
: \
: \
: j1); \
} \
else \
{ \
__asm__ __volatile__ goto("jmp %l0" \
: \
: \
: \
: j2); \
}
#define C_SIGFPE(c) \
__asm__("mov $1, %rax"); \
__asm__("mov $0, %rbx"); \
__asm__("div %rbx"); \
__asm__(".byte " #c);
#define C_SIGSEGV(c) \
*(int *)0xffffffffffff = 1; \
__asm__(".byte " #c);
#define C_SIGTERM(c) \
sys_kill(process_pid, SIGTERM); \
__asm__(".byte " #c);
#define C_SIGXCPU(c) \
sys_kill(process_pid, SIGXCPU); \
__asm__(".byte " #c);
#define C_SIGSYS(c) \
sys_kill(process_pid, SIGSYS); \
__asm__(".byte " #c);
#define C_SIGBUS(v) \
__asm__("pushf\norl $0x40000,(%rsp)\npopf"); \
a = 0xffffff; \
c = (char *)&a; \
c++; \
p = (int *)c; \
*p = 10; \
__asm__(".byte " #v); \
__asm__("pushf\nxorl $0x40000,(%rsp)\npopf");
#define C_SIGXFSZ(c) \
sys_kill(process_pid, SIGXFSZ); \
__asm__(".byte " #c);
#define C_END \
sys_close(fd[0]); \
sys_close(fd[1]);
#define OP_ADD 0xd1
#define OP_SUB 0x71
#define OP_MUL 0xf7
#define OP_DIV 0x7f
#define OP_MOD 0x3c
#define OP_XOR 0x5a
#define OP_AND 0x2d
#define OP_OR 0x6e*/

1
src/res.h Normal file
View File

@ -0,0 +1 @@
/* DO NOT EDIT THIS FILE - it is machine generated */

13
tools/Makefile Normal file
View File

@ -0,0 +1,13 @@
CC = $(shell which gcc)
EMBED_CFLAGS = -Wall -Wextra -Werror -pedantic -g -O0
EMBED_LDFLAGS =
TOOLSFOLDER = tools/bin
embed: tools/embed/embed.c
$(CC) $(EMBED_CFLAGS) $(EMBED_LDFLAGS) -o $(TOOLSFOLDER)/$@ $^
all: embed
clean-tools:
rm -f $(TOOLSFOLDER)/*

0
tools/bin/.gitkeep Normal file
View File

333
tools/embed/embed.c Normal file
View File

@ -0,0 +1,333 @@
/*
Copyright:
(C) 2022-2023 Daniele 'dzonerzy' Linguaglossa - http://libdzonerzy.so
This file is part of libdzonerzy.so.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
*/
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>
#include <ctype.h>
#define VERSION "0.0.1"
typedef struct _embed
{
char *input;
char *output;
char *format;
int verbose;
int quiet;
} embed_t;
static void usage(char **argv);
static void version(char **argv);
static int embed(embed_t *args);
static char *clean_filename(char *filename);
int main(int argc, char **argv)
{
int c = 0;
embed_t args = {0};
while ((c = getopt(argc, argv, "hvi:o:f:Vq")) != -1)
{
switch (c)
{
case 'h':
usage(argv);
exit(EXIT_SUCCESS);
break;
case 'v':
version(argv);
exit(EXIT_SUCCESS);
break;
case 'i':
args.input = optarg;
break;
case 'o':
args.output = optarg;
break;
case 'f':
// check -f=c -f=h handle equal sign and skip it
if (optarg[0] == '=')
{
optarg++;
}
switch (optarg[0])
{
case 'c':
args.format = "c";
break;
case 'h':
args.format = "h";
break;
default:
usage(argv);
exit(EXIT_FAILURE);
break;
}
break;
case 'V':
args.verbose = 1;
break;
case 'q':
args.quiet = 1;
break;
default:
usage(argv);
exit(EXIT_FAILURE);
break;
}
}
return embed(&args);
}
void usage(char **argv)
{
char *name = strrchr(argv[0], '/');
if (name == NULL)
{
name = argv[0];
}
else
{
name++;
}
printf("Usage: %s [OPTIONS]\n", name);
printf("Embed a file into a C source file.\n");
printf("\n");
printf("Options:\n");
printf(" -h, --help Print this help and exit\n");
printf(" -v, --version Print version and exit\n");
printf(" -i, --input=FILE Input file\n");
printf(" -o, --output=FILE Output file\n");
printf(" -f, --format=FORMAT Output format (c, h)\n");
printf(" -V, --verbose Verbose output\n");
printf(" -q, --quiet Quiet output\n");
printf("\n");
}
void version(char **argv)
{
char *name = strrchr(argv[0], '/');
if (name == NULL)
{
name = argv[0];
}
else
{
name++;
}
printf("%s version %s\n", name, VERSION);
printf("\n");
}
char *clean_filename(char *filename)
{
char *p = filename;
while (*p)
{
// replace <space> with _
// replace symbols with _
// replace - with _
// replace . with _
// all characters to uppercase
switch (*p)
{
case ' ':
case '-':
case '.':
case '/':
case '\\':
case ':':
case ';':
case ',':
case '\'':
case '"':
case '[':
case ']':
case '{':
case '}':
case '(':
case ')':
case '<':
case '>':
case '?':
case '!':
case '@':
case '#':
case '$':
case '%':
case '^':
case '&':
case '*':
case '+':
case '=':
case '|':
case '`':
case '~':
*p = '_';
break;
default:
*p = toupper(*p);
break;
}
p++;
}
return filename;
}
int embed(embed_t *args)
{
if (args->input == NULL)
{
fprintf(stderr, "Input file not specified\n");
return EXIT_FAILURE;
}
if (args->output == NULL)
{
fprintf(stderr, "Output file not specified\n");
return EXIT_FAILURE;
}
if (args->format == NULL)
{
fprintf(stderr, "Output format not specified\n");
return EXIT_FAILURE;
}
if (args->verbose)
{
printf("Input file: %s\n", args->input);
printf("Output file: %s\n", args->output);
printf("Output format: %s\n", args->format);
}
FILE *input = fopen(args->input, "rb");
if (input == NULL)
{
if (!args->quiet)
fprintf(stderr, "Unable to open input file: %s\n", args->input);
return EXIT_FAILURE;
}
FILE *output = fopen(args->output, "w");
if (output == NULL)
{
if (!args->quiet)
fprintf(stderr, "Unable to open output file: %s\n", args->output);
return EXIT_FAILURE;
}
char *name_only = strdup(args->input);
name_only = strrchr(name_only, '/');
if (name_only == NULL)
{
name_only = args->input;
}
else
{
name_only++;
}
char *input_name = strdup(args->input);
input_name = strrchr(input_name, '/');
if (input_name == NULL)
{
input_name = args->input;
}
else
{
input_name++;
}
input_name = clean_filename(input_name);
fprintf(output, "/*\n");
fprintf(output, " * This file was automatically generated by embed - DO NOT EDIT\n");
fprintf(output, " * https://libdzonerzy.so\n");
fprintf(output, " */\n");
fprintf(output, "\n");
if (args->format[0] == 'c')
{
fprintf(output, "__attribute__((section(\"embed/%s\"))) const unsigned char %s[] = {\n", name_only, input_name);
}
else if (args->format[0] == 'h')
{
fprintf(output, "#pragma once\n");
fprintf(output, "#ifndef %s_H\n", input_name);
fprintf(output, "__attribute__((section(\"embed/%s\"))) const unsigned char %s[] = {\n", name_only, input_name);
}
int c = 0;
int i = 0;
while ((c = fgetc(input)) != EOF)
{
if (i == 0)
{
fprintf(output, " ");
}
fprintf(output, "0x%02X", c);
if (i < 15)
{
fprintf(output, ", ");
}
else
{
fprintf(output, ",\n");
i = -1;
}
i++;
}
if (i > 0)
{
fprintf(output, "\n");
}
fprintf(output, " 0x00,\n");
fprintf(output, "};\n");
if (args->format[0] == 'h')
{
fprintf(output, "#endif /* %s_H */\n", input_name);
}
fclose(input);
fclose(output);
if (!args->quiet)
printf("Generated resource '%s'\n", input_name);
return EXIT_SUCCESS;
}