Compare commits
7 commits
3922c5cabb
...
20fe93c3ca
Author | SHA1 | Date | |
---|---|---|---|
20fe93c3ca | |||
de2c58196c | |||
0ccd538c97 | |||
16f516d6ce | |||
63319d7525 | |||
3c356481e1 | |||
fdbbd73010 |
10 changed files with 107 additions and 40 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,4 +1,8 @@
|
||||||
*.o
|
*.o
|
||||||
|
|
||||||
|
cosmopolitan
|
||||||
|
|
||||||
feuille
|
feuille
|
||||||
|
feuille.com
|
||||||
|
|
||||||
cgi/feuille.cgi
|
cgi/feuille.cgi
|
||||||
|
|
57
Makefile
57
Makefile
|
@ -4,11 +4,13 @@
|
||||||
|
|
||||||
include config.mk
|
include config.mk
|
||||||
|
|
||||||
TARGET = feuille
|
TARGET = feuille.com
|
||||||
|
TARGET$(COSMO) = feuille
|
||||||
|
|
||||||
SRC = feuille.c util.c server.c bin.c
|
SRC = feuille.c util.c server.c bin.c
|
||||||
OBJ = $(SRC:%.c=%.o)
|
OBJ = $(SRC:%.c=%.o)
|
||||||
|
|
||||||
all: $(TARGET) $(TARGET).1 cgi
|
all: $(TARGET) feuille.1 cgi
|
||||||
|
|
||||||
run: $(TARGET)
|
run: $(TARGET)
|
||||||
./$(TARGET)
|
./$(TARGET)
|
||||||
|
@ -18,10 +20,10 @@ clean:
|
||||||
@rm -f $(OBJ)
|
@rm -f $(OBJ)
|
||||||
|
|
||||||
distclean:
|
distclean:
|
||||||
@printf "%-8s $(TARGET) $(OBJ)\n" "rm"
|
@printf "%-8s feuille feuille.com $(OBJ)\n" "rm"
|
||||||
@rm -f $(TARGET) $(OBJ)
|
@rm -f feuille feuille.com $(OBJ)
|
||||||
|
|
||||||
install: $(TARGET) $(TARGET).1
|
install: $(TARGET) feuille.1
|
||||||
@echo "installing executable file to $(PREFIX)/bin"
|
@echo "installing executable file to $(PREFIX)/bin"
|
||||||
@mkdir -p "$(PREFIX)/bin"
|
@mkdir -p "$(PREFIX)/bin"
|
||||||
@cp -f $(TARGET) "$(PREFIX)/bin"
|
@cp -f $(TARGET) "$(PREFIX)/bin"
|
||||||
|
@ -29,34 +31,53 @@ install: $(TARGET) $(TARGET).1
|
||||||
|
|
||||||
@echo "installing manpage to $(MAN)/man1"
|
@echo "installing manpage to $(MAN)/man1"
|
||||||
@mkdir -p $(MAN)/man1
|
@mkdir -p $(MAN)/man1
|
||||||
@cp -f $(TARGET).1 $(MAN)/man1
|
@cp -f feuille.1 $(MAN)/man1
|
||||||
@chmod 644 $(MAN)/man1/$(TARGET).1
|
@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"
|
@echo "removing executable file from $(PREFIX)/bin"
|
||||||
@rm -f "$(PREFIX)/bin/$(TARGET)"
|
@rm -f "$(PREFIX)/bin/$(TARGET)"
|
||||||
|
|
||||||
@echo "removing manpage from $(MAN)/man1"
|
@echo "removing manpage from $(MAN)/man1"
|
||||||
@rm -f $(MAN)/man1/$(TARGET).1
|
@rm -f $(MAN)/man1/feuille.1
|
||||||
|
|
||||||
$(TARGET): $(OBJ)
|
feuille.1: feuille.1.md config.mk
|
||||||
@printf "%-8s $(OBJ) -o $@\n" "$(CC)"
|
@printf "%-8s feuille.1.md -o feuille.1\n" "pandoc"
|
||||||
@$(CC) $(LDFLAGS) $(OBJ) -o $@
|
@sed "s/{VERSION}/$(VERSION)/g" feuille.1.md | pandoc -s -t man -o feuille.1
|
||||||
|
|
||||||
$(TARGET).1: $(TARGET).1.md config.mk
|
feuille: $(OBJ)
|
||||||
@printf "%-8s $(TARGET).1.md -o $@\n" "pandoc"
|
@printf "%-8s $(OBJ) -o feuille\n" "$(CC)"
|
||||||
@sed "s/{VERSION}/$(VERSION)/g" $(TARGET).1.md | pandoc -s -t man -o $@
|
@$(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
|
ADDR = 127.0.0.1
|
||||||
PORT = 9999
|
PORT = 9999
|
||||||
|
|
||||||
cgi: cgi/feuille.cgi
|
cgi: cgi/feuille.cgi
|
||||||
|
|
||||||
cgi/feuille.cgi: cgi/feuille.cgi.c
|
cgi/feuille.cgi: cgi/feuille.cgi.c
|
||||||
@printf "%-8s cgi/feuille.cgi.c -o $@\n" "$(CC)"
|
@printf "%-8s cgi/feuille.cgi.c -o cgi/feuille.cgi\n" "$(CC)"
|
||||||
@$(CC) $(CFLAGS) $(LDFLAGS) -static -DADDR=\"$(ADDR)\" -DPORT=$(PORT) cgi/feuille.cgi.c -o $@
|
@$(CC) cgi/feuille.cgi.c -o cgi/feuille.cgi -std=c99 -O3 -static -Wall -Wextra \
|
||||||
|
-DADDR=\"$(ADDR)\" -DPORT=$(PORT) \
|
||||||
|
$(INCS) $(LIBS)
|
||||||
|
|
||||||
.SUFFIXES: .c .o
|
.SUFFIXES: .c .o
|
||||||
.c.o:
|
.c.o:
|
||||||
@printf "%-8s $<\n" "$(CC)"
|
@printf "%-8s $<\n" "$(CC)"
|
||||||
@$(CC) $(CFLAGS) -c $<
|
@$(CC) -c $< $(CFLAGS)
|
||||||
|
|
10
README.md
10
README.md
|
@ -159,6 +159,7 @@ That sould be it. Have fun!
|
||||||
* Works on nearly all POSIX-compliant OSes
|
* Works on nearly all POSIX-compliant OSes
|
||||||
* Can be run in the background and as a service
|
* Can be run in the background and as a service
|
||||||
* IPv6-enabled
|
* IPv6-enabled
|
||||||
|
* Now with 100% more (Cosmopolitan libc)[http://justine.lol/cosmopolitan/] support!
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
@ -194,6 +195,13 @@ $ make
|
||||||
$ sudo make install
|
$ 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
|
If you wish to make a debug build, you can set `DEBUG` to whatever
|
||||||
comes to your mind.
|
comes to your mind.
|
||||||
|
|
||||||
|
@ -201,7 +209,7 @@ You can also set `CC` to the compiler of your liking, like `clang` or
|
||||||
`pcc`.
|
`pcc`.
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ make DEBUG=yes CC=clang
|
$ make COSMO=y DEBUG=y CC=clang
|
||||||
```
|
```
|
||||||
|
|
||||||
In order to compile CGI script(s), run:
|
In order to compile CGI script(s), run:
|
||||||
|
|
3
arg.h
3
arg.h
|
@ -34,8 +34,11 @@
|
||||||
#ifndef _ARG_H_
|
#ifndef _ARG_H_
|
||||||
#define _ARG_H_
|
#define _ARG_H_
|
||||||
|
|
||||||
|
#ifndef COSMOPOLITAN
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
extern char *argv0;
|
extern char *argv0;
|
||||||
|
|
||||||
/* use main(int argc, char *argv[]) */
|
/* use main(int argc, char *argv[]) */
|
||||||
|
|
2
bin.c
2
bin.c
|
@ -13,11 +13,13 @@
|
||||||
|
|
||||||
#include "bin.h"
|
#include "bin.h"
|
||||||
|
|
||||||
|
#ifndef COSMOPOLITAN
|
||||||
#include <errno.h> /* for errno */
|
#include <errno.h> /* for errno */
|
||||||
#include <stdio.h> /* for NULL, fclose, fopen, fputs, snprintf, FILE */
|
#include <stdio.h> /* for NULL, fclose, fopen, fputs, snprintf, FILE */
|
||||||
#include <stdlib.h> /* for calloc, free, malloc, rand, realloc */
|
#include <stdlib.h> /* for calloc, free, malloc, rand, realloc */
|
||||||
#include <string.h> /* for strlen */
|
#include <string.h> /* for strlen */
|
||||||
#include <unistd.h> /* for access, F_OK */
|
#include <unistd.h> /* for access, F_OK */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "feuille.h" /* for Settings, settings */
|
#include "feuille.h" /* for Settings, settings */
|
||||||
|
|
||||||
|
|
29
config.mk
29
config.mk
|
@ -1,5 +1,5 @@
|
||||||
# feuille version
|
# feuille version
|
||||||
VERSION = 1.19.5
|
VERSION = 2.1.0
|
||||||
|
|
||||||
# paths (customize them to fit your system)
|
# paths (customize them to fit your system)
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
|
@ -17,13 +17,28 @@ LIBS = -L/usr/lib -lc
|
||||||
# compiler
|
# compiler
|
||||||
CC = cc
|
CC = cc
|
||||||
|
|
||||||
# debug build
|
# cosmopolitan libc flags
|
||||||
CFLAGS = -g -std=c99 -Wall -Wextra -Wpedantic -Wno-sign-compare -DVERSION=\"$(VERSION)\" -DDEBUG $(INCS)
|
CCFLAGS = -std=c99 -nostdinc -fno-pie -fno-omit-frame-pointer \
|
||||||
LDFLAGS = -g $(LIBS)
|
-mno-tls-direct-seg-refs -mno-red-zone \
|
||||||
|
-DVERSION=\"$(VERSION)\" -DCOSMOPOLITAN \
|
||||||
|
-I. -include cosmopolitan/cosmopolitan.h
|
||||||
|
|
||||||
# release build
|
CLDFLAGS = -std=c99 -static -nostdlib -fno-pie -fno-omit-frame-pointer \
|
||||||
CFLAGS$(DEBUG) = -std=c99 -Wall -Wextra -Wno-sign-compare -DVERSION=\"$(VERSION)\" -O3 $(INCS)
|
-mno-tls-direct-seg-refs -mno-red-zone \
|
||||||
LDFLAGS$(DEBUG) = -s $(LIBS)
|
-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)
|
# static build (uncomment)
|
||||||
#LD_FLAGS += -static
|
#LD_FLAGS += -static
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
. ftr VB CB
|
. ftr VB CB
|
||||||
. ftr VBI CBI
|
. ftr VBI CBI
|
||||||
.\}
|
.\}
|
||||||
.TH "feuille" "1" "November 2022" "feuille 1.19.5" ""
|
.TH "feuille" "1" "November 2022" "feuille 2.1.0" ""
|
||||||
.hy
|
.hy
|
||||||
.SH NAME
|
.SH NAME
|
||||||
.PP
|
.PP
|
||||||
|
|
14
feuille.c
14
feuille.c
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include "feuille.h"
|
#include "feuille.h"
|
||||||
|
|
||||||
|
#ifndef COSMOPOLITAN
|
||||||
#include <errno.h> /* for errno, ERANGE, EAGAIN, EFBIG, ENOENT */
|
#include <errno.h> /* for errno, ERANGE, EAGAIN, EFBIG, ENOENT */
|
||||||
#include <grp.h> /* for initgroups */
|
#include <grp.h> /* for initgroups */
|
||||||
#include <limits.h> /* for USHRT_MAX, ULONG_MAX, CHAR_MAX, PATH_MAX, UCHA... */
|
#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 <syslog.h> /* for syslog, openlog, LOG_WARNING, LOG_NDELAY, LOG_... */
|
||||||
#include <time.h> /* for time */
|
#include <time.h> /* for time */
|
||||||
#include <unistd.h> /* for getuid, access, chdir, chown, chroot, close */
|
#include <unistd.h> /* for getuid, access, chdir, chown, chroot, close */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "arg.h" /* for EARGF, ARGBEGIN, ARGEND */
|
#include "arg.h" /* for EARGF, ARGBEGIN, ARGEND */
|
||||||
#include "bin.h" /* for create_url, generate_id, write_paste */
|
#include "bin.h" /* for create_url, generate_id, write_paste */
|
||||||
|
@ -93,6 +95,12 @@ void accept_loop(int server)
|
||||||
/* accept loop */
|
/* accept loop */
|
||||||
int connection;
|
int connection;
|
||||||
while ((connection = accept_connection(server))) {
|
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));
|
verbose(1, "--- new incoming connection. connection ID: %d:%d ---", pid, time(0));
|
||||||
|
|
||||||
unsigned long paste_size = 0;
|
unsigned long paste_size = 0;
|
||||||
|
@ -342,7 +350,6 @@ int main(int argc, char *argv[])
|
||||||
gid = user->pw_gid;
|
gid = user->pw_gid;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
puts("");
|
|
||||||
syslog(LOG_WARNING, "running as non-root user.");
|
syslog(LOG_WARNING, "running as non-root user.");
|
||||||
syslog(LOG_WARNING, "`chroot' and user switching have been disabled.");
|
syslog(LOG_WARNING, "`chroot' and user switching have been disabled.");
|
||||||
puts("");
|
puts("");
|
||||||
|
@ -382,15 +389,18 @@ int main(int argc, char *argv[])
|
||||||
if (setgid(gid) != 0 || getgid() != gid)
|
if (setgid(gid) != 0 || getgid() != gid)
|
||||||
die(1, "could not switch to group for user `%s'.\n", settings.user);
|
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)
|
if (initgroups(settings.user, gid) != 0)
|
||||||
die(1, "could not initialize other groups for user `%s'.\n", settings.user);
|
die(1, "could not initialize other groups for user `%s'.\n", settings.user);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* switching user */
|
/* switching user */
|
||||||
if (setuid(uid) != 0 || getuid() != uid)
|
if (setuid(uid) != 0 || getuid() != uid)
|
||||||
die(1, "could not switch to user `%s'.\n", settings.user);
|
die(1, "could not switch to user `%s'.\n", settings.user);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __OpenBSD__
|
#if defined __OpenBSD__ || defined COSMOPOLITAN
|
||||||
/* OpenBSD-only security measures */
|
/* OpenBSD-only security measures */
|
||||||
pledge("proc stdio rpath wpath cpath inet", "stdio rpath wpath cpath inet");
|
pledge("proc stdio rpath wpath cpath inet", "stdio rpath wpath cpath inet");
|
||||||
#endif
|
#endif
|
||||||
|
|
20
server.c
20
server.c
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
|
||||||
|
#ifndef COSMOPOLITAN
|
||||||
#include <arpa/inet.h> /* for inet_pton */
|
#include <arpa/inet.h> /* for inet_pton */
|
||||||
#include <errno.h> /* for errno, EAGAIN, EFBIG, ENOENT */
|
#include <errno.h> /* for errno, EAGAIN, EFBIG, ENOENT */
|
||||||
#include <netinet/in.h> /* for htons, sockaddr_in, sockaddr_in6, IPPROTO_IPV6 */
|
#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/socket.h> /* for setsockopt, bind, socket, SOL_SOCKET, AF_INET */
|
||||||
#include <sys/time.h> /* for timeval */
|
#include <sys/time.h> /* for timeval */
|
||||||
#include <unistd.h> /* for close */
|
#include <unistd.h> /* for close */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "feuille.h" /* for Settings, settings */
|
#include "feuille.h" /* for Settings, settings */
|
||||||
#include "util.h" /* for verbose */
|
#include "util.h" /* for verbose */
|
||||||
|
@ -103,19 +105,14 @@ int initialize_server()
|
||||||
if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof(int)) < 0)
|
if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof(int)) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
#ifndef __OpenBSD__
|
|
||||||
/* Enable dual-stack mode on supported platforms */
|
/* Enable dual-stack mode on supported platforms */
|
||||||
verbose(3, " IPV6_V6ONLY...");
|
verbose(3, " IPV6_V6ONLY...");
|
||||||
if (setsockopt(server, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6_only, sizeof(ipv6_only)) < 0)
|
|
||||||
return -1;
|
if (setsockopt(server, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6_only, sizeof(ipv6_only)) < 0) {
|
||||||
#else
|
syslog(LOG_WARNING, "dual-stack mode is disabled on your platform.");
|
||||||
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.");
|
syslog(LOG_WARNING, "feuille will only listen on the `::' IPv6 address.");
|
||||||
puts("");
|
puts("");
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* bind address and port */
|
/* bind address and port */
|
||||||
verbose(3, "binding address on the socket...");
|
verbose(3, "binding address on the socket...");
|
||||||
|
@ -141,9 +138,14 @@ int initialize_server()
|
||||||
*/
|
*/
|
||||||
int accept_connection(int socket)
|
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 */
|
/* accept the connection */
|
||||||
/* TODO: maybe retrieve IP address for logging? *maybe* */
|
/* 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 */
|
/* set the timeout for the connection */
|
||||||
struct timeval timeout = { settings.timeout, 0 };
|
struct timeval timeout = { settings.timeout, 0 };
|
||||||
|
|
2
util.c
2
util.c
|
@ -15,11 +15,13 @@
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
#ifndef COSMOPOLITAN
|
||||||
#include <stdarg.h> /* for va_end, va_list, va_start */
|
#include <stdarg.h> /* for va_end, va_list, va_start */
|
||||||
#include <stdio.h> /* for snprintf, vsnprintf, vfprintf, BUFSIZ, stderr */
|
#include <stdio.h> /* for snprintf, vsnprintf, vfprintf, BUFSIZ, stderr */
|
||||||
#include <stdlib.h> /* for exit */
|
#include <stdlib.h> /* for exit */
|
||||||
#include <syslog.h> /* for syslog, LOG_DEBUG, LOG_ERR */
|
#include <syslog.h> /* for syslog, LOG_DEBUG, LOG_ERR */
|
||||||
#include <unistd.h> /* for getpid */
|
#include <unistd.h> /* for getpid */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "feuille.h" /* for Settings, settings */
|
#include "feuille.h" /* for Settings, settings */
|
||||||
|
|
||||||
|
|
Reference in a new issue