mount, rc, ls, uname fix: add t,p,S flag
This commit is contained in:
parent
7a64d6406b
commit
c01af93635
4
config.h
4
config.h
|
@ -16,6 +16,7 @@
|
||||||
/* mount config */
|
/* mount config */
|
||||||
#define MOUNT_CFG "/etc/fstab"
|
#define MOUNT_CFG "/etc/fstab"
|
||||||
#define MOUNT_DEF_FS "ext4"
|
#define MOUNT_DEF_FS "ext4"
|
||||||
|
#define MOUNT_LIST "/proc/mounts"
|
||||||
|
|
||||||
/* nologin sleep */
|
/* nologin sleep */
|
||||||
#define NOLOGIN_SLEEP 60
|
#define NOLOGIN_SLEEP 60
|
||||||
|
@ -27,9 +28,6 @@
|
||||||
#define LS_FIFO_COLOR LS_LINK_COLOR
|
#define LS_FIFO_COLOR LS_LINK_COLOR
|
||||||
#define LS_EXE_COLOR "\033[1;32m"
|
#define LS_EXE_COLOR "\033[1;32m"
|
||||||
|
|
||||||
/* RunComm prompt */
|
|
||||||
#define RC_PS "> "
|
|
||||||
|
|
||||||
/* Max args (xargs) */
|
/* Max args (xargs) */
|
||||||
#define NARGS 1024
|
#define NARGS 1024
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
#Example
|
#Example
|
||||||
#[SRC] [DST] [FS TYPE] [OPTIONS]
|
#[SRC] [DST] [FS TYPE] [OPTIONS. Default: default]
|
||||||
/dev/sda1 /boot ext4 rw
|
/dev/sda1 /boot ext4 rw
|
||||||
|
/dev/disk/by-uuid/disk-uuid-12dfg /usr f2fs
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
int mu_get_stat(const char *prog_name, const char *path, struct stat *stat_path) {
|
int mu_get_stat(const char *prog_name, const char *path, struct stat *stat_path) {
|
||||||
if (stat(path, stat_path)) {
|
if (stat(path, stat_path)) {
|
||||||
if (prog_name != NULL)
|
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;
|
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) {
|
int mu_get_lstat(const char *prog_name, const char *path, struct stat *stat_path) {
|
||||||
if (lstat(path, stat_path)) {
|
if (lstat(path, stat_path)) {
|
||||||
if (prog_name != NULL)
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ unsigned int L_flag;
|
||||||
unsigned int h_flag;
|
unsigned int h_flag;
|
||||||
unsigned int i_flag;
|
unsigned int i_flag;
|
||||||
unsigned int p_flag;
|
unsigned int p_flag;
|
||||||
|
int (*sorter)(const void *p1, const void *p2) = NULL;
|
||||||
|
|
||||||
struct d_node {
|
struct d_node {
|
||||||
/* basename */
|
/* basename */
|
||||||
|
@ -62,7 +63,7 @@ struct d_node *stat_file(char *filename, int lfile) {
|
||||||
return file;
|
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);
|
DIR *dp = opendir(path);
|
||||||
if (dp == NULL) {
|
if (dp == NULL) {
|
||||||
fprintf(stderr, "ls: %s: %s\n", path, strerror(errno));
|
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);
|
cur = stat_file(full_path, 0);
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
|
*ret = 1;
|
||||||
free(full_path);
|
free(full_path);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -115,7 +117,7 @@ struct d_node **list(const char *path, size_t *nfiles) {
|
||||||
return dir;
|
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 *));
|
struct d_node **dir = malloc(sizeof(struct d_node *));
|
||||||
if (dir == NULL) {
|
if (dir == NULL) {
|
||||||
fprintf(stderr, "ls: malloc failed\n");
|
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);
|
dir[0] = stat_file(new_path, 1);
|
||||||
if (dir[0] == NULL) {
|
if (dir[0] == NULL) {
|
||||||
free(dir);
|
free(dir);
|
||||||
|
*ret = 1;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,6 +153,12 @@ void dfree(struct d_node **dir) {
|
||||||
free(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 */
|
/* Print */
|
||||||
int print(const struct d_node *node) {
|
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_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' : '-');
|
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 passwd *pw = getpwuid(node->stats.st_uid);
|
||||||
struct group *gr = getgrgid(node->stats.st_gid);
|
struct group *gr = getgrgid(node->stats.st_gid);
|
||||||
|
|
||||||
char *gr_name = (gr != 0) ? gr->gr_name : "nobody";
|
char *gr_name = (gr != 0) ? gr->gr_name : "nobody";
|
||||||
char *pw_name = (pw != 0) ? pw->pw_name : "nobody";
|
char *pw_name = (pw != 0) ? pw->pw_name : "nobody";
|
||||||
if (h_flag)
|
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
|
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)
|
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) {
|
int ls(const char *dir_name, int label, struct winsize w) {
|
||||||
size_t files = 0;
|
size_t files = 0;
|
||||||
|
int ret = 0;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
if (mu_get_stat("ls", dir_name, &sb))
|
if (mu_get_stat("ls", dir_name, &sb))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
int its_file = 0;
|
||||||
struct d_node **dir = NULL;
|
struct d_node **dir = NULL;
|
||||||
if (S_ISDIR(sb.st_mode) && !d_flag)
|
if (S_ISDIR(sb.st_mode) && !d_flag)
|
||||||
dir = list(dir_name, &files);
|
dir = list(dir_name, &files, &ret);
|
||||||
|
|
||||||
else {
|
else {
|
||||||
dir = list_one(dir_name);
|
dir = list_one(dir_name, &ret);
|
||||||
|
its_file = 1;
|
||||||
files++;
|
files++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dir == NULL)
|
if (dir == NULL)
|
||||||
return 1;
|
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);
|
printf("\n%s:\n", dir_name);
|
||||||
|
|
||||||
/* pipe print */
|
/* pipe print */
|
||||||
|
@ -316,12 +334,12 @@ int ls(const char *dir_name, int label, struct winsize w) {
|
||||||
ls(dir[i]->full_name, 1, w);
|
ls(dir[i]->full_name, 1, w);
|
||||||
|
|
||||||
dfree(dir);
|
dfree(dir);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
int opt;
|
int opt;
|
||||||
while ((opt = getopt(argc, argv, "1alFcRdLhi")) != -1) {
|
while ((opt = getopt(argc, argv, "1alFcRdLhitS")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case '1':
|
case '1':
|
||||||
O_flag = 1;
|
O_flag = 1;
|
||||||
|
@ -365,8 +383,16 @@ int main(int argc, char **argv) {
|
||||||
i_flag = 1;
|
i_flag = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 't':
|
||||||
|
sorter = sortt;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'S':
|
||||||
|
sorter = sorts;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,15 +406,17 @@ int main(int argc, char **argv) {
|
||||||
/* Check if programm piped, 1 - false, 0 - true */
|
/* Check if programm piped, 1 - false, 0 - true */
|
||||||
p_flag = isatty(STDOUT_FILENO);
|
p_flag = isatty(STDOUT_FILENO);
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
ls(".", 0, w);
|
return ls(".", 0, w);
|
||||||
|
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
ls(argv[0], 0, w);
|
return ls(argv[0], 0, w);
|
||||||
|
|
||||||
else
|
else
|
||||||
for (int i = 0; i < argc; i++)
|
for (int i = 0; i < argc; i++)
|
||||||
ls(argv[i], 1, w);
|
if (ls(argv[i], 1, w))
|
||||||
|
ret = 1;
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ int main(int argc, char **argv) {
|
||||||
unsigned int a_flag = 0;
|
unsigned int a_flag = 0;
|
||||||
|
|
||||||
int opt;
|
int opt;
|
||||||
while ((opt = getopt(argc, argv, "asnrvmo")) != -1) {
|
while ((opt = getopt(argc, argv, "asnrvmop")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'a':
|
case 'a':
|
||||||
a_flag = 1;
|
a_flag = 1;
|
||||||
|
@ -71,10 +71,18 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
printf("%s ", uts.machine);
|
printf("%s ", uts.machine);
|
||||||
|
if (!a_flag)
|
||||||
|
break;
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
|
|
||||||
case 'o':
|
case 'o':
|
||||||
printf("%s ", OS_NAME);
|
printf("%s ", OS_NAME);
|
||||||
|
if (!a_flag)
|
||||||
|
break;
|
||||||
|
/* fallthrough */
|
||||||
|
|
||||||
|
case 'p':
|
||||||
|
printf("%s ", uts.machine);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include "config.h"
|
|
||||||
#include "unused.h"
|
#include "unused.h"
|
||||||
|
|
||||||
#define TOK_DELIM " \t\r\n\a"
|
#define TOK_DELIM " \t\r\n\a"
|
||||||
|
@ -158,9 +157,7 @@ char **tokenize(char *str) {
|
||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *readline(FILE *fp, char *prompt) {
|
char *readline(FILE *fp) {
|
||||||
printf("%s", prompt);
|
|
||||||
|
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
if (getline(&str, &len, fp) == -1)
|
if (getline(&str, &len, fp) == -1)
|
||||||
|
@ -186,13 +183,8 @@ int main(void) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prompt */
|
|
||||||
char *prompt = RC_PS;
|
|
||||||
if (!isatty(STDIN_FILENO))
|
|
||||||
prompt = "";
|
|
||||||
|
|
||||||
while (!exit_flag) {
|
while (!exit_flag) {
|
||||||
char *str = readline(stdin, prompt);
|
char *str = readline(stdin);
|
||||||
if (str == NULL)
|
if (str == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -16,22 +16,46 @@ int do_mount(const char *src, const char *dst, const char *fs_type, unsigned lon
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_fstab(void) {
|
int parse_fstab(void) {
|
||||||
FILE *fp = fopen(MOUNT_CFG, "r");
|
FILE *fp = fopen(MOUNT_CFG, "r");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
fprintf(stderr, "mount: %s\n", strerror(errno));
|
fprintf(stderr, "mount: %s\n", strerror(errno));
|
||||||
exit(1);
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
while (getline(&buf, &len, fp) != EOF) {
|
while (getline(&buf, &len, fp) != EOF) {
|
||||||
if (buf[0] == '#')
|
if (buf[0] == '#')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// unsigned long opts = mu_parse_opts(opt);
|
||||||
|
// if (do_mount(disk, node, fs_type, opts))
|
||||||
|
// ret = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(buf);
|
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) {
|
void print_opts(void) {
|
||||||
|
@ -55,8 +79,7 @@ int main(int argc, char **argv) {
|
||||||
while ((opt = getopt(argc, argv, "at:o:")) != -1) {
|
while ((opt = getopt(argc, argv, "at:o:")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'a':
|
case 'a':
|
||||||
parse_fstab();
|
return parse_fstab();
|
||||||
break;
|
|
||||||
|
|
||||||
case 't':
|
case 't':
|
||||||
fs_type = optarg;
|
fs_type = optarg;
|
||||||
|
@ -82,5 +105,6 @@ int main(int argc, char **argv) {
|
||||||
else if (argc == 1)
|
else if (argc == 1)
|
||||||
return do_mount(NULL, argv[0], fs_type, mode);
|
return do_mount(NULL, argv[0], fs_type, mode);
|
||||||
|
|
||||||
return 0;
|
else
|
||||||
|
return print_mounts();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue