fixed
This commit is contained in:
parent
4dda5db6f6
commit
ec99d14ad6
@ -2,4 +2,4 @@
|
||||
Own implementation of *nix utils
|
||||
License: wtfpl
|
||||
|
||||
Author: 8nl
|
||||
https://trivial.technology/
|
||||
|
@ -4,12 +4,16 @@
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
int main(const int argc, char **argv) {
|
||||
if (argc < 3 || !strcmp(argv[argc - 1], "--help")) {
|
||||
int main(int argc, char **argv) {
|
||||
int opt;
|
||||
while ((opt = getopt(argc, argv, "")) != -1 || argc == 1) {
|
||||
puts("chroot [dir] [command] [arg arg2...]");
|
||||
return 0;
|
||||
}
|
||||
|
||||
argv += optind;
|
||||
argc -= optind;
|
||||
|
||||
if (chroot(argv[1]) < 0) {
|
||||
fprintf(stderr, "chroot: %s\n", strerror(errno));
|
||||
return 1;
|
||||
@ -20,7 +24,7 @@ int main(const int argc, char **argv) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (execvp(argv[2], argv + 2) < 0) {
|
||||
if (execvp(argv[0], argv) < 0) {
|
||||
fprintf(stderr, "chroot: %s\n", strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
@ -101,14 +101,18 @@ int main(int argc, char **argv) {
|
||||
int ofd = STDOUT_FILENO;
|
||||
int ifd = STDIN_FILENO;
|
||||
|
||||
char notrunc = 0;
|
||||
char fsync_flag = 0;
|
||||
|
||||
/* Return value */
|
||||
int ret = 1;
|
||||
|
||||
for (int i = 1; i < argc; i++) {
|
||||
char *arg = argv[i];
|
||||
|
||||
char *val = strchr(arg, '=');
|
||||
if (val == NULL) {
|
||||
printf("dd\n\tif=InputFile\n\tof=OutputFile\n\tbs=ibs 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");
|
||||
puts("dd\n\tif=InputFile\n\tof=OutputFile\n\tbs=ibs 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\tnconv=notrunc Don't truncate output file\n\tconv=fsync Physically write data out before finishing\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");
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -139,6 +143,15 @@ int main(int argc, char **argv) {
|
||||
|
||||
else if (!strcmp(arg, "obs"))
|
||||
obs = strtonum(val);
|
||||
|
||||
char *ptr = strstr(arg, "conv");
|
||||
if (ptr) {
|
||||
if (strstr(val, "notrunc"))
|
||||
notrunc = 1;
|
||||
|
||||
if (strstr(val, "fsync"))
|
||||
fsync_flag = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (bs) {
|
||||
@ -172,12 +185,17 @@ int main(int argc, char **argv) {
|
||||
|
||||
/* Output */
|
||||
int oflag = O_WRONLY | O_CREAT;
|
||||
if (seek)
|
||||
if (seek && !notrunc)
|
||||
oflag |= O_TRUNC;
|
||||
|
||||
ofd = openfile(1, ofp, oflag);
|
||||
if (seek) {
|
||||
if (ftruncate(ofd, seek * ibs) < 0 || lseek(ofd, seek * ibs, SEEK_SET) < 0) {
|
||||
if (!notrunc && ftruncate(ofd, seek * ibs) < 0) {
|
||||
fprintf(stderr, "dd: %s\n", strerror(errno));
|
||||
goto CLOSE;
|
||||
}
|
||||
|
||||
if (lseek(ofd, seek * ibs, SEEK_SET) < 0) {
|
||||
fprintf(stderr, "dd: %s\n", strerror(errno));
|
||||
goto CLOSE;
|
||||
}
|
||||
@ -233,7 +251,9 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
/* End */
|
||||
if (fsync_flag)
|
||||
fsync(ofd);
|
||||
|
||||
summary();
|
||||
|
||||
ret = 0;
|
||||
|
@ -88,7 +88,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
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");
|
||||
puts("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");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ int print(const char *file, FILE *fp, long lines, long bytes) {
|
||||
long lmax = 0;
|
||||
long bmax = 0;
|
||||
|
||||
/* Make buffer */
|
||||
size_t buf_size = 0;
|
||||
char *buf = malloc(1);
|
||||
if (buf == NULL) {
|
||||
@ -65,6 +66,7 @@ int print(const char *file, FILE *fp, long lines, long bytes) {
|
||||
|
||||
buf[buf_size] = '\0';
|
||||
|
||||
/* Print buffer */
|
||||
for (size_t i = 0; i < buf_size; i++) {
|
||||
if (buf[i] == '\n')
|
||||
lcount++;
|
||||
@ -119,7 +121,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("head [ncv] [file1 file2...]\n\t-n Print [-]N lines\n\t-c Print [-]N bytes\n\t-v Print headers\n");
|
||||
puts("head [ncv] [file1 file2...]\n\t-n Print [-]N lines\n\t-c Print [-]N bytes\n\t-v Print headers");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ int def_ids(uid_t uid, struct passwd *pwd) {
|
||||
}
|
||||
|
||||
void usage(int sig) {
|
||||
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");
|
||||
puts("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");
|
||||
exit(sig);
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("ln [sfv] [src] [dst]\n\t-f Force\n\t-s Symbolic\n\t-v Verbose\n");
|
||||
puts("ln [sfv] [src] [dst]\n\t-f Force\n\t-s Symbolic\n\t-v Verbose");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -470,7 +470,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("ls [1alFcRdLhistS0] [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\t-0 End line with \\0\n");
|
||||
puts("ls [1alFcRdLhistS0] [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\t-0 End line with \\0");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("mkdir [pmv] [dst1 dst2...]\n\t-p Make parent dir\n\t-m MODE Mode\n\t-v Verbose\n");
|
||||
puts("mkdir [pmv] [dst1 dst2...]\n\t-p Make parent dir\n\t-m MODE Mode\n\t-v Verbose");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -38,8 +38,8 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
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");
|
||||
puts("mknod [m] [NAME] [TYPE] [MAJOR MINOR]\n\t-m MODE\n");
|
||||
puts("Types:\n\tb - block device\n\tc or u - character device\n\tp - named pipe/fifo (MAJOR MINOR must be omitted)\n\ts - socket");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("mktemp [dp] [file]\n\t-d Dir\n\t-p Base dir\n");
|
||||
puts("mktemp [dp] [file]\n\t-d Dir\n\t-p Base dir");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("mv [f] [src1 src2...] [dst]\n\t-f Force\n");
|
||||
puts("mv [f] [src1 src2...] [dst]\n\t-f Force");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("nice [n] [cmd] [arg1] [arg2]\n\t-n N Add N to the niceness\n");
|
||||
puts("nice [n] [cmd] [arg1] [arg2]\n\t-n N Add N to the niceness");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 2) {
|
||||
printf("nohup: missing operand\nnohup [cmd]\n");
|
||||
puts("nohup: missing operand\nnohup [cmd]");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,7 @@ int printvars(int len, char **names) {
|
||||
int main(int argc, char **argv, const char **envp) {
|
||||
int opt;
|
||||
while ((opt = getopt(argc, argv, "0")) != -1) {
|
||||
printf("printenv [var1 var2...]\n");
|
||||
puts("printenv [var1 var2...]");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("readlink [n] [file1 file2...]\n\t-n Don't add newline\n");
|
||||
puts("readlink [n] [file1 file2...]\n\t-n Don't add newline");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
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");
|
||||
puts("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");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("rm [rif] [file1 file2...]\n\t-f Force\n\t-r Recursive\n\t-i Print prompt before remove\n");
|
||||
puts("rm [rif] [file1 file2...]\n\t-f Force\n\t-r Recursive\n\t-i Print prompt before remove");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ int main(int argc, char **argv) {
|
||||
UNUSED(argc);
|
||||
|
||||
if (argv[1] == NULL) {
|
||||
printf("setsid [cmd] [arg1 arg2...]\n");
|
||||
puts("setsid [cmd] [arg1 arg2...]");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
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");
|
||||
puts("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");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
int opt;
|
||||
while ((opt = getopt(argc, argv, "")) != -1 || argc == 1) {
|
||||
printf("sleep [num[SUFFIX]] or [inf Infinity]\nSUFFIXES:\n\tm - minute\n\th - hour\n\td - days\n");
|
||||
puts("sleep [num[SUFFIX]] / [inf]\nSUFFIXES:\n\tm - minute\n\th - hour\n\td - days");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -70,7 +70,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
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");
|
||||
puts("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");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("tee [ai] [file]\n\t-a Append\n\t-i Ignore interrupt signals\n");
|
||||
puts("tee [ai] [file]\n\t-a Append\n\t-i Ignore interrupt signals");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
if (argc < 2) {
|
||||
printf("time: missing operand\ntime [cmd]\n");
|
||||
puts("time: missing operand\ntime [cmd]");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -126,7 +126,7 @@ int main(int argc, char **argv) {
|
||||
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");
|
||||
puts("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");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
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");
|
||||
puts("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");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
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");
|
||||
puts("wc [lcwt] [file1 file2...]\n\t-l Lines\n\t-c Bytes\n\t-w Words\n\t-t Don't print total");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -266,7 +266,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-0 NUL terminated input\n\t-I STR Replace STR within PROG ARGS with input line\n");
|
||||
puts("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");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 2) {
|
||||
printf("cryptpw: missing operand\ncryptpw [password] [own salt]\n");
|
||||
puts("cryptpw: missing operand\ncryptpw [password] [own salt]");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -105,7 +105,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("su [cps] [user Default: root]\n\t-c CMD Command to pass to \'sh -c\'\n\t-s SHELL Shell to use instead of user's default\n\t-p Do not set new env\n");
|
||||
puts("su [cps] [user Default: root]\n\t-c CMD Command to pass to \'sh -c\'\n\t-s SHELL Shell to use instead of user's default\n\t-p Do not set new env");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("dmesg [sn]\n\t-n LEVEL Set console logging level\n\t-s SIZE Buffer Size\n");
|
||||
puts("dmesg [sn]\n\t-n LEVEL Set console logging level\n\t-s SIZE Buffer Size");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
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);
|
||||
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:", MOUNT_DEF_FS);
|
||||
print_opts();
|
||||
return 0;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("umount [afl] [dst1 dst2...]\n\t-a Umount all\n\t-f Force umount\n\t-l Lazy umount\n");
|
||||
puts("umount [afl] [dst1 dst2...]\n\t-a Umount all\n\t-f Force umount\n\t-l Lazy umount");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user