bunkum

an old and silly c99 web server with some fun features
Log | Files | Refs | README

commit 8caeb3557ad13c6881f5496b22ec55b26bfc204f
parent bae2fdd0adcaa96fd96396eb29ee805b8c36d900
Author: quantumish <freifeld.david@gmail.com>
Date:   Tue, 11 Apr 2023 17:25:02 -0700

Scuffed testing framework

Diffstat:
MMakefile | 11++++++++---
Atest.c | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mutils/shitvec.c | 2++
3 files changed, 96 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,18 +1,23 @@ CFLAGS?=-O2 -g LIBS:=-lz -lpthread -SOURCES = $(wildcard utils/*.c) $(wildcard http/*.c) http.c +LIBS = $(wildcard utils/*.c) $(wildcard http/*.c) OBJ = $(wildcard build/*.o) -.PHONY: all clean run +.PHONY: all clean run test all: serv -serv: $(SOURCES) +serv: $(LIBS) http.c $(CC) -o $@ $^ $(CFLAGS) $(LIBS) run: serv sudo docker build -t bunkum-dev . sudo docker run -it -p "8080:8082" bunkum-dev +test: $(LIBS) test.c + $(CC) $(LIBS) -shared -fPIC $(CFLAGS) -o libbunkum.so + $(CC) test.c -o test -ldl + ./test libbunkum.so + clean: rm serv diff --git a/test.c b/test.c @@ -0,0 +1,86 @@ +#include <stdio.h> +#include <stddef.h> +#include <dlfcn.h> +#include <string.h> +#include <stdlib.h> +#include <sys/types.h> +#include <unistd.h> +#include <sys/wait.h> +#include <elf.h> +#include <stdbool.h> + +#define MAX_SYMBOL_LEN 32 +#define MAX_NUM_SYMBOLS 128 +char symbols[MAX_NUM_SYMBOLS*MAX_SYMBOL_LEN] = {0}; +char* symbols_off = (char*)&symbols; + +#define MAX_SYMTABS 16 +char symtabs[sizeof(Elf64_Shdr)*2*MAX_SYMTABS] = {0}; +char* symtabs_off = (char*)&symtabs; + +void get_symbols(char* path) { + FILE* fptr = fopen(path, "r"); + Elf64_Ehdr header = {0}; + fread(&header, sizeof(Elf64_Ehdr), 1, fptr); + if (strncmp((char*)&header, ELFMAG, 3) != 0) { + printf("Attempted read of invalid ELF file."); + } + fseek(fptr, header.e_shoff, SEEK_SET); + Elf64_Shdr syment[2] = {0}; + for (int i = 0; i < header.e_shnum-1; i++) { + fread(&syment, sizeof(Elf64_Shdr), 2, fptr); // NOTE: questionable + if (syment[0].sh_type == SHT_SYMTAB && syment[1].sh_type == SHT_STRTAB) { + memcpy(symtabs_off, &syment[0], sizeof(Elf64_Shdr)); + memcpy(symtabs_off+sizeof(Elf64_Shdr), &syment[1], sizeof(Elf64_Shdr)); + symtabs_off = symtabs_off+(sizeof(Elf64_Shdr)*2); + } + fseek(fptr, -sizeof(Elf64_Shdr), SEEK_CUR); // HACK + } + for (int i = 0; i < (symtabs_off-symtabs)/(sizeof(Elf64_Shdr)*2); i++) { + Elf64_Shdr symtab0 = ((Elf64_Shdr*)symtabs)[i*2]; + Elf64_Shdr symtab1 = ((Elf64_Shdr*)symtabs)[i*2+1]; + + fseek(fptr, symtab1.sh_offset, SEEK_SET); + char* strtbl = malloc(symtab1.sh_size); + fread(strtbl, symtab1.sh_size, 1, fptr); + fseek(fptr, symtab0.sh_offset, SEEK_SET); + Elf64_Sym symbol = {0}; + for (size_t i = 0; i < symtab0.sh_size; i+=sizeof(Elf64_Sym)) { + fread(&symbol, sizeof(Elf64_Sym), 1, fptr); + if (symbol.st_name != 0) { + char* mangled = (char*)(&strtbl[symbol.st_name]); + if (strncmp(mangled, "test_", 5) == 0) { + strcpy(symbols_off, mangled); + symbols_off += MAX_SYMBOL_LEN; + } + } + } + } + fclose(fptr); +} + + + +int main(int argc, char** argv) { + get_symbols(argv[1]); + char path[64] = {0}; + sprintf(path, "./%s", argv[1]); + void* lib = dlopen(path, RTLD_LAZY); + if (!lib) { + printf("uh oh: %s\n", dlerror()); + } + for (char* sym = symbols; sym < symbols_off; sym+=MAX_SYMBOL_LEN) { + printf("%s", sym); + fflush(STDIN_FILENO); + bool(*testf)(void) = dlsym(lib, sym); + pid_t pid = fork(); + if (pid == 0) { + exit(!testf()); + } else { + int status; + waitpid(pid, &status, 0); + printf(" [%s]\n", status == 0 ? "GOOD" : "BAD"); + } + } + dlclose(lib); +} diff --git a/utils/shitvec.c b/utils/shitvec.c @@ -53,3 +53,5 @@ void shitvec_sort(shitvec_t* sv, int(*cmp)(const void*, const void*)) { void shitvec_free(shitvec_t* sv) { free(sv->arr); } + +int test_shitvec() { return 1; };