.PHONY: default kern libbpf user

ARCH=$(shell uname -m)
BPF_TOOL_PATH      := ../../tools/$(ARCH)
BPF_TOOL           := $(BPF_TOOL_PATH)/bpftool
BPF_TOOL_ARCHIVE   := $(BPF_TOOL).tar.gz
VMLINUXH           := ../../include/vmlinux.h
VMLINUXH_TGZ       := ../../tools/$(ARCH)/vmlinux.tar.gz
LIBBPFA            := ../../libbpf/libbpf.a
PRIVATE_KEY        := ../../../../certs/security_pkey/keys/security.key
PUBLIC_KEY         := ../../../../certs/security_pkey/keys/security_pkey.pem


default:
	@echo "ctforge_execsnoop: make all to compile"


$(VMLINUXH):
	tar -xvf $(VMLINUXH_TGZ) -C ../../include/
	@echo "-> generate vmlinux.h done!"


$(BPF_TOOL): $(BPF_TOOL_ARCHIVE)
	@mkdir -p $(BPF_TOOL_PATH)
	@tar -xf $< -C $(BPF_TOOL_PATH)
	@chmod +x $@


$(LIBBPFA):
	@cd ../../libbpf && make


all: $(LIBBPFA) kern user load
	@echo "Success! ctforge_execsnoop ok!"


kern: $(BPF_TOOL) $(VMLINUXH)
	clang -O2 -Wall \
	-DPROV_FILTER_FILE_PERMISSION_OFF \
	-DPROV_FILTER_SOCKET_SENDMSG_OFF \
	-D__KERNEL__ \
	-D__ASM_SYSREG_H \
	-D__$(ARCH)__ \
	-Wno-unused-value -Wno-pointer-sign \
	-Wno-compare-distinct-pointer-types \
	-Wno-gnu-variable-sized-type-not-at-end \
	-Wno-address-of-packed-member -Wno-tautological-compare \
	-Wno-unknown-warning-option \
	-I../../include \
	-target bpf -g -c execsnoop_kern.c -o execsnoop_kern.o
	@ls -alh execsnoop_kern.o
	$(BPF_TOOL) gen skeleton --bpffs execsnoop_kern.o > execsnoop.skel.h
	@ls -alh execsnoop.skel.h


user: $(LIBBPFA)
	clang -shared -fPIC -g -o ctforge_execsnoop.so execsnoop_user.c $(LIBBPFA) -lelf -lz -lpthread -I../../include -I.
	../../ctforged/ctforge-signer -z -s -k $(PRIVATE_KEY) -i ctforge_execsnoop.so


load:
	clang -O2 -Wall \
	-DPROV_FILTER_FILE_PERMISSION_OFF \
	-DPROV_FILTER_SOCKET_SENDMSG_OFF \
	-D__KERNEL__ \
	-D__ASM_SYSREG_H \
	-D__$(ARCH)__ \
	-Wno-unused-value -Wno-pointer-sign \
	-Wno-compare-distinct-pointer-types \
	-Wno-gnu-variable-sized-type-not-at-end \
	-Wno-address-of-packed-member -Wno-tautological-compare \
	-Wno-unknown-warning-option \
	-ldl -g execsnoop_load.c -o ctforge_execsnoop


clean:
	rm -f execsnoop.skel.h
	rm -f *.o
	rm -f vmlinux.h
	rm -f ctforge_execsnoop*

