From 4cf81717905e7a4b3a706f650b9fec6df4617ccf Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 May 2024 13:29:18 +0300 Subject: [PATCH] fixed --- AUTHORS | 5 -- README.md | 6 +- TODO | 5 ++ config.h | 14 +--- configs/rc.init | 0 configs/rc.poweroff | 3 + src/coreutils/date/date.c | 5 -- src/coreutils/echo/echo.c | 83 ++++++++++---------- src/coreutils/ln/ln.c | 22 ++++-- src/coreutils/ls/ls.c | 2 +- src/coreutils/shred/shred.c | 1 + src/findutils/xargs/xargs.c | 117 +++++++++++++---------------- src/miscutils/spark/build.sh | 0 src/networking/hostname/hostname.c | 5 +- src/procps/ps/ps.c | 1 + 15 files changed, 129 insertions(+), 140 deletions(-) delete mode 100644 AUTHORS mode change 100755 => 100644 configs/rc.init mode change 100755 => 100644 configs/rc.poweroff mode change 100755 => 100644 src/miscutils/spark/build.sh diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index 27c5235..0000000 --- a/AUTHORS +++ /dev/null @@ -1,5 +0,0 @@ -micro-utils: - 8nlight (8nlight @ disroot org) - -Thanks: - builder, echo: Kind_Foxie (fedi: KindFoxie @ lamp leemon network) diff --git a/README.md b/README.md index 47f33c9..e5b2e89 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,4 @@ # micro-utils -Utils with minimal functionality for creating unix-like OS - -Systems using micro-utils: -[PlainOs](https://nlight.dimension.sh) - +Own implementation of *nix utils License: wtfpl diff --git a/TODO b/TODO index 5659025..62133b9 100644 --- a/TODO +++ b/TODO @@ -54,3 +54,8 @@ Findutils: BUGS: ls (unicode strlen) xargs (getopt with glibc) + +FIX: + ps + echo + head diff --git a/config.h b/config.h index 1586e6d..687dfd3 100644 --- a/config.h +++ b/config.h @@ -1,7 +1,7 @@ #ifndef _CONFIG_H #define _CONFIG_H -/* (cat tee wc xargs rev split) */ +/* (cat tee wc xargs rev split) text buffer */ #define BUF_SIZE 2048 /* Random source (shred) */ @@ -34,18 +34,6 @@ char *INIT_START[] = {"/etc/rc.init", NULL}; #define INIT_MSG "Starting micro-init..." #endif -/* Max args (xargs) */ -#ifdef XARGS -#include -#define NARGS ARG_MAX - -/* Arg size (xargs) */ -#define ARG_SIZE 1024 -#endif - -/* Default cmd (xargs) */ -#define ECHO_CMD "echo" - /* Os name for uname */ /* #define OS_NAME "unknow" */ diff --git a/configs/rc.init b/configs/rc.init old mode 100755 new mode 100644 diff --git a/configs/rc.poweroff b/configs/rc.poweroff old mode 100755 new mode 100644 index b1407b2..ce8e6f6 --- a/configs/rc.poweroff +++ b/configs/rc.poweroff @@ -2,6 +2,9 @@ echo "[*] Umounting..." umount -a +echo "[*] Syncing..." +sync + echo "[*] Closing processes..." kill -a -s TERM sleep 5 diff --git a/src/coreutils/date/date.c b/src/coreutils/date/date.c index faf4a31..08d2370 100644 --- a/src/coreutils/date/date.c +++ b/src/coreutils/date/date.c @@ -80,10 +80,6 @@ int main(int argc, char **argv) { default: printf("date [rsdu] [+\"fmt\"]\n\t-s DATE Set new date\n\t-d DATE Print new date\n\t-u Work in UTC\n\t-r FILE Display last modification time of FILE\n"); - printf("\nFormats:\n"); - for (size_t i = 0; i < sizeof(fmts) / sizeof(char *); i++) - printf("\t%s\n", fmts[i]); - return 0; } } @@ -111,4 +107,3 @@ int main(int argc, char **argv) { puts(buf); return 0; } - diff --git a/src/coreutils/echo/echo.c b/src/coreutils/echo/echo.c index 186e44e..c34eed0 100644 --- a/src/coreutils/echo/echo.c +++ b/src/coreutils/echo/echo.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -7,59 +8,54 @@ char n_flag = 0; char e_flag = 0; void format(char *str) { - if (e_flag) { - for (size_t i = 0; i < strlen(str); i++) { - unsigned int c = str[i]; - if (c == '\\') { - switch (str[i + 1]) { - case 'a': - c = '\a'; - break; + for (size_t i = 0; i < strlen(str); i++) { + unsigned int c = str[i]; + if (c == '\\') { + switch (str[i + 1]) { + case 'a': + c = '\a'; + break; - case 'n': - c = '\n'; - break; + case 'n': + c = '\n'; + break; - case 't': - c = '\t'; - break; + case 't': + c = '\t'; + break; - case 'c': - exit(0); + case 'c': + exit(0); - case 'v': - c = '\v'; - break; + case 'v': + c = '\v'; + break; - case 'r': - c = '\r'; - break; + case 'r': + c = '\r'; + break; - case 'f': - c = '\f'; - break; + case 'f': + c = '\f'; + break; - case 'e': - c = '\033'; - break; + case 'e': + c = '\033'; + break; - case 'b': - c = '\b'; - break; + case 'b': + c = '\b'; + break; - default: - c = '\\'; - } - - i++; + default: + c = '\\'; } - putchar(c); + i++; } - } - else - fputs(str, stdout); + putchar(c); + } } int main(int argc, char **argv) { @@ -81,7 +77,12 @@ int main(int argc, char **argv) { } for (int i = 0; i < argc; i++) { - format(argv[i]); + if (e_flag) + format(argv[i]); + + else + fputs(argv[i], stdout); + if (i < argc - 1) putchar(' '); } diff --git a/src/coreutils/ln/ln.c b/src/coreutils/ln/ln.c index 48f8be6..3ad6150 100644 --- a/src/coreutils/ln/ln.c +++ b/src/coreutils/ln/ln.c @@ -6,21 +6,29 @@ char s_flag; char f_flag; +char v_flag; int ln(const char *src, const char *dst) { if (f_flag) - unlink(dst); + if (unlink(dst) && v_flag) + fprintf(stderr, "ln: removed %s\n", dst); + int ret = 0; if (s_flag) - return symlink(src, dst); + ret = symlink(src, dst); else - return link(src, dst); + ret = link(src, dst); + + if (!ret && v_flag) + fprintf(stderr, "ln: linked %s to %s\n", src, dst); + + return ret; } int main(int argc, char **argv) { int opt; - while ((opt = getopt(argc, argv, "sf")) != -1) { + while ((opt = getopt(argc, argv, "sfv")) != -1) { switch (opt) { case 's': s_flag = 1; @@ -30,8 +38,12 @@ int main(int argc, char **argv) { f_flag = 1; break; + case 'v': + v_flag = 1; + break; + default: - printf("ln [sf] [src] [dst]\n\t-f Force\n\t-s Symbolic\n"); + printf("ln [sfv] [src] [dst]\n\t-f Force\n\t-s Symbolic\n\t-v Verbose\n"); return 0; } } diff --git a/src/coreutils/ls/ls.c b/src/coreutils/ls/ls.c index 56784b0..79a21e7 100644 --- a/src/coreutils/ls/ls.c +++ b/src/coreutils/ls/ls.c @@ -332,7 +332,7 @@ int ls(const char *dir_name, int label, struct winsize w) { qsort(dir, files, sizeof(struct d_node *), sorter); if ((label || R_flag) && !d_flag && !its_file) - printf("%s:\n", dir_name); + printf("\n%s:\n", dir_name); /* pipe print */ if (!p_flag || l_flag || O_flag) { diff --git a/src/coreutils/shred/shred.c b/src/coreutils/shred/shred.c index 63a2659..3706365 100644 --- a/src/coreutils/shred/shred.c +++ b/src/coreutils/shred/shred.c @@ -14,6 +14,7 @@ char z_flag; int n_loops = 3; int shred(int rand_fd, int fd) { + /* Get size */ off_t size = lseek(fd, 0, SEEK_END); if (size <= 0) diff --git a/src/findutils/xargs/xargs.c b/src/findutils/xargs/xargs.c index 100153c..c6594c8 100644 --- a/src/findutils/xargs/xargs.c +++ b/src/findutils/xargs/xargs.c @@ -1,4 +1,3 @@ -#define XARGS #include #include #include @@ -6,8 +5,11 @@ #include #include #include +#include #include -#include "config.h" + +int args; +char *cmd[ARG_MAX + 1]; char *I_flag; char t_flag; @@ -15,16 +17,6 @@ char r_flag; char nl_flag; int n_flag; int s_flag; -int P_flag; -int P_flag2; - -int args; -char *cmd[NARGS + 1]; - -enum { - NONE, - QUOTE -}; enum { NORMAL, @@ -33,6 +25,11 @@ enum { I_FLAG }; +enum { + NONE, + QUOTE +}; + void clear_cmd(void) { for (int i = 0; i < args; i++) if (cmd[i] != NULL) @@ -42,10 +39,10 @@ void clear_cmd(void) { } int add_arg(const char *str, int chars, int flag) { - if (args >= NARGS) + if (args >= ARG_MAX) return ERROR; - else if (n_flag > 0 && args > n_flag) + else if (n_flag > 0 && args > n_flag && I_flag == NULL) return ERROR; else if (s_flag > 0 && chars > s_flag) @@ -53,7 +50,7 @@ int add_arg(const char *str, int chars, int flag) { if (!flag && I_flag) { for (int i = 0; i < args; i++) - if (!strcmp(cmd[i], I_flag)) + if (strstr(cmd[i], I_flag)) cmd[i] = strdup(str); return I_FLAG; @@ -73,50 +70,60 @@ int is_correct(char c) { return isspace(c); } -int stdin_read(void) { - char arg[ARG_SIZE + 1]; - - /* Word start */ - char *p = arg; +int xargs(void) { + size_t arg_size = 0; + char *arg = malloc(1); + if (arg == NULL) { + fprintf(stderr, "xargs: malloc failed\n"); + return ERROR; + } + size_t index = 0; + int flag = NONE; + int ret = NORMAL; int chars = 0; int args_passed = 0; - int ret = NORMAL; - char flag = NONE; while (1) { int c = getchar(); if (c == EOF) { if (flag == QUOTE) { - fprintf(stderr, "xargs: unterminated double quote\n"); + fprintf(stderr, "xargs: unterminated quote\n"); ret = ERROR; } - if (p != arg) + if (index != arg_size) goto PUSH; ret = CEOF; break; } - /* Place str */ - else if ((flag == NONE && is_correct(c) && strlen(arg) > 0) || p == arg + sizeof(arg) - 1) { + if (flag == NONE && is_correct(c) && strlen(arg) > 0) { + int r = 0; PUSH: - *p = '\0'; - p = arg; - - int r = add_arg(arg, chars, 0); + r = add_arg(arg, chars, 0); if (r == ERROR) break; - else if (r == I_FLAG) + else if (r == I_FLAG) { + free(arg); return NORMAL; + } + index = 0; + arg_size = 0; args_passed++; + + free(arg); + arg = malloc(1); + if (arg == NULL) { + fprintf(stderr, "xargs: malloc failed\n"); + return ERROR; + } } - /* Add char to str */ else { if (c == '"' || c == '\'') { if (flag == QUOTE) @@ -128,11 +135,17 @@ PUSH: continue; } - *p = c; - if (p + 1 == arg + sizeof(arg)) - continue; + arg = realloc(arg, (arg_size++) + 1); + if (arg == NULL) { + fprintf(stderr, "xargs: realloc failed\n"); + return ERROR; + } + + arg[index] = c; + + index++; + arg[index] = '\0'; - p++; chars++; } } @@ -140,17 +153,11 @@ PUSH: if (args_passed == 0) ret = CEOF; + free(arg); return ret; } -/* Run */ -void sig_handler(int sig) { - if (sig == SIGUSR1) - if (P_flag2) - P_flag2--; -} - -int run(void) { +int spawn(void) { if (t_flag) { for (int i = 0; i < args; i++) fprintf(stderr, "%s ", cmd[i]); @@ -177,13 +184,6 @@ int run(void) { return status; } -int spawn(void) { - if (P_flag == 0) - return run(); - - return 0; -} - void check(int val) { if (val <= 0) { fprintf(stderr, "xargs: invalid number: %s\n", optarg); @@ -192,8 +192,6 @@ void check(int val) { } int main(int argc, char **argv) { - signal(SIGUSR1, sig_handler); - int opt; while ((opt = getopt(argc, argv, "tn:s:rP:0I:")) != -1) { switch (opt) { @@ -215,11 +213,6 @@ int main(int argc, char **argv) { r_flag = 1; break; - case 'P': - P_flag = atoi(optarg); - check(P_flag); - break; - case '0': nl_flag = 1; break; @@ -229,7 +222,7 @@ int main(int argc, char **argv) { break; default: - printf("xargs [tnsrP0I] [cmd [arg1] [arg2...]\n\t-t Print the command before start\n\t-n Pass no more than N args\n\t-r Don't run command if input is empty\n\t-s Pass command line of no more than N bytes\n\t-P Run up to N PROGs in parallel\n\t-0 NUL terminated input\n\t-I STR Replace STR within PROG ARGS with input line\n"); + printf("xargs [tnsrP0I] [cmd [arg1] [arg2...]\n\t-t Print the command before start\n\t-n Pass no more than N args\n\t-r Don't run command if input is empty\n\t-s Pass command line of no more than N bytes\n\t-0 NUL terminated input\n\t-I STR Replace STR within PROG ARGS with input line\n"); return 0; } } @@ -248,10 +241,9 @@ int main(int argc, char **argv) { } else - add_arg(ECHO_CMD, 0, 1); + add_arg("echo", 0, 1); - /* Stdin */ - int stdin_stat = stdin_read(); + int stdin_stat = xargs(); /* Check NULL */ for (int i = 0; i < args; i++) { @@ -271,7 +263,6 @@ int main(int argc, char **argv) { else if (stdin_stat == NORMAL) ret = spawn(); - /* Clear */ clear_cmd(); if (stdin_stat) break; diff --git a/src/miscutils/spark/build.sh b/src/miscutils/spark/build.sh old mode 100755 new mode 100644 diff --git a/src/networking/hostname/hostname.c b/src/networking/hostname/hostname.c index 48bc882..b52be52 100644 --- a/src/networking/hostname/hostname.c +++ b/src/networking/hostname/hostname.c @@ -26,8 +26,9 @@ int main(int argc, char **argv) { int config = 0; int opt; - while ((opt = getopt(argc, argv, "c:")) != -1) { + while ((opt = getopt(argc, argv, "c:F:")) != -1) { switch (opt) { + case 'F': case 'c': readcfg(optarg, hostname, sizeof(hostname)); @@ -36,7 +37,7 @@ int main(int argc, char **argv) { break; default: - printf("hostname [c] [hostname]\n\t-c PATH Use config file\n"); + printf("hostname [cF] [hostname]\n\t-c/-F PATH Use config file\n"); return 0; } } diff --git a/src/procps/ps/ps.c b/src/procps/ps/ps.c index 6044173..cc0b88d 100644 --- a/src/procps/ps/ps.c +++ b/src/procps/ps/ps.c @@ -4,6 +4,7 @@ #include #include #include +#include #include int open_file(const char *path) {