From 076ec8f540b8c90d66170b0b307dbebc291681b4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 5 Nov 2023 21:42:26 +0300 Subject: [PATCH] dmesg --- builder/builder.c | 12 ++++----- builder/config.h | 4 ++- coreutils/cmp.c | 3 +++ obj/.gitignore | 0 sysutils/dmesg.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 7 deletions(-) delete mode 100644 obj/.gitignore create mode 100644 sysutils/dmesg.c diff --git a/builder/builder.c b/builder/builder.c index d4da446..34010c7 100644 --- a/builder/builder.c +++ b/builder/builder.c @@ -33,6 +33,7 @@ char *MakePath(const char *src, const char *output_dir) { void Compile(const char *src, const char *output_dir) { char *path = MakePath(src, output_dir); + printf("[CC] Building %s -> %s\n", src, path); size_t len = strlen(CC) + strlen(CFLAGS) + strlen(src) + strlen(path) + 7; char *arg = malloc(len + 1); @@ -50,21 +51,20 @@ void Compile(const char *src, const char *output_dir) { } void ListAndCompile(const char *dir, const char *output_dir) { - chdir(dir); - DIR *dp = opendir("."); - if (dp == NULL) { - fprintf(stderr, "builder: %s\n", strerror(errno)); + printf("[CHDIR] %s\n", dir); + if (chdir(dir) < 0) { + fprintf(stderr, "builder: %s: %s\n", dir, strerror(errno)); exit(1); } + DIR *dp = opendir("."); + struct dirent *ep; while ((ep = readdir(dp)) != NULL) { if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, "..")) continue; - printf("[INFO] Building %s\n", ep->d_name); Compile(ep->d_name, output_dir); - } closedir(dp); diff --git a/builder/config.h b/builder/config.h index 7878969..1041f5a 100644 --- a/builder/config.h +++ b/builder/config.h @@ -4,6 +4,8 @@ const char *objects[] = { "console-tools", "coreutils", + "loginutils", + "sysutils", "networking", "procps", "shell" @@ -14,5 +16,5 @@ const char *libs[] = { }; #define CFLAGS "-Wall -Wextra -pedantic -Os -s -I ../libmu" -#define CC "tcc" +#define CC "cc" #endif diff --git a/coreutils/cmp.c b/coreutils/cmp.c index c1af7d9..6073494 100644 --- a/coreutils/cmp.c +++ b/coreutils/cmp.c @@ -77,12 +77,15 @@ int main(const int argc, const char **argv) { switch (argc - i) { case 4: skip2 = parse_int(argv[i + 3]); + /* fallthrough */ case 3: skip1 = parse_int(argv[i + 2]); + /* fallthrough */ case 2: fp2 = file_open(argv[i + 1]); + /* fallthrough */ case 1: fp1 = file_open(argv[i]); diff --git a/obj/.gitignore b/obj/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/sysutils/dmesg.c b/sysutils/dmesg.c new file mode 100644 index 0000000..2bbe110 --- /dev/null +++ b/sysutils/dmesg.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#include +#include +#define BUF_SIZE 8196 + +int main(const int argc, const char **argv) { + unsigned int s_size = 0; + unsigned int n_level = 0; + + int i; + for (i = 1; i < argc; i++) { + if (argv[i][0] != '-') + break; + + else if (!strncmp(argv[i], "-s=", 3)) + s_size = atoi(argv[i] + 3); + + else if (!strncmp(argv[i], "-n=", 3)) + n_level = atoi(argv[i] + 3); + + else if (!strcmp(argv[i], "--help")) { + printf("dmesg [-n=L Set console logging level] [-s=S Buffer Size]\n"); + return 0; + } + } + + /* Setup */ + if (n_level) + if (klogctl(8, NULL, (long)n_level) < 0) { + fprintf(stderr, "dmesg: %s\n", strerror(errno)); + return 1; + } + + if (!s_size) + s_size = klogctl(10, NULL, 0); + + /* Get kernel log */ + char *buf = malloc(s_size + 1); + if (buf == NULL) { + fprintf(stderr, "dmesg: malloc failed\n"); + return 1; + } + + int n = klogctl(3, buf, s_size); + if (n <= 0) { + free(buf); + if (n == 0) + return 0; + + fprintf(stderr, "dmesg: %s\n", strerror(errno)); + return 1; + } + + /* Print */ + write(STDOUT_FILENO, buf, n); + putchar('\n'); + + free(buf); + return 0; +} +