feat: cosmopolitan libc support
Added support for cosmopolitan libc. Simply do `make COSMO=yes` and you'll get feuille.com, a working αcτµαlly pδrταblε εxεcµταblε pastebin server. + version bump.
This commit is contained in:
		
							parent
							
								
									63319d7525
								
							
						
					
					
						commit
						16f516d6ce
					
				
					 9 changed files with 86 additions and 27 deletions
				
			
		
							
								
								
									
										4
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,8 @@ | |||
| *.o | ||||
| 
 | ||||
| cosmopolitan | ||||
| 
 | ||||
| feuille | ||||
| feuille.com | ||||
| 
 | ||||
| cgi/feuille.cgi | ||||
|  |  | |||
							
								
								
									
										57
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										57
									
								
								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) | ||||
|  |  | |||
							
								
								
									
										3
									
								
								arg.h
									
										
									
									
									
								
							
							
						
						
									
										3
									
								
								arg.h
									
										
									
									
									
								
							|  | @ -34,8 +34,11 @@ | |||
| #ifndef _ARG_H_ | ||||
| #define _ARG_H_ | ||||
| 
 | ||||
| #ifndef COSMOPOLITAN | ||||
| #include <stdlib.h> | ||||
| #include <stddef.h> | ||||
| #endif | ||||
| 
 | ||||
| extern char *argv0; | ||||
| 
 | ||||
| /* use main(int argc, char *argv[]) */ | ||||
|  |  | |||
							
								
								
									
										2
									
								
								bin.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								bin.c
									
										
									
									
									
								
							|  | @ -13,11 +13,13 @@ | |||
| 
 | ||||
| #include "bin.h" | ||||
| 
 | ||||
| #ifndef COSMOPOLITAN | ||||
| #include <errno.h>    /* for errno                                      */ | ||||
| #include <stdio.h>    /* for NULL, fclose, fopen, fputs, snprintf, FILE */ | ||||
| #include <stdlib.h>   /* for calloc, free, malloc, rand, realloc        */ | ||||
| #include <string.h>   /* for strlen                                     */ | ||||
| #include <unistd.h>   /* for access, F_OK                               */ | ||||
| #endif | ||||
| 
 | ||||
| #include "feuille.h"  /* for Settings, settings                         */ | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										29
									
								
								config.mk
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								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
 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ | |||
| 
 | ||||
| #include "feuille.h" | ||||
| 
 | ||||
| #ifndef COSMOPOLITAN | ||||
| #include <errno.h>     /* for errno, ERANGE, EAGAIN, EFBIG, ENOENT              */ | ||||
| #include <grp.h>       /* for initgroups                                        */ | ||||
| #include <limits.h>    /* for USHRT_MAX, ULONG_MAX, CHAR_MAX, PATH_MAX, UCHA... */ | ||||
|  | @ -29,6 +30,7 @@ | |||
| #include <syslog.h>    /* for syslog, openlog, LOG_WARNING, LOG_NDELAY, LOG_... */ | ||||
| #include <time.h>      /* for time                                              */ | ||||
| #include <unistd.h>    /* 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) | ||||
|  |  | |||
							
								
								
									
										9
									
								
								server.c
									
										
									
									
									
								
							
							
						
						
									
										9
									
								
								server.c
									
										
									
									
									
								
							|  | @ -13,6 +13,7 @@ | |||
| 
 | ||||
| #include "server.h" | ||||
| 
 | ||||
| #ifndef COSMOPOLITAN | ||||
| #include <arpa/inet.h>   /* for inet_pton                                      */ | ||||
| #include <errno.h>       /* for errno, EAGAIN, EFBIG, ENOENT                   */ | ||||
| #include <netinet/in.h>  /* for htons, sockaddr_in, sockaddr_in6, IPPROTO_IPV6 */ | ||||
|  | @ -24,6 +25,7 @@ | |||
| #include <sys/socket.h>  /* for setsockopt, bind, socket, SOL_SOCKET, AF_INET  */ | ||||
| #include <sys/time.h>    /* for timeval                                        */ | ||||
| #include <unistd.h>      /* 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 }; | ||||
|  |  | |||
							
								
								
									
										2
									
								
								util.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								util.c
									
										
									
									
									
								
							|  | @ -15,11 +15,13 @@ | |||
| 
 | ||||
| #include "util.h" | ||||
| 
 | ||||
| #ifndef COSMOPOLITAN | ||||
| #include <stdarg.h>   /* for va_end, va_list, va_start                     */ | ||||
| #include <stdio.h>    /* for snprintf, vsnprintf, vfprintf, BUFSIZ, stderr */ | ||||
| #include <stdlib.h>   /* for exit                                          */ | ||||
| #include <syslog.h>   /* for syslog, LOG_DEBUG, LOG_ERR                    */ | ||||
| #include <unistd.h>   /* for getpid                                        */ | ||||
| #endif | ||||
| 
 | ||||
| #include "feuille.h"  /* for Settings, settings                            */ | ||||
| 
 | ||||
|  |  | |||
		Reference in a new issue
	
	 Tom MTT
						Tom MTT