diff --git a/.gitignore b/.gitignore index ad9f5f6..654d37f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,4 @@ *.o -cosmopolitan - feuille -feuille.com - cgi/feuille.cgi diff --git a/Makefile b/Makefile index b5878a6..b3b57ed 100644 --- a/Makefile +++ b/Makefile @@ -4,13 +4,11 @@ include config.mk -TARGET = feuille.com -TARGET$(COSMO) = feuille +TARGET = feuille +SRC = feuille.c util.c server.c bin.c +OBJ = $(SRC:%.c=%.o) -SRC = feuille.c util.c server.c bin.c -OBJ = $(SRC:%.c=%.o) - -all: $(TARGET) feuille.1 cgi +all: $(TARGET) $(TARGET).1 cgi run: $(TARGET) ./$(TARGET) @@ -20,10 +18,10 @@ clean: @rm -f $(OBJ) distclean: - @printf "%-8s feuille feuille.com $(OBJ)\n" "rm" - @rm -f feuille feuille.com $(OBJ) + @printf "%-8s $(TARGET) $(OBJ)\n" "rm" + @rm -f $(TARGET) $(OBJ) -install: $(TARGET) feuille.1 +install: $(TARGET) $(TARGET).1 @echo "installing executable file to $(PREFIX)/bin" @mkdir -p "$(PREFIX)/bin" @cp -f $(TARGET) "$(PREFIX)/bin" @@ -31,53 +29,34 @@ install: $(TARGET) feuille.1 @echo "installing manpage to $(MAN)/man1" @mkdir -p $(MAN)/man1 - @cp -f feuille.1 $(MAN)/man1 - @chmod 644 $(MAN)/man1/feuille.1 + @cp -f $(TARGET).1 $(MAN)/man1 + @chmod 644 $(MAN)/man1/$(TARGET).1 -uninstall: $(PREFIX)/bin/$(TARGET) $(MAN)/man1/feuille.1 +uninstall: $(PREFIX)/bin/$(TARGET) $(MAN)/man1/$(TARGET).1 @echo "removing executable file from $(PREFIX)/bin" @rm -f "$(PREFIX)/bin/$(TARGET)" @echo "removing manpage from $(MAN)/man1" - @rm -f $(MAN)/man1/feuille.1 + @rm -f $(MAN)/man1/$(TARGET).1 -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): $(OBJ) + @printf "%-8s $(OBJ) -o $@\n" "$(CC)" + @$(CC) $(LDFLAGS) $(OBJ) -o $@ -feuille: $(OBJ) - @printf "%-8s $(OBJ) -o feuille\n" "$(CC)" - @$(CC) $(OBJ) -o feuille $(LDFLAGS) +$(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 $@ -# 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 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) + @printf "%-8s cgi/feuille.cgi.c -o $@\n" "$(CC)" + @$(CC) $(CFLAGS) $(LDFLAGS) -static -DADDR=\"$(ADDR)\" -DPORT=$(PORT) cgi/feuille.cgi.c -o $@ .SUFFIXES: .c .o .c.o: @printf "%-8s $<\n" "$(CC)" - @$(CC) -c $< $(CFLAGS) + @$(CC) $(CFLAGS) -c $< diff --git a/README.md b/README.md index 195edcf..d26ee11 100644 --- a/README.md +++ b/README.md @@ -159,7 +159,6 @@ That sould be it. Have fun! * Works on nearly all POSIX-compliant OSes * Can be run in the background and as a service * IPv6-enabled -* Now with 100% more (Cosmopolitan libc)[http://justine.lol/cosmopolitan/] support! ## Installation @@ -195,13 +194,6 @@ $ make $ sudo make install ``` -You can also build using the -(Cosmopolitan libc)[http://justine.lol/cosmopolitan/], which will -make an executable capable of running on Linux, OpenBSD, FreeBSD, -Mac... out of the box. To do so, build with the `COSMO` flag. -It will produce `feuille` and `feuille.com`, the former being the -debug binary, and the former the portable one. - If you wish to make a debug build, you can set `DEBUG` to whatever comes to your mind. @@ -209,7 +201,7 @@ You can also set `CC` to the compiler of your liking, like `clang` or `pcc`. ```console -$ make COSMO=y DEBUG=y CC=clang +$ make DEBUG=yes CC=clang ``` In order to compile CGI script(s), run: diff --git a/arg.h b/arg.h index 9c4d1bb..2130a20 100644 --- a/arg.h +++ b/arg.h @@ -34,11 +34,8 @@ #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 ee97280..a927f78 100644 --- a/bin.c +++ b/bin.c @@ -13,13 +13,11 @@ #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 d6b25f7..62d505f 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # feuille version -VERSION = 2.1.0 +VERSION = 1.19.5 # paths (customize them to fit your system) PREFIX = /usr/local @@ -17,28 +17,13 @@ LIBS = -L/usr/lib -lc # compiler CC = cc -# 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 +# debug build +CFLAGS = -g -std=c99 -Wall -Wextra -Wpedantic -Wno-sign-compare -DVERSION=\"$(VERSION)\" -DDEBUG $(INCS) +LDFLAGS = -g $(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) +# release build +CFLAGS$(DEBUG) = -std=c99 -Wall -Wextra -Wno-sign-compare -DVERSION=\"$(VERSION)\" -O3 $(INCS) +LDFLAGS$(DEBUG) = -s $(LIBS) # static build (uncomment) #LD_FLAGS += -static diff --git a/feuille.1 b/feuille.1 index f90ddb6..ed874a1 100644 --- a/feuille.1 +++ b/feuille.1 @@ -14,7 +14,7 @@ . ftr VB CB . ftr VBI CBI .\} -.TH "feuille" "1" "November 2022" "feuille 2.1.0" "" +.TH "feuille" "1" "November 2022" "feuille 1.19.5" "" .hy .SH NAME .PP diff --git a/feuille.c b/feuille.c index 27d2b94..55a1d7f 100644 --- a/feuille.c +++ b/feuille.c @@ -15,7 +15,6 @@ #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... */ @@ -30,7 +29,6 @@ #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 */ @@ -95,12 +93,6 @@ void accept_loop(int server) /* accept loop */ int connection; while ((connection = accept_connection(server))) { - /* check if the socket is invalid */ - if (connection == -1) { - error("error while accepting incoming connection: %s", strerror(errno)); - continue; - } - verbose(1, "--- new incoming connection. connection ID: %d:%d ---", pid, time(0)); unsigned long paste_size = 0; @@ -350,6 +342,7 @@ int main(int argc, char *argv[]) gid = user->pw_gid; } else { + puts(""); syslog(LOG_WARNING, "running as non-root user."); syslog(LOG_WARNING, "`chroot' and user switching have been disabled."); puts(""); @@ -389,18 +382,15 @@ 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) die(1, "could not switch to user `%s'.\n", settings.user); } -#if defined __OpenBSD__ || defined COSMOPOLITAN +#ifdef __OpenBSD__ /* OpenBSD-only security measures */ pledge("proc stdio rpath wpath cpath inet", "stdio rpath wpath cpath inet"); #endif diff --git a/server.c b/server.c index a01f535..c26384c 100644 --- a/server.c +++ b/server.c @@ -13,7 +13,6 @@ #include "server.h" -#ifndef COSMOPOLITAN #include /* for inet_pton */ #include /* for errno, EAGAIN, EFBIG, ENOENT */ #include /* for htons, sockaddr_in, sockaddr_in6, IPPROTO_IPV6 */ @@ -25,7 +24,6 @@ #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 */ @@ -105,14 +103,19 @@ int initialize_server() if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof(int)) < 0) return -1; +#ifndef __OpenBSD__ /* Enable dual-stack mode on supported platforms */ verbose(3, " IPV6_V6ONLY..."); - - if (setsockopt(server, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6_only, sizeof(ipv6_only)) < 0) { - syslog(LOG_WARNING, "dual-stack mode is disabled on your platform."); + if (setsockopt(server, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6_only, sizeof(ipv6_only)) < 0) + return -1; +#else + if (ipv6_only == 0) { + puts(""); + syslog(LOG_WARNING, "dual-stack mode is disabled on OpenBSD."); syslog(LOG_WARNING, "feuille will only listen on the `::' IPv6 address."); puts(""); } +#endif /* bind address and port */ verbose(3, "binding address on the socket..."); @@ -138,14 +141,9 @@ 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*)&address, (socklen_t*)&addrlen); + int connection = accept(socket, (struct sockaddr *)NULL, NULL); /* set the timeout for the connection */ struct timeval timeout = { settings.timeout, 0 }; diff --git a/util.c b/util.c index 7cabb91..aef31f5 100644 --- a/util.c +++ b/util.c @@ -15,13 +15,11 @@ #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 */