diff --git a/.clang-tidy b/.clang-tidy index a81f57c..7d9c8bd 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -2,6 +2,7 @@ Checks: > clang-analyzer-*, -clang-analyzer-security.insecureAPI.str*, -clang-analyzer-security.insecureAPI.mem*, + -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, bugprone-*, cert-*, modernize-*, diff --git a/Makefile b/Makefile index 24408f3..ac5f7ff 100644 --- a/Makefile +++ b/Makefile @@ -12,10 +12,10 @@ ALLFLAGS=$(CFLAGS) -I$(IDIR) LIBS=-lpam -_DEPS = util.h ui.h config.h desktop.h auth.h efield.h keys.h users.h sessions.h chvt.h macros.h +_DEPS = log.h util.h ui.h config.h desktop.h auth.h efield.h keys.h users.h sessions.h chvt.h macros.h DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) -_OBJ = main.o util.o ui.o config.o desktop.o auth.o efield.o users.o sessions.o chvt.o +_OBJ = main.o log.o util.o ui.o config.o desktop.o auth.o efield.o users.o sessions.o chvt.o OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) $(ODIR)/%.o: $(CDIR)/%.c $(DEPS) diff --git a/include/log.h b/include/log.h new file mode 100644 index 0000000..226b48b --- /dev/null +++ b/include/log.h @@ -0,0 +1,12 @@ +#ifndef LOGH_ +#define LOGH_ + +#include + +void log_init(FILE* fd); +void log_puts(const char* msg); +void log_printf(const char* fmt, ...); +// NOLINTNEXTLINE(readability-identifier-length) +void log_perror(const char* s); + +#endif diff --git a/include/macros.h b/include/macros.h index d8f6882..93344d3 100644 --- a/include/macros.h +++ b/include/macros.h @@ -1,3 +1,6 @@ +#ifndef MACROSH_ +#define MACROSH_ + // Do we just replace the compiler with clang?? #if defined(__clang__) #define NULLABLE _Nullable @@ -16,3 +19,5 @@ #else #define UNULLABLE #endif + +#endif diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..bd473e2 --- /dev/null +++ b/src/log.c @@ -0,0 +1,38 @@ +#include +#include +#include + +#include "log.h" + +static FILE* logger_out = NULL; + +void log_init(FILE* fd) { + if (logger_out) (void)fclose(logger_out); + logger_out = fd; +} + +void log_puts(const char* msg) { + if (!logger_out) return; + (void)fputs(msg, logger_out); +} + +void log_printf(const char* fmt, ...) { + if (!logger_out) return; + + va_list args; + va_start(args, fmt); + + (void)vfprintf(logger_out, fmt, args); + + va_end(args); +} + +// NOLINTNEXTLINE(readability-identifier-length) +void log_perror(const char* s) { + if (!logger_out) return; + + if (s) + (void)fprintf(logger_out, "%s: %s", s, strerror(errno)); + else + (void)fprintf(logger_out, "%s", strerror(errno)); +} diff --git a/src/main.c b/src/main.c index f1a87b1..f060034 100644 --- a/src/main.c +++ b/src/main.c @@ -1,11 +1,13 @@ #include #include +#include #include #include #include #include "chvt.h" #include "config.h" +#include "log.h" #include "sessions.h" #include "ui.h" #include "users.h" @@ -14,6 +16,18 @@ int main(int argc, char* argv[]) { if (argc == 2) chvt_str(argv[1]); + char* log_output = getenv("LIDM_LOG"); + if (log_output) { + FILE* log_fd = fopen(log_output, "w"); + if (!log_fd) { + perror("fopen"); + (void)fputs("failed to open logfile in write mode", stderr); + return -1; + } + + log_init(log_fd); + } + char* conf_override = getenv("LIDM_CONF"); struct config* config = parse_config(conf_override == NULL ? "/etc/lidm.ini" : conf_override);