diff --git a/Makefile b/Makefile index c3fcddf..1519387 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ # * `STRIP` - Strip command for default output (stripped release) target (`make sink`). set `make STRIP=:` to prevent stripping entirely. (NOTE: When using `make install`, `STRIP=:` will not work, instead, paradoxically, set `STRIP=true`, they have the same effect for all targets) PROJECT=sink DESCRIPTION=sink all input and output of a program to /dev/null -VERSION=0.1.0 +VERSION=0.2.0 AUTHOR=Avril LICENSE=GPL3+ diff --git a/README.md b/README.md index d659b01..2bd0b72 100644 --- a/README.md +++ b/README.md @@ -19,11 +19,15 @@ Run `make && sudo make install` to build with full optimisations and install `si To build for debugging, run `make debug`. -### Compiler flags -* `-DREPLACE_STDERR` - Add to `CFLAGS` when building a target to re-route the child program's `stderr` stream to the sink as well. By default, it is passed through as default. -* `-DNO_SEARCH_PATH` - Add to `CFLAGS` when building to prevent the program looking up its argument in the `PATH` environment variable. -* `-DNO_ENV` - Add to `CFLAGS` when building to prevent `envp` passthrough to the `execve()`'d program. -* `-DDEBUG_IGNORE_SPLASH` - Do not print project and version info in debug builds on startup. +### Feature flags + +Set the following to the environment variable `FEATURES` when invoking `make` to build with the speficied features' behaviour (e.g. `FEATURES=NO_SEARCH_PATH\ NO_ENV make`.) +When a debug-mode splash screen is printed, the features the binary was compiled with are also printed. + +* `REPLACE_STDERR` - Re-route the child program's `stderr` stream to the sink as well. By default, it is passed through as default. +* `NO_SEARCH_PATH` - Prevent the program looking up its argument in the `PATH` environment variable. +* `NO_ENV` - Prevent `envp` passthrough to the `execve()`'d program. +* `DEBUG_IGNORE_SPLASH` - Do not print project and version info in debug builds on startup. ### Installation The program must have been built before installation, and installation and uninstallation must be done as root. diff --git a/sink.c b/sink.c index 00d9c47..168f0fa 100644 --- a/sink.c +++ b/sink.c @@ -8,7 +8,8 @@ #include "comp_features.h" -static const enum compiled_features compiled_features = FEATURE_FLAGS; +__attribute__((used)) // For loading debug binary symbol +const enum compiled_features sink_compiled_features = FEATURE_FLAGS; #define r_stdin 0 #define r_stdout 1 @@ -153,6 +154,7 @@ static inline size_t count_list(const void*const* p) while(*p++) n+=1; return n; } +#if !FEATURE_HAS_FLAG(DEBUG_IGNORE_SPLASH) static void print_compiled_features() { #define _X "\t%s\n" @@ -176,15 +178,22 @@ static void print_compiled_features() #undef X #undef _X } +#endif static void print_debug_info(int argc, char* const* argv, char* const* envp) { +#ifndef RELEASE fprintf(stderr, "[DEBUG BUILD]\n"); +#else + fprintf(stderr, "[RELEASE BUILD]\n"); +#endif + #if ! FEATURE_HAS_FLAG(DEBUG_IGNORE_SPLASH) fprintf(stderr, _PROJECT " v" _VERSION ": " _DESCRIPTION "\n"); - fprintf(stderr, " :: written by " _AUTHOR " with <3 (License " _LICENSE ")\n---\n"); -#endif - fprintf(stderr, "> features:\n"); + fprintf(stderr, " :: written by " _AUTHOR " with <3 (License " _LICENSE ")\n"); + fprintf(stderr, "Built with features:\n"); print_compiled_features(); + fprintf(stderr, "---\n"); +#endif fprintf(stderr, "> program: %s (path lookup: " #if FEATURE_HAS_FLAG(NO_SEARCH_PATH)