mount, rc, ls, uname fix: add t,p,S flag

This commit is contained in:
Your Name 2023-12-23 16:45:31 +03:00
parent 7a64d6406b
commit c01af93635
7 changed files with 93 additions and 42 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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:

View File

@ -6,7 +6,6 @@
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#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;

View File

@ -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();
}