commit
2b81bf74ba
@ -0,0 +1,3 @@
|
||||
*.o
|
||||
sink
|
||||
sink-*
|
@ -0,0 +1,65 @@
|
||||
# Sinks all input to /dev/null
|
||||
PROJECT=sink
|
||||
|
||||
SRC=$(wildcard *.c)
|
||||
OUTPUT=$(PROJECT)
|
||||
|
||||
COMMON_FLAGS+= -W -Wall -Wextra -Wstrict-aliasing -fno-strict-aliasing
|
||||
|
||||
TARGET_ARCH?=native
|
||||
ifneq ($(TARGET_ARCH),)
|
||||
TARGET_ARCH:=$(addprefix -march=,$(TARGET_ARCH))
|
||||
endif
|
||||
RELEASE_CFLAGS+= $(TARGET_ARCH) -fgraphite -fopenmp -floop-parallelize-all -ftree-parallelize-loops=4 \
|
||||
-floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block \
|
||||
-fno-stack-check
|
||||
|
||||
RELEASE_CFLAGS+= -O3 -flto
|
||||
RELEASE_LDFLAGS+= -Wl,-O3 -Wl,-flto
|
||||
|
||||
DEBUG_CFLAGS+=-Og -g3 -ggdb -gz
|
||||
DEBUG_LDFLASG+=-Wl,-g
|
||||
|
||||
CFLAGS += $(COMMON_FLAGS) --std=gnu17
|
||||
LDFLAGS +=
|
||||
|
||||
OBJ = $(SRC:.c=.o)
|
||||
|
||||
STRIP=strip
|
||||
|
||||
# Phonies
|
||||
|
||||
.PHONY: $(OUTPUT)
|
||||
$(OUTPUT): $(PROJECT)-release
|
||||
mv $< $@
|
||||
$(STRIP) $@
|
||||
|
||||
|
||||
.PHONY: release
|
||||
release: $(PROJECT)-release
|
||||
|
||||
.PHONY: debug
|
||||
debug: $(PROJECT)-debug
|
||||
|
||||
# Targets
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -c $< $(CFLAGS) -o $@ $(LDFLAGS)
|
||||
|
||||
$(PROJECT)-debug: CFLAGS+=$(DEBUG_CFLAGS)
|
||||
$(PROJECT)-debug: LDFLAGS+=$(DEBUG_LDFLAGS)
|
||||
$(PROJECT)-debug: $(OBJ)
|
||||
$(CC) $^ -fwhole-program $(CFLAGS) -o $@ $(LDFLAGS)
|
||||
|
||||
|
||||
$(PROJECT)-release: CFLAGS+=$(RELEASE_CFLAGS)
|
||||
$(PROJECT)-release: LDFLAGS+=$(RELEASE_LDFLAGS)
|
||||
$(PROJECT)-release: $(OBJ)
|
||||
$(CC) $^ -fwhole-program $(CFLAGS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
rm -f *.o
|
||||
rm -f $(OUTPUT) $(PROJECT)-*
|
||||
|
||||
|
||||
|
@ -0,0 +1,43 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define r_stdin 0
|
||||
#define r_stdout 1
|
||||
#define r_stderr 2
|
||||
|
||||
#define LIKELY(e) __builtin_expect(!!(e), 1)
|
||||
#define UNLIKELY(e) __builtin_expect(!!(e), 0)
|
||||
|
||||
static inline int dupall(int from)
|
||||
{
|
||||
if(UNLIKELY(dup2(from, r_stdin) < 0)) {
|
||||
perror("failed to dup2() stdin to sink");
|
||||
return 1;
|
||||
}
|
||||
if(UNLIKELY(dup2(from, r_stdout) < 0)) {
|
||||
perror("failed to dup2() stdout to sink");
|
||||
return 2;
|
||||
}
|
||||
#ifdef REPLACE_STDERR
|
||||
if(UNLIKELY(dup2(from, r_stderr) < 0)) {
|
||||
perror("failed to dup2() stderr to sink");
|
||||
#else
|
||||
if(UNLIKELY(close(r_stderr) != 0)) {
|
||||
perror("failed to close stderr");
|
||||
|
||||
#endif
|
||||
return 3;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int null = open("/dev/null", O_RDWR);
|
||||
if(UNLIKELY(null<0)) {
|
||||
perror("failed to open /dev/null");
|
||||
return 1;
|
||||
}
|
||||
return dupall(null);
|
||||
}
|
Loading…
Reference in new issue