diff --git a/.gitignore b/.gitignore index 654d37f..ad9f5f6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ *.o +cosmopolitan + feuille +feuille.com + cgi/feuille.cgi diff --git a/Makefile b/Makefile index b3b57ed..63f1195 100644 --- a/Makefile +++ b/Makefile @@ -4,11 +4,13 @@ include config.mk -TARGET = feuille +TARGET = feuille.com +TARGET$(COSMO) = feuille + SRC = feuille.c util.c server.c bin.c OBJ = $(SRC:%.c=%.o) -all: $(TARGET) $(TARGET).1 cgi +all: $(TARGET) feuille.1 cgi run: $(TARGET) ./$(TARGET) @@ -18,10 +20,10 @@ clean: @rm -f $(OBJ) distclean: - @printf "%-8s $(TARGET) $(OBJ)\n" "rm" - @rm -f $(TARGET) $(OBJ) + @printf "%-8s feuille feuille.com $(OBJ)\n" "rm" + @rm -f feuille feuille.com $(OBJ) -install: $(TARGET) $(TARGET).1 +install: $(TARGET) feuille.1 @echo "installing executable file to $(PREFIX)/bin" @mkdir -p "$(PREFIX)/bin" @cp -f $(TARGET) "$(PREFIX)/bin" @@ -29,34 +31,53 @@ install: $(TARGET) $(TARGET).1 @echo "installing manpage to $(MAN)/man1" @mkdir -p $(MAN)/man1 - @cp -f $(TARGET).1 $(MAN)/man1 - @chmod 644 $(MAN)/man1/$(TARGET).1 + @cp -f feuille.1 $(MAN)/man1 + @chmod 644 $(MAN)/man1/feuille.1 -uninstall: $(PREFIX)/bin/$(TARGET) $(MAN)/man1/$(TARGET).1 +uninstall: $(PREFIX)/bin/$(TARGET) $(MAN)/man1/feuille.1 @echo "removing executable file from $(PREFIX)/bin" @rm -f "$(PREFIX)/bin/$(TARGET)" @echo "removing manpage from $(MAN)/man1" - @rm -f $(MAN)/man1/$(TARGET).1 + @rm -f $(MAN)/man1/feuille.1 -$(TARGET): $(OBJ) - @printf "%-8s $(OBJ) -o $@\n" "$(CC)" - @$(CC) $(LDFLAGS) $(OBJ) -o $@ +feuille.1: feuille.1.md config.mk + @printf "%-8s feuille.1.md -o feuille.1\n" "pandoc" + @sed "s/{VERSION}/$(VERSION)/g" feuille.1.md | pandoc -s -t man -o feuille.1 -$(TARGET).1: $(TARGET).1.md config.mk - @printf "%-8s $(TARGET).1.md -o $@\n" "pandoc" - @sed "s/{VERSION}/$(VERSION)/g" $(TARGET).1.md | pandoc -s -t man -o $@ +feuille: $(OBJ) + @printf "%-8s $(OBJ) -o feuille\n" "$(CC)" + @$(CC) $(OBJ) -o feuille $(LDFLAGS) +# cosmopolitan libc +feuille.com: cosmopolitan feuille + @printf "%-8s feuille -o feuille.com\n" "objcopy" + @objcopy -S -O binary feuille feuille.com + +cosmopolitan: + @if [ ! -d cosmopolitan ]; then \ + printf "%-8s https://justine.lol/cosmopolitan/cosmopolitan-amalgamation-2.2.zip\n" "curl" ;\ + curl -sO "https://justine.lol/cosmopolitan/cosmopolitan-amalgamation-2.2.zip" ;\ + \ + printf "%-8s cosmopolitan-amalgamation-2.2.zip\n" "unzip" ;\ + unzip -qf cosmopolitan-amalgamation-2.2.zip -d cosmopolitan ;\ + \ + rm -rf cosmopolitan-amalgamation-* ;\ + fi + +# CGI script ADDR = 127.0.0.1 PORT = 9999 cgi: cgi/feuille.cgi cgi/feuille.cgi: cgi/feuille.cgi.c - @printf "%-8s cgi/feuille.cgi.c -o $@\n" "$(CC)" - @$(CC) $(CFLAGS) $(LDFLAGS) -static -DADDR=\"$(ADDR)\" -DPORT=$(PORT) cgi/feuille.cgi.c -o $@ + @printf "%-8s cgi/feuille.cgi.c -o cgi/feuille.cgi\n" "$(CC)" + @$(CC) cgi/feuille.cgi.c -o cgi/feuille.cgi -std=c99 -O3 -static -Wall -Wextra \ + -DADDR=\"$(ADDR)\" -DPORT=$(PORT) \ + $(INCS) $(LIBS) .SUFFIXES: .c .o .c.o: @printf "%-8s $<\n" "$(CC)" - @$(CC) $(CFLAGS) -c $< + @$(CC) -c $< $(CFLAGS) diff --git a/arg.h b/arg.h index 2130a20..9c4d1bb 100644 --- a/arg.h +++ b/arg.h @@ -34,8 +34,11 @@ #ifndef _ARG_H_ #define _ARG_H_ +#ifndef COSMOPOLITAN #include #include +#endif + extern char *argv0; /* use main(int argc, char *argv[]) */ diff --git a/bin.c b/bin.c index a927f78..ee97280 100644 --- a/bin.c +++ b/bin.c @@ -13,11 +13,13 @@ #include "bin.h" +#ifndef COSMOPOLITAN #include /* for errno */ #include /* for NULL, fclose, fopen, fputs, snprintf, FILE */ #include /* for calloc, free, malloc, rand, realloc */ #include /* for strlen */ #include /* for access, F_OK */ +#endif #include "feuille.h" /* for Settings, settings */ diff --git a/config.mk b/config.mk index 62d505f..80b04ea 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # feuille version -VERSION = 1.19.5 +VERSION = 2.0.0 # paths (customize them to fit your system) PREFIX = /usr/local @@ -17,13 +17,28 @@ LIBS = -L/usr/lib -lc # compiler CC = cc -# debug build -CFLAGS = -g -std=c99 -Wall -Wextra -Wpedantic -Wno-sign-compare -DVERSION=\"$(VERSION)\" -DDEBUG $(INCS) -LDFLAGS = -g $(LIBS) +# cosmopolitan libc flags +CCFLAGS = -std=c99 -nostdinc -fno-pie -fno-omit-frame-pointer \ + -mno-tls-direct-seg-refs -mno-red-zone \ + -DVERSION=\"$(VERSION)\" -DCOSMOPOLITAN \ + -I. -include cosmopolitan/cosmopolitan.h -# release build -CFLAGS$(DEBUG) = -std=c99 -Wall -Wextra -Wno-sign-compare -DVERSION=\"$(VERSION)\" -O3 $(INCS) -LDFLAGS$(DEBUG) = -s $(LIBS) +CLDFLAGS = -std=c99 -static -nostdlib -fno-pie -fno-omit-frame-pointer \ + -mno-tls-direct-seg-refs -mno-red-zone \ + -fuse-ld=bfd -Wl,-T,cosmopolitan/ape.lds -Wl,--gc-sections \ + cosmopolitan/crt.o cosmopolitan/ape-no-modify-self.o cosmopolitan/cosmopolitan.a + +# standard libc flags +CCFLAGS$(COSMO) = -std=c99 -DVERSION=\"$(VERSION)\" $(INCS) +CLDFLAGS$(COSMO) = $(LIBS) + +# debug flags +CFLAGS = -g -Wall -Wextra -Wno-sign-compare -DDEBUG $(CCFLAGS) +LDFLAGS = -g $(CLDFLAGS) + +# release flags +CFLAGS$(DEBUG) = -O3 -Wall -Wextra -Wno-sign-compare $(CCFLAGS) +LDFLAGS$(DEBUG) = -s $(CLDFLAGS) # static build (uncomment) #LD_FLAGS += -static diff --git a/feuille.1 b/feuille.1 index ed874a1..0d7bb17 100644 --- a/feuille.1 +++ b/feuille.1 @@ -14,7 +14,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "feuille" "1" "November 2022" "feuille 1.19.5" "" +.TH "feuille" "1" "November 2022" "feuille 2.0.0" "" .hy .SH NAME .PP diff --git a/feuille.c b/feuille.c index a81e82e..843bde9 100644 --- a/feuille.c +++ b/feuille.c @@ -15,6 +15,7 @@ #include "feuille.h" +#ifndef COSMOPOLITAN #include /* for errno, ERANGE, EAGAIN, EFBIG, ENOENT */ #include /* for initgroups */ #include /* for USHRT_MAX, ULONG_MAX, CHAR_MAX, PATH_MAX, UCHA... */ @@ -29,6 +30,7 @@ #include /* for syslog, openlog, LOG_WARNING, LOG_NDELAY, LOG_... */ #include /* for time */ #include /* for getuid, access, chdir, chown, chroot, close */ +#endif #include "arg.h" /* for EARGF, ARGBEGIN, ARGEND */ #include "bin.h" /* for create_url, generate_id, write_paste */ @@ -387,8 +389,11 @@ int main(int argc, char *argv[]) if (setgid(gid) != 0 || getgid() != gid) die(1, "could not switch to group for user `%s'.\n", settings.user); + #ifndef COSMOPOLITAN + /* initgroups doesn't work on cosmopolitan libc yet */ if (initgroups(settings.user, gid) != 0) die(1, "could not initialize other groups for user `%s'.\n", settings.user); + #endif /* switching user */ if (setuid(uid) != 0 || getuid() != uid) diff --git a/server.c b/server.c index 2c1a196..a01f535 100644 --- a/server.c +++ b/server.c @@ -13,6 +13,7 @@ #include "server.h" +#ifndef COSMOPOLITAN #include /* for inet_pton */ #include /* for errno, EAGAIN, EFBIG, ENOENT */ #include /* for htons, sockaddr_in, sockaddr_in6, IPPROTO_IPV6 */ @@ -24,6 +25,7 @@ #include /* for setsockopt, bind, socket, SOL_SOCKET, AF_INET */ #include /* for timeval */ #include /* for close */ +#endif #include "feuille.h" /* for Settings, settings */ #include "util.h" /* for verbose */ @@ -136,9 +138,14 @@ int initialize_server() */ int accept_connection(int socket) { + /* only needed for cosmopolitan libc */ + /* we don't do anything with this struct yet */ + struct sockaddr_in address; + int addrlen = sizeof(address); + /* accept the connection */ /* TODO: maybe retrieve IP address for logging? *maybe* */ - int connection = accept(socket, (struct sockaddr *)NULL, NULL); + int connection = accept(socket, (struct sockaddr*)&address, (socklen_t*)&addrlen); /* set the timeout for the connection */ struct timeval timeout = { settings.timeout, 0 }; diff --git a/util.c b/util.c index aef31f5..7cabb91 100644 --- a/util.c +++ b/util.c @@ -15,11 +15,13 @@ #include "util.h" +#ifndef COSMOPOLITAN #include /* for va_end, va_list, va_start */ #include /* for snprintf, vsnprintf, vfprintf, BUFSIZ, stderr */ #include /* for exit */ #include /* for syslog, LOG_DEBUG, LOG_ERR */ #include /* for getpid */ +#endif #include "feuille.h" /* for Settings, settings */