From 0378d48264897326504747e5d542f5f9d04f560e Mon Sep 17 00:00:00 2001 From: Moe-hacker Date: Tue, 11 Nov 2025 23:59:40 +0800 Subject: [PATCH 1/5] non: sync catsh update --- src/catsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/catsh b/src/catsh index 6e0f945..10cd136 160000 --- a/src/catsh +++ b/src/catsh @@ -1 +1 @@ -Subproject commit 6e0f945034e769d587b6d475f0e59c7c9c2c8c5b +Subproject commit 10cd1368bbd1bd5b34214b05114fee9aeaba8b11 From 9516e70367d99410c16b4400730a9c5145d66509 Mon Sep 17 00:00:00 2001 From: Moe-hacker Date: Thu, 13 Nov 2025 22:34:32 +0800 Subject: [PATCH 2/5] feat: add easteregg --- Makefile | 4 +- build.c | 7 +++ src/easteregg/daijin.c | 108 +++++++++++++++++++++++++++++++++++++++++ src/easteregg/daijin.h | 27 +++++++++++ src/include/rurima.h | 1 + src/main.c | 4 ++ 6 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 src/easteregg/daijin.c create mode 100644 src/easteregg/daijin.h diff --git a/Makefile b/Makefile index 175d1dd..ef67188 100644 --- a/Makefile +++ b/Makefile @@ -41,14 +41,14 @@ CLEAN_LOG = @printf ' $(CCCOLOR)CLEAN$(ENDCOLOR) $(BINCOLOR)%b$(ENDCOLOR)\n' STRIP = strip # Formater. FORMATER = clang-format -i -SRC = src/*.c +SRC = src/*.c src/easteregg/*.c HEADER = src/include/*.h # Checker. CHECKER = clang-tidy CHECKER_FLAGS = --checks=*,-clang-analyzer-security.insecureAPI.strcpy,-altera-unroll-loops,-cert-err33-c,-concurrency-mt-unsafe,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,-readability-function-cognitive-complexity,-cppcoreguidelines-avoid-magic-numbers,-readability-magic-numbers,-bugprone-easily-swappable-parameters,-cert-err34-c,-misc-include-cleaner,-readability-identifier-length,-bugprone-signal-handler,-cert-msc54-cpp,-cert-sig30-c,-altera-id-dependent-backward-branch,-bugprone-suspicious-realloc-usage,-hicpp-signed-bitwise,-clang-analyzer-security.insecureAPI.UncheckedReturn -include config.mk # Target. -objects = catsh/src/catsh.o net.o checkdep.o dockerhub.o exec.o info.o lxcmirror.o shared.o signal.o archive.o subcommand.o main.o ruri/src/easteregg/action.o ruri/src/easteregg/nekofeng.o ruri/src/easteregg/layer.o ruri/src/easteregg/typewriter.o ruri/src/caplist.o ruri/src/chroot.o ruri/src/cprintf.o ruri/src/info.o ruri/src/rurienv.o ruri/src/rurifetch.o ruri/src/seccomp.o ruri/src/signal.o ruri/src/umount.o ruri/src/unshare.o ruri/src/rootless.o ruri/src/mount.o ruri/src/k2v.o ruri/src/elf-magic.o ruri/src/config.o ruri/src/cgroup.o ruri/src/passwd.o ruri/src/ps.o ruri/src/ruri.o +objects = easteregg/daijin.o catsh/src/catsh.o net.o checkdep.o dockerhub.o exec.o info.o lxcmirror.o shared.o signal.o archive.o subcommand.o main.o ruri/src/easteregg/action.o ruri/src/easteregg/nekofeng.o ruri/src/easteregg/layer.o ruri/src/easteregg/typewriter.o ruri/src/caplist.o ruri/src/chroot.o ruri/src/cprintf.o ruri/src/info.o ruri/src/rurienv.o ruri/src/rurifetch.o ruri/src/seccomp.o ruri/src/signal.o ruri/src/umount.o ruri/src/unshare.o ruri/src/rootless.o ruri/src/mount.o ruri/src/k2v.o ruri/src/elf-magic.o ruri/src/config.o ruri/src/cgroup.o ruri/src/passwd.o ruri/src/ps.o ruri/src/ruri.o O = out BIN_TARGET = rurima .NOTPARALLEL: diff --git a/build.c b/build.c index 47fd17f..802453f 100644 --- a/build.c +++ b/build.c @@ -659,8 +659,15 @@ void build() for (int i = 0; catsh_files && catsh_files[i] != NULL; i++) { add_args(&files, catsh_files[i]); } + char easteregg_src_rma[PATH_MAX]; + sprintf(easteregg_src_rma, "%s/easteregg", SRC_DIR); + char **easteregg_rma_files = find_file(easteregg_src_rma, ".c", NULL); + for (int i = 0; easteregg_rma_files && easteregg_rma_files[i] != NULL; i++) { + add_args(&files, easteregg_rma_files[i]); + } compile_files_parallel(files, JOBS); free_args(easteregg_files); + free_args(easteregg_rma_files); free_args(catsh_files); free_args(files); // Link diff --git a/src/easteregg/daijin.c b/src/easteregg/daijin.c new file mode 100644 index 0000000..33cd2c8 --- /dev/null +++ b/src/easteregg/daijin.c @@ -0,0 +1,108 @@ +#include "daijin.h" +// NOLINTNEXTLINE +static short x_win, y_win; +static size_t strlen_char32_rma(const char32_t *_Nonnull str) +{ + size_t len = 0; + // clang-format off + while (str[len] != U'\0') { + len++; + } + // clang-format on + return len; +} +static void print_art(int x, bool clear) +{ + // clang-format off + char32_t art[][128] = { + U" ⣀⠤⠤⠤⠤⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀", + U"⣰⠋⠁⠀⠀⠀⠀⠀⠈⠲⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀", + U"⢯⣀⣀⣀⡀⠀⠀⠀⠀⠀⠈⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⢀⠀⠀⠀⠀⠀⠀⠀", + U"⠀⠀⠠⣏⠀⡀⠀⢀⡀⠀⠀⠈⡆⠀⠀⠀⠀⠀⠀⢀⣀⠤⠔⠂⠁⠀⠀⠀⠀⠉⠰⢄⠀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠈⠉⠒⢌⢳⠀⠀⢹⠀⠀⠀⢞⠩⠃⣀⠖⠂⠀⠀⠀⠀⠀⡴⣧⡒⢤⡀⠱⡄⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠈⣦⡇⠀⢸⠀⠀⠀⢈⡶⠚⠁⣀⠀⠀⠀⠀⠀⠀⡇⠈⠿⣷⣿⣄⠙⣦⡄", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⣼⣀⣠⠔⣁⣠⣴⣾⠀⠀⠀⠀⠀⠀⠀⠱⡀⠤⠘⠿⡿⠁⠈⣴", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡆⠀⣿⣿⣿⢿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠉⠒⠒⠉⠀⠀⠀⢺", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⢰⣏⠊⢕⡒⠾⡯⣭⣽⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⡿⠀⣼⠈⠀⠀⠈⠉⠙⠋⠋⡇⠔⠁⠀⠀⠀⠀⠀⡀⠀⢠⣀⣤⠾⠁⠀", + U" ⢠⡇⠀⠏⠀⠀⠀⠀⠀⠀⠀⠀⢙⠦⠒⠒⢺⣁⠤⠊⠧⠔⢡⡟⠁⠀⠀ ", + U"⠀⠀⠀⠀⠀⠀⠀⠀⣸⠂⢸⡀⠀⠀⠀⠀⠀⣀⠤⠄⠛⠂⠀⠐⠊⠁⠀⠀⠀⠀⠈⣣⠀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⡟⠀⢸⠀⠀⠀⠀⢠⣞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⡀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠸⡄⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡏⠀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠸⠀⠀⢱⡀⠀⢰⡇⠀⠀⠀⠀⠀⢠⣀⠀⠀⠀⠀⠀⢠⠀⢹⠀⠀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣕⣊⠹⢆⣼⡧⡀⠀⠀⠀⠀⠀⠳⢨⠀⠀⠀⠀⡆⠀⣿⠀⠀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠪⢗⢠⠀⠳⡌⠒⠀⠀⠀⠀⠀⠀⡆⠀⠀⢰⠁⠈⠇⠀⠀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠁⠓⢿⣤⣀⠀⠀⠀⠀⠀⣇⠀⠀⣸⠈⠉⢳⠀⠀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠶⢤⣄⡀⠀⢀⣸⡄⠀⣠⣱⡼⠟⠀⠀⠀⠀⠀", + U"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠈⠑⠋⠉⠁⠀⠀⠀⠀⠀⠀"}; + // clang-format on + size_t lines = sizeof(art) / sizeof(art[0]); + for (short i = 0; i < y_win - lines - 1; i++) { + printf("\n"); + } + for (size_t i = 0; i < lines; i++) { + char32_t *line = art[i]; + size_t line_len = strlen_char32_rma(line); + for (short k = 0; k < (x_win - line_len) / 2; k++) { + printf(" "); + } + for (size_t j = 0; j < line_len; j++) { + if ((i + x > (line_len - j) / 3 + 18) && clear) { + printf(" "); + continue; + } + if (!clear) { + if ((i + 10 < x + j / 3) && x > 0) { + printf("\033[0m"); + } else if ((i + 10 < x + j / 3 + 1) && x > 0) { + printf("\033[37m"); + } else { + printf("\033[38;2;254;228;208m"); + } + } + char character[64] = { '\0' }; + mbstate_t state = { 0 }; + size_t len = c32rtomb(character, line[j], &state); + if (len == (size_t)-1) { + perror("c32rtomb"); + return; + } + character[len] = '\0'; + printf("%s", character); + fflush(stdout); + } + printf("\n"); + } + printf("\033[0m"); +} +void rurima_QwQ() +{ + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + x_win = w.ws_col; + y_win = w.ws_row; + if (x_win < 60 || y_win < 30) { + fprintf(stderr, "Please resize your terminal to at least 60x30 and try again.\n"); + return; + } + printf("\033[?25l"); + printf("\033[?1049h"); + setlocale(LC_CTYPE, ""); + printf("\033[H\033[2J"); + print_art(0, false); + sleep(2); + for (int i = 0; i < 30; i++) { + printf("\033[H\033[2J"); + print_art(i, false); + usleep(100000); + } + sleep(2); + for (int i = 0; i < 30; i++) { + printf("\033[H\033[2J"); + print_art(i, true); + usleep(50000); + } + printf("\033[H\033[2J"); + printf("\033[?1049l"); + printf("\033[?25h"); +} \ No newline at end of file diff --git a/src/easteregg/daijin.h b/src/easteregg/daijin.h new file mode 100644 index 0000000..baa7afe --- /dev/null +++ b/src/easteregg/daijin.h @@ -0,0 +1,27 @@ +// NOLINTBEGIN +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// This program should be compiled with -lpthread. +#include +#ifndef _Nullable +#define _Nullable +#endif +#ifndef _Nonnull +#define _Nonnull +#endif +void rurima_QwQ(); +// NOLINTEND \ No newline at end of file diff --git a/src/include/rurima.h b/src/include/rurima.h index 2c9bf7d..7e97dbc 100644 --- a/src/include/rurima.h +++ b/src/include/rurima.h @@ -68,6 +68,7 @@ #include "version.h" #include "../ruri/src/include/ruri.h" #include "../catsh/src/include/catsh.h" +#include "../easteregg/daijin.h" struct RURIMA_CONFIG { char *_Nonnull docker_mirror; char *_Nonnull lxc_mirror; diff --git a/src/main.c b/src/main.c index d5b66fe..fe081a4 100644 --- a/src/main.c +++ b/src/main.c @@ -275,6 +275,10 @@ int main(int argc, char **argv) rurima_load_rootfs(argc - i - 1, &argv[i + 1]); return 0; } + if (strcmp(argv[i], "QwQ") == 0) { + rurima_QwQ(); + return 0; + } show_help(); rurima_error("{red}Invalid subcommand `%s`!\n", argv[i]); return 1; From 903979cb6c9fb4133b2a3900c3889557ac73f45f Mon Sep 17 00:00:00 2001 From: Moe-hacker Date: Thu, 13 Nov 2025 23:14:25 +0800 Subject: [PATCH 3/5] non: update easteregg --- src/easteregg/daijin.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/easteregg/daijin.c b/src/easteregg/daijin.c index 33cd2c8..dc57ce0 100644 --- a/src/easteregg/daijin.c +++ b/src/easteregg/daijin.c @@ -40,12 +40,14 @@ static void print_art(int x, bool clear) for (short i = 0; i < y_win - lines - 1; i++) { printf("\n"); } + fflush(stdout); for (size_t i = 0; i < lines; i++) { char32_t *line = art[i]; size_t line_len = strlen_char32_rma(line); for (short k = 0; k < (x_win - line_len) / 2; k++) { printf(" "); } + fflush(stdout); for (size_t j = 0; j < line_len; j++) { if ((i + x > (line_len - j) / 3 + 18) && clear) { printf(" "); @@ -59,6 +61,7 @@ static void print_art(int x, bool clear) } else { printf("\033[38;2;254;228;208m"); } + fflush(stdout); } char character[64] = { '\0' }; mbstate_t state = { 0 }; @@ -74,6 +77,7 @@ static void print_art(int x, bool clear) printf("\n"); } printf("\033[0m"); + fflush(stdout); } void rurima_QwQ() { From f35b90ffcb6c77465a15983114c7194d59c8dd55 Mon Sep 17 00:00:00 2001 From: Moe-hacker Date: Thu, 13 Nov 2025 23:16:09 +0800 Subject: [PATCH 4/5] non: update easteregg --- src/easteregg/daijin.c | 31 ++++++++++++++++++++++++++++++- src/easteregg/daijin.h | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/easteregg/daijin.c b/src/easteregg/daijin.c index dc57ce0..fb130d5 100644 --- a/src/easteregg/daijin.c +++ b/src/easteregg/daijin.c @@ -1,3 +1,32 @@ +// SPDX-License-Identifier: MIT +/* + * + * This file is part of rurima, with ABSOLUTELY NO WARRANTY. + * + * MIT License + * + * Copyright (c) 2025 Moe-hacker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * + */ #include "daijin.h" // NOLINTNEXTLINE static short x_win, y_win; @@ -79,7 +108,7 @@ static void print_art(int x, bool clear) printf("\033[0m"); fflush(stdout); } -void rurima_QwQ() +void rurima_QwQ(void) { struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); diff --git a/src/easteregg/daijin.h b/src/easteregg/daijin.h index baa7afe..d5a50d5 100644 --- a/src/easteregg/daijin.h +++ b/src/easteregg/daijin.h @@ -1,4 +1,33 @@ -// NOLINTBEGIN +// SPDX-License-Identifier: MIT +/* + * + * This file is part of rurima, with ABSOLUTELY NO WARRANTY. + * + * MIT License + * + * Copyright (c) 2025 Moe-hacker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * + */ +// NOLINTERNEXTLINE #define _GNU_SOURCE #include #include @@ -23,5 +52,4 @@ #ifndef _Nonnull #define _Nonnull #endif -void rurima_QwQ(); -// NOLINTEND \ No newline at end of file +void rurima_QwQ(void); \ No newline at end of file From a28d32f0e0ce2a7880b597ddefa907fe6a8ff81d Mon Sep 17 00:00:00 2001 From: Moe-hacker Date: Thu, 13 Nov 2025 23:39:52 +0800 Subject: [PATCH 5/5] non: update easteregg --- src/easteregg/daijin.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/easteregg/daijin.c b/src/easteregg/daijin.c index fb130d5..049ed53 100644 --- a/src/easteregg/daijin.c +++ b/src/easteregg/daijin.c @@ -126,12 +126,14 @@ void rurima_QwQ(void) sleep(2); for (int i = 0; i < 30; i++) { printf("\033[H\033[2J"); + fflush(stdout); print_art(i, false); usleep(100000); } sleep(2); for (int i = 0; i < 30; i++) { printf("\033[H\033[2J"); + fflush(stdout); print_art(i, true); usleep(50000); }