diff --git a/config.h b/config.h index 8f3075d..75c5e0e 100644 --- a/config.h +++ b/config.h @@ -16,6 +16,7 @@ /* mount config */ #define MOUNT_CFG "/etc/fstab" #define MOUNT_DEF_FS "ext4" +#define MOUNT_LIST "/proc/mounts" /* nologin sleep */ #define NOLOGIN_SLEEP 60 @@ -27,9 +28,6 @@ #define LS_FIFO_COLOR LS_LINK_COLOR #define LS_EXE_COLOR "\033[1;32m" -/* RunComm prompt */ -#define RC_PS "> " - /* Max args (xargs) */ #define NARGS 1024 diff --git a/configs/fstab b/configs/fstab index 7173cba..c9992e5 100644 --- a/configs/fstab +++ b/configs/fstab @@ -1,3 +1,4 @@ #Example -#[SRC] [DST] [FS TYPE] [OPTIONS] +#[SRC] [DST] [FS TYPE] [OPTIONS. Default: default] /dev/sda1 /boot ext4 rw +/dev/disk/by-uuid/disk-uuid-12dfg /usr f2fs diff --git a/include/libmu/get_stat.h b/include/libmu/get_stat.h index 75a56e0..82921f6 100644 --- a/include/libmu/get_stat.h +++ b/include/libmu/get_stat.h @@ -9,7 +9,7 @@ int mu_get_stat(const char *prog_name, const char *path, struct stat *stat_path) { if (stat(path, stat_path)) { if (prog_name != NULL) - fprintf(stderr, "%s: unable to stat %s: %s\n", prog_name, path, strerror(errno)); + fprintf(stderr, "%s: %s: %s\n", prog_name, path, strerror(errno)); return 1; } @@ -20,7 +20,7 @@ int mu_get_stat(const char *prog_name, const char *path, struct stat *stat_path) int mu_get_lstat(const char *prog_name, const char *path, struct stat *stat_path) { if (lstat(path, stat_path)) { if (prog_name != NULL) - fprintf(stderr, "%s: unable to stat %s: %s\n", prog_name, path, strerror(errno)); + fprintf(stderr, "%s: %s: %s\n", prog_name, path, strerror(errno)); return 1; } diff --git a/src/coreutils/ls/ls.c b/src/coreutils/ls/ls.c index 81797b7..e90a765 100644 --- a/src/coreutils/ls/ls.c +++ b/src/coreutils/ls/ls.c @@ -27,6 +27,7 @@ unsigned int L_flag; unsigned int h_flag; unsigned int i_flag; unsigned int p_flag; +int (*sorter)(const void *p1, const void *p2) = NULL; struct d_node { /* basename */ @@ -62,7 +63,7 @@ struct d_node *stat_file(char *filename, int lfile) { return file; } -struct d_node **list(const char *path, size_t *nfiles) { +struct d_node **list(const char *path, size_t *nfiles, int *ret) { DIR *dp = opendir(path); if (dp == NULL) { fprintf(stderr, "ls: %s: %s\n", path, strerror(errno)); @@ -83,6 +84,7 @@ struct d_node **list(const char *path, size_t *nfiles) { cur = stat_file(full_path, 0); if (cur == NULL) { + *ret = 1; free(full_path); continue; } @@ -115,7 +117,7 @@ struct d_node **list(const char *path, size_t *nfiles) { return dir; } -struct d_node **list_one(const char *path) { +struct d_node **list_one(const char *path, int *ret) { struct d_node **dir = malloc(sizeof(struct d_node *)); if (dir == NULL) { fprintf(stderr, "ls: malloc failed\n"); @@ -131,6 +133,7 @@ struct d_node **list_one(const char *path) { dir[0] = stat_file(new_path, 1); if (dir[0] == NULL) { free(dir); + *ret = 1; return NULL; } @@ -150,6 +153,12 @@ void dfree(struct d_node **dir) { free(dir); } +char *GetDate(time_t mtime) { + static char time[100]; + strftime(time, sizeof(time), "%b %d %H:%M", localtime(&mtime)); + return time; +} + /* Print */ int print(const struct d_node *node) { @@ -205,22 +214,16 @@ int print(const struct d_node *node) { printf("%c%c%c", (node->stats.st_mode & S_IRGRP) ? 'r' : '-', (node->stats.st_mode & S_IWOTH) ? 'w' : '-', (node->stats.st_mode & S_IXGRP) ? 'x' : '-'); printf("%c%c%c", (node->stats.st_mode & S_IROTH) ? 'r' : '-', (node->stats.st_mode & S_IWOTH) ? 'w' : '-', (node->stats.st_mode & S_IXOTH) ? 'x' : '-'); - struct tm *tm = localtime(&node->stats.st_mtime); - - char date[14]; - if (!strftime(date, sizeof(date), "%b %d %H:%M", tm)) - return 0; - struct passwd *pw = getpwuid(node->stats.st_uid); struct group *gr = getgrgid(node->stats.st_gid); char *gr_name = (gr != 0) ? gr->gr_name : "nobody"; char *pw_name = (pw != 0) ? pw->pw_name : "nobody"; if (h_flag) - ret += printf(" %s %s %6s %s %s%c", pw_name, gr_name, mu_humansize(node->stats.st_size), date, node->name, (F_flag) ? suf : 0); + ret += printf(" 1 %s %s %6s %s %s%c", pw_name, gr_name, mu_humansize(node->stats.st_size), GetDate(node->stats.st_mtime), node->name, (F_flag) ? suf : 0); else - ret += printf(" %s %s %10jd %s %s%c", pw_name, gr_name, (uintmax_t)node->stats.st_size, date, node->name, (F_flag) ? suf : 0); + ret += printf(" 1 %s %s %10jd %s %s%c", pw_name, gr_name, (uintmax_t)node->stats.st_size, GetDate(node->stats.st_mtime), node->name, (F_flag) ? suf : 0); } if (c_flag && p_flag) @@ -277,25 +280,40 @@ void col_print(struct d_node **node, size_t files, struct winsize w) { } } +/* Sort */ +int sortt(const void *p1, const void *p2) { + return (*(struct d_node **)p2)->stats.st_mtime - (*(struct d_node **)p1)->stats.st_mtime; +} + +int sorts(const void *p1, const void *p2) { + return (*(struct d_node **)p2)->stats.st_size - (*(struct d_node **)p1)->stats.st_size; +} + int ls(const char *dir_name, int label, struct winsize w) { size_t files = 0; + int ret = 0; struct stat sb; if (mu_get_stat("ls", dir_name, &sb)) return 1; + int its_file = 0; struct d_node **dir = NULL; if (S_ISDIR(sb.st_mode) && !d_flag) - dir = list(dir_name, &files); + dir = list(dir_name, &files, &ret); else { - dir = list_one(dir_name); + dir = list_one(dir_name, &ret); + its_file = 1; files++; } if (dir == NULL) return 1; - if ((label || R_flag) && !d_flag) + if (sorter != NULL) + qsort(dir, files, sizeof(struct d_node *), sorter); + + if ((label || R_flag) && !d_flag && !its_file) printf("\n%s:\n", dir_name); /* pipe print */ @@ -316,12 +334,12 @@ int ls(const char *dir_name, int label, struct winsize w) { ls(dir[i]->full_name, 1, w); dfree(dir); - return 0; + return ret; } int main(int argc, char **argv) { int opt; - while ((opt = getopt(argc, argv, "1alFcRdLhi")) != -1) { + while ((opt = getopt(argc, argv, "1alFcRdLhitS")) != -1) { switch (opt) { case '1': O_flag = 1; @@ -365,8 +383,16 @@ int main(int argc, char **argv) { i_flag = 1; break; + case 't': + sorter = sortt; + break; + + case 'S': + sorter = sorts; + break; + default: - printf("ls [dir1 dir2...]\n\t[-a Show hidden files]\n\t[-l Use a long listing format]\n\t[-F Append indicator to names]\n\t[-c Color mode] [-R Recursive]\n\t[-1 One column] [-d Print only dir names]\n\t[-L Follow symlinks]\n\t[-h Sizes in human readable format]\n\t[-i Listen inodes]\n"); + printf("ls [dir1 dir2...]\n\t[-a Show hidden files]\n\t[-l Use a long listing format]\n\t[-F Append indicator to names]\n\t[-c Color mode] [-R Recursive]\n\t[-1 One column] [-d Print only dir names]\n\t[-L Follow symlinks]\n\t[-h Sizes in human readable format]\n\t[-i Listen inodes] [-t Sort by mtime]\n\t[-S Sort by size]\n"); return 0; } } @@ -380,15 +406,17 @@ int main(int argc, char **argv) { /* Check if programm piped, 1 - false, 0 - true */ p_flag = isatty(STDOUT_FILENO); + int ret = 0; if (argc < 1) - ls(".", 0, w); + return ls(".", 0, w); if (argc == 1) - ls(argv[0], 0, w); + return ls(argv[0], 0, w); else for (int i = 0; i < argc; i++) - ls(argv[i], 1, w); + if (ls(argv[i], 1, w)) + ret = 1; - return 0; + return ret; } diff --git a/src/coreutils/uname/uname.c b/src/coreutils/uname/uname.c index 3eadcc1..4a7a7fd 100644 --- a/src/coreutils/uname/uname.c +++ b/src/coreutils/uname/uname.c @@ -39,7 +39,7 @@ int main(int argc, char **argv) { unsigned int a_flag = 0; int opt; - while ((opt = getopt(argc, argv, "asnrvmo")) != -1) { + while ((opt = getopt(argc, argv, "asnrvmop")) != -1) { switch (opt) { case 'a': a_flag = 1; @@ -71,10 +71,18 @@ int main(int argc, char **argv) { case 'm': printf("%s ", uts.machine); + if (!a_flag) + break; /* fallthrough */ case 'o': printf("%s ", OS_NAME); + if (!a_flag) + break; + /* fallthrough */ + + case 'p': + printf("%s ", uts.machine); break; default: diff --git a/src/shell/rc/rc.c b/src/shell/rc/rc.c index 1055720..46df8a8 100644 --- a/src/shell/rc/rc.c +++ b/src/shell/rc/rc.c @@ -6,7 +6,6 @@ #include #include #include -#include "config.h" #include "unused.h" #define TOK_DELIM " \t\r\n\a" @@ -158,9 +157,7 @@ char **tokenize(char *str) { return tokens; } -char *readline(FILE *fp, char *prompt) { - printf("%s", prompt); - +char *readline(FILE *fp) { char *str = NULL; size_t len = 0; if (getline(&str, &len, fp) == -1) @@ -186,13 +183,8 @@ int main(void) { return 1; } - /* Prompt */ - char *prompt = RC_PS; - if (!isatty(STDIN_FILENO)) - prompt = ""; - while (!exit_flag) { - char *str = readline(stdin, prompt); + char *str = readline(stdin); if (str == NULL) break; diff --git a/src/sysutils-linux/mount/mount.c b/src/sysutils-linux/mount/mount.c index 944ee78..d9f4575 100644 --- a/src/sysutils-linux/mount/mount.c +++ b/src/sysutils-linux/mount/mount.c @@ -16,22 +16,46 @@ int do_mount(const char *src, const char *dst, const char *fs_type, unsigned lon return 0; } -void parse_fstab(void) { +int parse_fstab(void) { FILE *fp = fopen(MOUNT_CFG, "r"); if (fp == NULL) { fprintf(stderr, "mount: %s\n", strerror(errno)); - exit(1); + return 1; } char *buf = NULL; size_t len = 0; + int ret = 0; while (getline(&buf, &len, fp) != EOF) { if (buf[0] == '#') continue; + +// unsigned long opts = mu_parse_opts(opt); +// if (do_mount(disk, node, fs_type, opts)) +// ret = 1; } free(buf); + fclose(fp); + return ret; +} + +int print_mounts(void) { + FILE *fp = fopen(MOUNT_LIST, "r"); + if (fp == NULL) { + fprintf(stderr, "mount: %s\n", strerror(errno)); + return 1; + } + + char *buf = NULL; + size_t len = 0; + while (getline(&buf, &len, fp) != EOF) + printf("%s", buf); + + free(buf); + fclose(fp); + return 0; } void print_opts(void) { @@ -55,8 +79,7 @@ int main(int argc, char **argv) { while ((opt = getopt(argc, argv, "at:o:")) != -1) { switch (opt) { case 'a': - parse_fstab(); - break; + return parse_fstab(); case 't': fs_type = optarg; @@ -82,5 +105,6 @@ int main(int argc, char **argv) { else if (argc == 1) return do_mount(NULL, argv[0], fs_type, mode); - return 0; + else + return print_mounts(); }