diff --git a/TODO b/TODO index 6ccbf8c..7ee3feb 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ With "micro-" prefix *Todo: -*du - b tail expr uniq diff --git a/src/coreutils/basename/basename.c b/src/coreutils/basename/basename.c index 80387b8..ecb7958 100644 --- a/src/coreutils/basename/basename.c +++ b/src/coreutils/basename/basename.c @@ -8,7 +8,7 @@ int main(int argc, char **argv) { int opt; while ((opt = getopt(argc, argv, "")) != -1) { - fprintf(stderr, "basename [var1] [suffix]\n"); + fprintf(stderr, "basename [text] [suffix]\n"); return 1; } diff --git a/src/coreutils/cat/cat.c b/src/coreutils/cat/cat.c index 33da0b5..2c58ae4 100644 --- a/src/coreutils/cat/cat.c +++ b/src/coreutils/cat/cat.c @@ -33,11 +33,8 @@ int cat(const char *path) { int main(int argc, char **argv) { int opt; while ((opt = getopt(argc, argv, "")) != -1) { - switch (opt) { - default: - printf("cat [file1 file2...]\n"); - return 0; - } + printf("cat [file1 file2...]\n"); + return 0; } argv += optind; diff --git a/src/coreutils/chgrp/chgrp.c b/src/coreutils/chgrp/chgrp.c index 1f23e59..674321f 100644 --- a/src/coreutils/chgrp/chgrp.c +++ b/src/coreutils/chgrp/chgrp.c @@ -9,10 +9,10 @@ #include "get_stat.h" #include "recurse.h" -unsigned int r_flag; +char r_flag; char *f_flag = "chgrp"; -unsigned int H_flag; -unsigned int v_flag; +char H_flag; +char v_flag; int change(const char *path, void *p) { struct group *grp = (struct group *)p; @@ -56,7 +56,7 @@ int main(int argc, char **argv) { break; default: - printf("chgrp [group] [file1 file2...]\n\t[-H Symbolic link]\n\t[-R Recursive] [-f Silent]\n\t[-v Verbose]\n"); + printf("chgrp [RfHv] [group] [file1 file2...]\n\t-H Symbolic link\n\t-R Recursive\n\t-f Silent\n\t-v Verbose\n"); return 0; } } diff --git a/src/coreutils/chmod/chmod.c b/src/coreutils/chmod/chmod.c index 81b14b7..7bb0c1c 100644 --- a/src/coreutils/chmod/chmod.c +++ b/src/coreutils/chmod/chmod.c @@ -9,10 +9,10 @@ #include "parse_mode.h" #include "recurse.h" -unsigned int r_flag; +char r_flag; char *f_flag = "chmod"; -unsigned int H_flag; -unsigned int v_flag; +char H_flag; +char v_flag; int change(const char *file, void *p) { char *mode_arg = (char *)p; @@ -70,7 +70,7 @@ int main(int argc, char **argv) { break; default: - printf("chmod [ugoa]{+|-}[rwxXst] / [0 - 777] [file1 file2...]\n\t[-H Symbolic link]\n\t[-R Recursive] [-f Silent]\n\t[-v Verbose]\n"); + printf("chmod [RfHv] [ugoa]{+|-}[rwxXst] / [0 - 777] [file1 file2...]\n\t-H Symbolic link\n\t-R Recursive\n\t-f Silent\n\t-v Verbose\n"); return 0; } } diff --git a/src/coreutils/chown/chown.c b/src/coreutils/chown/chown.c index 444b8aa..b7c8d33 100644 --- a/src/coreutils/chown/chown.c +++ b/src/coreutils/chown/chown.c @@ -11,10 +11,10 @@ #include "recurse.h" #include "unused.h" -unsigned int r_flag; +char r_flag; char *f_flag = "chown"; -unsigned int H_flag; -unsigned int v_flag; +char H_flag; +char v_flag; int (*chown_func)(const char *pathname, uid_t owner, gid_t group); long gid; long uid; @@ -38,8 +38,8 @@ int change(const char *path, void *p) { void get_owner(const char *arg) { char *group = strchr(arg, ':'); - unsigned int g_flag = 1; - unsigned int u_flag = 1; + char g_flag = 1; + char u_flag = 1; if (group == arg) u_flag = 0; @@ -99,7 +99,7 @@ int main(int argc, char **argv) { break; default: - printf("chown USER[:[GRP]] [file1 file2...]\n\t[-H Symbolic link]\n\t[-R Recursive] [-f Silent]\n\t[-v Verbose]\n"); + printf("chown [RfHf] USER[:[GRP]] [file1 file2...]\n\t-H Symbolic link\n\t-R Recursive\n\t-f Silent\n\t-v Verbose\n"); return 0; } } diff --git a/src/coreutils/cmp/cmp.c b/src/coreutils/cmp/cmp.c index 9af5fe6..e4c3850 100644 --- a/src/coreutils/cmp/cmp.c +++ b/src/coreutils/cmp/cmp.c @@ -3,7 +3,7 @@ #include #include #include -unsigned int s_flag; +char s_flag; int compare(FILE *fp1, FILE *fp2) { if (fp1 == fp2) @@ -55,16 +55,16 @@ FILE *file_open(const char *path) { } int main(int argc, char **argv) { + int opt; - while ((opt = getopt(argc, argv, "fs")) != -1) { + while ((opt = getopt(argc, argv, "s")) != -1) { switch (opt) { case 's': - case 'f': s_flag = 1; break; default: - printf("cmp file1 file2 [skip1] [skip2]\n\t[-f/-s Silent]\n"); + printf("cmp [s] [file1] [file2] [skip1] [skip2]\n\t-s Silent\n"); return 0; } } diff --git a/src/coreutils/cp/cp.c b/src/coreutils/cp/cp.c index d36fce6..e41db0a 100644 --- a/src/coreutils/cp/cp.c +++ b/src/coreutils/cp/cp.c @@ -11,7 +11,7 @@ #include "get_stat.h" char *f_flag = "cp"; -unsigned int r_flag; +char r_flag; int write_buffer(int mode, int ifd, int ofd, const char *dst) { off_t len = lseek(ifd, 0, SEEK_END); @@ -173,7 +173,7 @@ int main(int argc, char **argv) { break; default: - printf("cp [src1 src2...] [dst]\n\t[-f Silent] [-r Recursive]\n"); + printf("cp [rf] [src1 src2...] [dst]\n\t-f Silent\n\t-r Recursive\n"); return 0; } } diff --git a/src/coreutils/date/date.c b/src/coreutils/date/date.c index 8f74a20..faf4a31 100644 --- a/src/coreutils/date/date.c +++ b/src/coreutils/date/date.c @@ -79,7 +79,7 @@ int main(int argc, char **argv) { break; default: - printf("date [+\"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("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]); diff --git a/src/coreutils/dd/dd.c b/src/coreutils/dd/dd.c index 12dfd2b..a0dcf23 100644 --- a/src/coreutils/dd/dd.c +++ b/src/coreutils/dd/dd.c @@ -108,7 +108,7 @@ int main(int argc, char **argv) { char *val = strchr(arg, '='); if (val == NULL) { - printf("dd\n\t[if=InputFile] [of=OutputFile]\n\t[bs=obs and obs]\n\t[ibs=Input buffer size]\n\t[obs=Output buffer size]\n\t[seek=Skip N obs-sized output blocks]\n\t[skip=Skip N ibs-sized output blocks]\n\t[count=Copy only N input blocks]\n\nN and BYTES may be followed by the following multiplicative\nsuffixes: w=2, b=512, k=1000, K=1024, m=1000*1000,\nM=1024*1024, g=1000*1000*1000, G=1024*1024*1024\n"); + printf("dd\n\tif=InputFile\n\tof=OutputFile\n\tbs=obs and obs\n\tibs=Input buffer size\n\tobs=Output buffer size\n\tseek=Skip N obs-sized output blocks\n\tskip=Skip N ibs-sized output blocks\n\tcount=Copy only N input blocks\n\nN and BYTES may be followed by the following multiplicative\nsuffixes: w=2, b=512, k=1000, K=1024, m=1000*1000,\nM=1024*1024, g=1000*1000*1000, G=1024*1024*1024\n"); return 1; } diff --git a/src/coreutils/df/df.c b/src/coreutils/df/df.c index cfef368..e9e7c4c 100644 --- a/src/coreutils/df/df.c +++ b/src/coreutils/df/df.c @@ -9,8 +9,8 @@ #include "human.h" #include "config.h" -unsigned int a_flag; -unsigned int h_flag; +char a_flag; +char h_flag; off_t block = 1024; void print_human(const char *src, const off_t total, const off_t used, const off_t avail, const off_t capacity, const char *dst) { @@ -44,7 +44,7 @@ int main(int argc, char **argv) { break; default: - printf("df\n\t[-h Human readable (1024)] [-a Show all]\n\t[-H Human readable (1000)]\n"); + printf("df [rHa]\n\t-h Human readable (1024)\n\t-a Show all\n\t-H Human readable (1000)\n"); return 0; } } diff --git a/src/coreutils/du/du.c b/src/coreutils/du/du.c index b5715f3..187e006 100644 --- a/src/coreutils/du/du.c +++ b/src/coreutils/du/du.c @@ -9,10 +9,9 @@ #include "make_path.h" #include "human.h" -unsigned int h_flag; -unsigned int s_flag; -unsigned int c_flag; -unsigned int b_flag; +char h_flag; +char s_flag; +char c_flag; off_t total; void print(off_t size, const char *filename) { @@ -66,7 +65,6 @@ off_t du(const char *path, int recurs_flag) { /* Get file size */ else { sum = sb.st_blocks * 512; - if (c_flag) total += sum; @@ -80,7 +78,7 @@ off_t du(const char *path, int recurs_flag) { int main(int argc, char **argv) { int opt; - while ((opt = getopt(argc, argv, "hsbc")) != -1) { + while ((opt = getopt(argc, argv, "hsc")) != -1) { switch (opt) { case 'h': h_flag = 1; @@ -95,7 +93,7 @@ int main(int argc, char **argv) { break; default: - printf("du [src1 src2...]\n\t[-h Sizes in human readable format]\n\t[-s Display only a total for each argument]\n\t[-c produce a grand total]\n"); + printf("du [hsc] [src1 src2...]\n\t-h Sizes in human readable format\n\t-s Display only a total for each argument\n\t-c produce a grand total\n"); return 0; } } diff --git a/src/coreutils/head/head.c b/src/coreutils/head/head.c index 8fbeea1..9c7d90a 100644 --- a/src/coreutils/head/head.c +++ b/src/coreutils/head/head.c @@ -6,8 +6,8 @@ #include #include "config.h" -unsigned int v_flag; -unsigned int c_flag; +char v_flag; +char c_flag; long parse_long(const char *str) { char *ptr; @@ -60,7 +60,7 @@ int main(int argc, char **argv) { break; default: - printf("head [file1 file2...]\n\t[-n Print N lines] [-c Print N bytes]\n\t[-v Print headers]\n"); + printf("head [ncv] [file1 file2...]\n\t-n Print N lines\n\t-c Print N bytes\n\t-v Print headers\n"); return 0; } } diff --git a/src/coreutils/id/id.c b/src/coreutils/id/id.c index 89c8bf1..77a9e70 100644 --- a/src/coreutils/id/id.c +++ b/src/coreutils/id/id.c @@ -9,11 +9,11 @@ #include #include -unsigned int g_flag; -unsigned int G_flag; -unsigned int n_flag; -unsigned int r_flag; -unsigned int u_flag; +char g_flag; +char G_flag; +char n_flag; +char r_flag; +char u_flag; int print_groups(const struct passwd *pwd, const char *fmt, const int flag) { int ngroups = 0; @@ -77,7 +77,7 @@ int def_ids(uid_t uid, struct passwd *pwd) { } void usage(int sig) { - printf("id [user]\n\t[-u User ID] [-g Group ID]\n\t[-G Supplementary group IDs]\n\t[-n Print names instead of numbers]\n\t[-r Print real ID instead of effective ID]\n"); + printf("id [gGurn] [user]\n\t-u User ID\n\t-g Group ID\n\t-G Supplementary group IDs\n\t-n Print names instead of numbers\n\t-r Print real ID instead of effective ID\n"); exit(sig); } diff --git a/src/coreutils/ln/ln.c b/src/coreutils/ln/ln.c index 154bfc5..48f8be6 100644 --- a/src/coreutils/ln/ln.c +++ b/src/coreutils/ln/ln.c @@ -4,9 +4,8 @@ #include #include "make_path.h" -/* Symbolic */ -unsigned int s_flag; -unsigned int f_flag; +char s_flag; +char f_flag; int ln(const char *src, const char *dst) { if (f_flag) @@ -32,7 +31,7 @@ int main(int argc, char **argv) { break; default: - printf("ln [src] [dst]\n\t[-f Force] [-s Symbolic]\n"); + printf("ln [sf] [src] [dst]\n\t-f Force\n\t-s Symbolic\n"); return 0; } } diff --git a/src/coreutils/ls/ls.c b/src/coreutils/ls/ls.c index 1f7c9e4..7179278 100644 --- a/src/coreutils/ls/ls.c +++ b/src/coreutils/ls/ls.c @@ -16,18 +16,18 @@ #include "config.h" #include "human.h" -unsigned int O_flag; -unsigned int a_flag; -unsigned int l_flag; -unsigned int F_flag; -unsigned int c_flag; -unsigned int R_flag; -unsigned int d_flag; -unsigned int L_flag; -unsigned int h_flag; -unsigned int s_flag; -unsigned int i_flag; -unsigned int p_flag; +char O_flag; +char a_flag; +char l_flag; +char F_flag; +char c_flag; +char R_flag; +char d_flag; +char L_flag; +char h_flag; +char s_flag; +char i_flag; +char p_flag; int sortd(const void *p1, const void *p2); int (*sorter)(const void *p1, const void *p2) = sortd; @@ -412,7 +412,7 @@ int main(int argc, char **argv) { 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] [-t Sort by mtime]\n\t[-S Sort by size] [-s Print file size]\n"); + printf("ls [1alFcRdLhistS] [dir1 file2...]\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\n\t-R Recursive\n\t-1 One column\n\t-d Print only dir names\n\t-L Follow symlinks\n\t-h Sizes in human readable format\n\t-i Listen inodes\n\t-t Sort by mtime\n\t-S Sort by size\n\t-s Print file size\n"); return 0; } } diff --git a/src/coreutils/mkdir/mkdir.c b/src/coreutils/mkdir/mkdir.c index 25d200d..2d34675 100644 --- a/src/coreutils/mkdir/mkdir.c +++ b/src/coreutils/mkdir/mkdir.c @@ -7,8 +7,8 @@ #include #include "parse_mode.h" -unsigned int v_flag; -unsigned int p_flag; +char v_flag; +char p_flag; mode_t mode = 0777; int do_mkdir(const char *path) { @@ -21,7 +21,7 @@ int do_mkdir(const char *path) { } else if (v_flag) - printf("mkdir: %s created with mode: %d\n", path, mode); + printf("mkdir: %s created with mode %d\n", path, mode); return 0; } @@ -61,7 +61,7 @@ int main(int argc, char **argv) { break; default: - printf("mkdir [dst1 dst2...]\n\t[-p Make parent dir] [-m MODE Mode]\n"); + printf("mkdir [pmv] [dst1 dst2...]\n\t-p Make parent dir\n\t-m MODE Mode\n\t-v Verbose\n"); return 0; } } diff --git a/src/coreutils/mkfifo/mkfifo.c b/src/coreutils/mkfifo/mkfifo.c index 3f858d7..d351831 100644 --- a/src/coreutils/mkfifo/mkfifo.c +++ b/src/coreutils/mkfifo/mkfifo.c @@ -33,7 +33,7 @@ int main(int argc, char **argv) { break; default: - printf("mkfifo [file1 file2...]\n\t[-m Mode]\n"); + printf("mkfifo [m] [file1 file2...]\n\t-m MODE\n"); return 0; } } diff --git a/src/coreutils/mknod/mknod.c b/src/coreutils/mknod/mknod.c index 5fa1ee5..5bfc9bd 100644 --- a/src/coreutils/mknod/mknod.c +++ b/src/coreutils/mknod/mknod.c @@ -38,7 +38,7 @@ int main(int argc, char **argv) { break; default: - printf("mknod [-m MODE] [NAME] [TYPE] [MAJOR MINOR]\n"); + printf("mknod [m] [NAME] [TYPE] [MAJOR MINOR]\n\t-m MODE\n\n"); printf("Types:\n\tb - block device\n\tc or u - character device\n\tp - named pipe/fifo (MAJOR MINOR must be omitted)\n\ts - socket\n"); return 0; } diff --git a/src/coreutils/mktemp/mktemp.c b/src/coreutils/mktemp/mktemp.c index 2f52f31..b285da3 100644 --- a/src/coreutils/mktemp/mktemp.c +++ b/src/coreutils/mktemp/mktemp.c @@ -60,7 +60,7 @@ int main(int argc, char **argv) { break; default: - printf("mktemp [file]\n\t[-d Dir] [-p Base dir]\n"); + printf("mktemp [dp] [file]\n\t-d Dir\n\t-p Base dir\n"); return 0; } } diff --git a/src/coreutils/mv/mv.c b/src/coreutils/mv/mv.c index 946d51d..7cf88b0 100644 --- a/src/coreutils/mv/mv.c +++ b/src/coreutils/mv/mv.c @@ -38,7 +38,7 @@ int main(int argc, char **argv) { break; default: - printf("mv [src1 src2...] [dst]\n\t[-f Force]\n"); + printf("mv [f] [src1 src2...] [dst]\n\t-f Force\n"); return 0; } } diff --git a/src/coreutils/nice/nice.c b/src/coreutils/nice/nice.c index 30fec39..fdb1988 100644 --- a/src/coreutils/nice/nice.c +++ b/src/coreutils/nice/nice.c @@ -17,7 +17,7 @@ int main(int argc, char **argv) { break; default: - printf("nice [cmd] [arg1] [arg2]\n\t[-n N Add N to the niceness]\n"); + printf("nice [n] [cmd] [arg1] [arg2]\n\t-n N Add N to the niceness\n"); return 0; } } diff --git a/src/coreutils/nl/nl.c b/src/coreutils/nl/nl.c index 68df9b9..ebd0e62 100644 --- a/src/coreutils/nl/nl.c +++ b/src/coreutils/nl/nl.c @@ -6,8 +6,8 @@ #include #include "config.h" -unsigned int w_flag = 4; -unsigned int lines = 1; +char w_flag = 4; +char lines = 1; int nl(const char *path) { FILE *fp = stdin; @@ -52,7 +52,7 @@ int main(int argc, char **argv) { break; default: - printf("nl [file1 file2...]\n\t[-w N Width of line numbers]\n\t[-v N Start from N]\n"); + printf("nl [wv] [file1 file2...]\n\t-w N Width of line numbers\n\t-v N Start from N\n"); return 0; } } diff --git a/src/coreutils/renice/renice.c b/src/coreutils/renice/renice.c index c3349d0..8cc8441 100644 --- a/src/coreutils/renice/renice.c +++ b/src/coreutils/renice/renice.c @@ -41,7 +41,7 @@ int main(int argc, char **argv) { break; default: - printf("renice [id1 id2...]\n\t[-n N Add N to the niceness]\n\t[-g Process group ids]\n\t[-u Process user names]\n\t[-p Process ids]\n"); + printf("renice [ngup] [id1 id2...]\n\t-n N Add N to the niceness\n\t-g Process group ids\n\t-u Process user names\n\t-p Process ids\n"); return 0; } } diff --git a/src/coreutils/rm/rm.c b/src/coreutils/rm/rm.c index 944d8d8..2a52efc 100644 --- a/src/coreutils/rm/rm.c +++ b/src/coreutils/rm/rm.c @@ -10,7 +10,7 @@ #include "unused.h" char *f_flag = "rm"; -unsigned int r_flag; +char r_flag; int rm(const char *path, void *p) { UNUSED(p); @@ -49,7 +49,7 @@ int main(int argc, char **argv) { break; default: - printf("rm [file1 file2...]\n\t[-f Force] [-r Recursive]\n"); + printf("rm [rf] [file1 file2...]\n\t-f Force\n\t-r Recursive\n"); return 0; } } diff --git a/src/coreutils/shred/shred.c b/src/coreutils/shred/shred.c index ecbd0ca..63a2659 100644 --- a/src/coreutils/shred/shred.c +++ b/src/coreutils/shred/shred.c @@ -8,10 +8,10 @@ #include #include "config.h" -unsigned int f_flag; -unsigned int u_flag; -unsigned int z_flag; -unsigned int n_loops = 3; +char f_flag; +char u_flag; +char z_flag; +int n_loops = 3; int shred(int rand_fd, int fd) { /* Get size */ @@ -25,7 +25,7 @@ int shred(int rand_fd, int fd) { return 1; } - for (unsigned int n = 0; n < n_loops; n++) { + for (char n = 0; n < n_loops; n++) { if (read(rand_fd, buf, size) == 0) fprintf(stderr, "shred: %s", strerror(errno)); @@ -65,7 +65,7 @@ int main(int argc, char **argv) { break; default: - printf("shred [file1 file2...]\n\t[-n N Overwrite N times, default 3]\n\t[-z Final overwrite with zeros]\n\t[-u Remove file] [-f Chmod to ensure writability]\n"); + printf("shred [fuzn] [file1 file2...]\n\t-n N Overwrite N times, default 3\n\t-z Final overwrite with zeros\n\t-u Remove file\n\t-f Chmod to ensure writability\n"); return 0; } } diff --git a/src/coreutils/split/split.c b/src/coreutils/split/split.c index 8c37b03..e2d3270 100644 --- a/src/coreutils/split/split.c +++ b/src/coreutils/split/split.c @@ -68,7 +68,7 @@ int main(int argc, char **argv) { break; default: - printf("split [file1]\n\t[-l N Split by N lines]\n\t[-a N Use N letters as prefix]\n\t[-b N[k|m] Split by N (kilo|mega)bytes]\n"); + printf("split [alb] [file1]\n\t-l N Split by N lines\n\t-a N Use N letters as prefix\n\t-b N[k|m] Split by N (kilo|mega)bytes\n"); return 0; } } diff --git a/src/coreutils/tee/tee.c b/src/coreutils/tee/tee.c index ab08626..454236f 100644 --- a/src/coreutils/tee/tee.c +++ b/src/coreutils/tee/tee.c @@ -22,7 +22,7 @@ int main(int argc, char **argv) { break; default: - printf("tee [file]\n\t[-a Append]\n\t[-i Ignore interrupt signals]\n"); + printf("tee [ai] [file]\n\t-a Append\n\t-i Ignore interrupt signals\n"); return 0; } } diff --git a/src/coreutils/time/time.c b/src/coreutils/time/time.c index 17e07c7..39b87a0 100644 --- a/src/coreutils/time/time.c +++ b/src/coreutils/time/time.c @@ -28,8 +28,10 @@ int main(int argc, char **argv) { /* Run */ pid_t pid; - if ((pid = fork()) == 0) + if ((pid = fork()) == 0) { execvp(argv[1], argv + 1); + exit(1); + } int status = 0; waitpid(pid, &status, 0); diff --git a/src/coreutils/touch/touch.c b/src/coreutils/touch/touch.c index b636f9f..b43a984 100644 --- a/src/coreutils/touch/touch.c +++ b/src/coreutils/touch/touch.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -6,35 +7,140 @@ #include #include -int touch(const char *path) { - int fd = open(path, O_CREAT | O_RDONLY, 0666); - if (fd < 0) { - fprintf(stderr, "touch: %s\n", strerror(errno)); +char c_flag; +char m_flag; +char a_flag; + +int setdate(const char *path, const time_t date, char flag) { + struct utimbuf new_time; + + if (flag || a_flag) + new_time.actime = date; + + if (flag || m_flag) + new_time.modtime = date; + + if (utime(path, &new_time) < 0) { + fprintf(stderr, "touch: %s: %s\n", path, strerror(errno)); return 1; } - close(fd); + return 0; +} - struct utimbuf new_time; - time_t now = time(NULL); +int touch(const char *path, const time_t date) { - new_time.actime = now; - new_time.modtime = now; + if (!c_flag) { + int fd = open(path, O_CREAT | O_RDONLY, 0666); + if (fd < 0) { + fprintf(stderr, "touch: %s\n", strerror(errno)); + return 1; + } - if (utime(path, &new_time) < 0) + close(fd); + } + + /* Update the date to now */ + if (setdate(path, time(NULL), 1)) + return 1; + + /* Seting custom values */ + char flag = 0; + if (m_flag == 0 && a_flag == 0) + flag = 1; + + if (date != -1 && setdate(path, date, flag)) return 1; return 0; } -int main(const int argc, const char **argv) { - if (argc == 1) { +time_t parse_date(char *str) { + char *fmt = NULL; + switch (strlen(str)) { + case 8: + fmt = "%m%d%H%M"; + break; + + case 10: + fmt = "%y%m%d%H%M"; + break; + + case 11: + fmt = "%m%d%H%M.%S"; + break; + + case 12: + fmt = "%Y%m%d%H%M"; + break; + + case 13: + fmt = "%y%m%d%H%M.%S"; + break; + + case 15: + fmt = "%Y%m%d%H%M.%S"; + break; + + case 19: + fmt = "%Y-%m-%dT%H:%M:%S"; + break; + + default: + fprintf(stderr, "touch: invalid date format\n"); + exit(1); + } + + time_t now = time(NULL); + struct tm tm = *localtime(&now); + + if (!strptime(str, fmt, &tm)) { + fprintf(stderr, "touch: %s\n", strerror(errno)); + exit(1); + } + + return mktime(&tm); +} + +int main(int argc, char **argv) { + time_t date = -1; + + int opt; + while ((opt = getopt(argc, argv, "cmad:t:")) != -1) { + switch (opt) { + case 'm': + m_flag = 1; + break; + + case 'a': + a_flag = 1; + break; + + case 'c': + c_flag = 1; + break; + + case 't': + case 'd': + date = parse_date(optarg); + break; + + default: + printf("touch [cmad] [file1 file2...]\n\t-c Don't create files\n\t-a Change only atime\n\t-m Change only mtime\n\t-d Date/time to use\n"); + return 0; + } + } + + argv += optind; + argc -= optind; + + if (argc == 0) { printf("touch: missing operand\n"); return 1; } - for (int i = 1; i < argc; i++) - if (touch(argv[i])) + for (int i = 0; i < argc; i++) + if (touch(argv[i], date)) return 1; return 0; diff --git a/src/coreutils/uname/uname.c b/src/coreutils/uname/uname.c index 3092f67..fac26d2 100644 --- a/src/coreutils/uname/uname.c +++ b/src/coreutils/uname/uname.c @@ -100,7 +100,7 @@ int main(int argc, char **argv) { break; default: - printf("uname\n\t[-a All] [-s Sys]\n\t[-n Nodename] [-r Release]\n\t[-v Version] [-m Machine]\n\t[-o Os name]\n"); + printf("uname [asnrvmop]\n\t-a All\n\t-s Sys]\n\t-n Nodename\n\t-r Release\n\t-v Version\n\t-m Machine\n\t-o Os name\n"); return 0; } } diff --git a/src/coreutils/wc/wc.c b/src/coreutils/wc/wc.c index 9b64621..cef6ed5 100644 --- a/src/coreutils/wc/wc.c +++ b/src/coreutils/wc/wc.c @@ -84,7 +84,7 @@ int main(int argc, char **argv) { break; default: - printf("wc [file1 file2...]\n\t[-l Lines] [-c Bytes]\n\t[-w Words] [-t Don't print total]\n"); + printf("wc [lcwt] [file1 file2...]\n\t-l Lines\n\t-c Bytes\n\t-w Words\n\t-t Don't print total\n"); return 0; } } diff --git a/src/findutils/xargs/xargs.c b/src/findutils/xargs/xargs.c index 9077c0b..dd80a1b 100644 --- a/src/findutils/xargs/xargs.c +++ b/src/findutils/xargs/xargs.c @@ -127,7 +127,7 @@ int main(int argc, char **argv) { break; default: - printf("xargs [cmd [arg1] [arg2...]]\n\t[-t Print the command]\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"); + printf("xargs [tnsr] [cmd [arg1] [arg2...]]\n\t-t Print the command\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"); return 0; } } diff --git a/src/networking/hostname/hostname.c b/src/networking/hostname/hostname.c index f787a66..48bc882 100644 --- a/src/networking/hostname/hostname.c +++ b/src/networking/hostname/hostname.c @@ -36,7 +36,7 @@ int main(int argc, char **argv) { break; default: - printf("hostname [hostname]\n\t[-c CONFIG Use config file]\n"); + printf("hostname [c] [hostname]\n\t-c PATH Use config file\n"); return 0; } } diff --git a/src/procps/kill/kill.c b/src/procps/kill/kill.c index 5b5eb03..08cccf6 100644 --- a/src/procps/kill/kill.c +++ b/src/procps/kill/kill.c @@ -80,7 +80,7 @@ int main(int argc, char **argv) { break; default: - printf("kill [pid1 pid2...]\n\t[-s SIG] [-l List all signals]\n\t[-a Kill all process]\n"); + printf("kill [lsa] [pid1 pid2...]\n\t-s SIG\n\t-l List all signals\n\t-a Kill all process\n"); return 0; } } diff --git a/src/procps/uptime/uptime.c b/src/procps/uptime/uptime.c index 14283f7..80574c0 100644 --- a/src/procps/uptime/uptime.c +++ b/src/procps/uptime/uptime.c @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include "config.h" @@ -44,7 +46,7 @@ int main(void) { double avg[3] = {0, 0, 0}; if (getloadavg(avg, sizeof(avg) / sizeof(avg[0])) < 0) { - fprintf(stderr, "getloadavg: getloadavg() failed\n"); + fprintf(stderr, "uptime: %s\n", strerror(errno)); return 1; } diff --git a/src/shell/rc/rc.c b/src/shell/rc/rc.c index 0160b52..ca29686 100644 --- a/src/shell/rc/rc.c +++ b/src/shell/rc/rc.c @@ -190,7 +190,7 @@ int main(int argc, char **argv) { break; default: - printf("rc [script]\n\t[-l UNUSED]\n"); + printf("rc [l] [script]\n\t-l UNUSED\n"); return 0; } } diff --git a/src/sysutils-linux/dmesg/dmesg.c b/src/sysutils-linux/dmesg/dmesg.c index c701cc1..5e40f1a 100644 --- a/src/sysutils-linux/dmesg/dmesg.c +++ b/src/sysutils-linux/dmesg/dmesg.c @@ -22,7 +22,7 @@ int main(int argc, char **argv) { break; default: - printf("dmesg\n\t[-n LEVEL Set console logging level] [-s SIZE Buffer Size]\n"); + printf("dmesg [sn]\n\t-n LEVEL Set console logging level\n\t-s SIZE Buffer Size\n"); return 0; } } diff --git a/src/sysutils-linux/mount/mount.c b/src/sysutils-linux/mount/mount.c index 96c10d5..53d4e29 100644 --- a/src/sysutils-linux/mount/mount.c +++ b/src/sysutils-linux/mount/mount.c @@ -88,7 +88,7 @@ int main(int argc, char **argv) { break; default: - printf("mount [DEVICE] [NODE]\n\t[-t Fs type, default %s] [-o Options]\n\t[-a Mount all fs in /etc/fstab]\n\nOptions:\n", MOUNT_DEF_FS); + printf("mount [ato] [DEVICE] [NODE]\n\t-t Fs type, default %s\n\t-o Options\n\t-a Mount all fs in /etc/fstab\n\nOptions:\n", MOUNT_DEF_FS); print_opts(); return 0; } diff --git a/src/sysutils-linux/umount/umount.c b/src/sysutils-linux/umount/umount.c index e48ac03..74a8def 100644 --- a/src/sysutils-linux/umount/umount.c +++ b/src/sysutils-linux/umount/umount.c @@ -48,7 +48,7 @@ int main(int argc, char **argv) { break; default: - printf("umount [dst1 dst2...]\n\t[-a Umount all]\n\t[-f Force umount] [-l Lazy umount]\n"); + printf("umount [afl] [dst1 dst2...]\n\t-a Umount all\n\t-f Force umount\n\t-l Lazy umount\n"); return 0; } }