diff --git a/Makefile b/Makefile index 5eac205..b70e5bb 100644 --- a/Makefile +++ b/Makefile @@ -11,10 +11,14 @@ DESTDIR ?= / .PHONY: all debug clean build-release install all: $(shell mkdir -p bin) all: ${PROGS} +all: dbox ${PROGS}: @echo Building $@.. - @${CC} -o bin/$@ -DDRAKECU_VERSION=${VERSION} ${CC_FLAGS} src/$@.c + @${CC} -c -o bin/$@.o -DDRAKECU_VERSION=${VERSION} ${CC_FLAGS} src/$@.c + +dbox: + @${CC} -o bin/dbox src/dbox.c $(wildcard bin/*.o) debug: CC_FLAGS:=-g -O0 -v ${CC_FLAGS} debug: all @@ -28,13 +32,11 @@ build-release: @strip bin/* tar -czf release.tar.gz bin/* -#TODO: fix this, this is terrible oh god help me install: - @for prog in ${EXCLUDE_PROGS}; do \ - mv bin/$$prog /tmp; \ + @install -m 777 bin/dbox ${DESTDIR}/usr/local/bin + @for prog in ${PROGS}; do \ + ln ${DESTDIR}/usr/local/bin/dbox ${DESTDIR}/usr/local/bin/$$prog; \ done - install -m 777 bin/* ${DESTDIR}usr/local/bin @for prog in ${EXCLUDE_PROGS}; do \ - mv /tmp/$$prog bin; \ + rm ${DESTDIR}/usr/local/bin/$$prog; \ done - diff --git a/README.md b/README.md index 00bc3ea..e9fc783 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,4 @@ the best coreutils since toybox #### todo - fix memory issues in everything (but `ls` specifically) - proper formatting in `ls` +- allow a way to manually use multi-binary mode? diff --git a/src/arch.c b/src/arch.c index 549af24..6f8ed01 100644 --- a/src/arch.c +++ b/src/arch.c @@ -41,7 +41,7 @@ Available arguments: --version: show the version of the program (WIP) */ -int main(int argc, char **argv) { +int arch(int argc, char **argv) { if (argc == 1) { struct utsname e; uname(&e); diff --git a/src/basename.c b/src/basename.c index 53c6f2f..740e7c9 100644 --- a/src/basename.c +++ b/src/basename.c @@ -44,7 +44,7 @@ Available arguments: --uid: print the users numeric UID, instead of username */ -int main(int argc, char **argv) { +int bn(int argc, char **argv) { char *wd; char *upname = NULL; if (argc == 1) { diff --git a/src/cat.c b/src/cat.c index a02228a..f46e19e 100644 --- a/src/cat.c +++ b/src/cat.c @@ -58,7 +58,7 @@ static int concatFileToStdoutWithOptions(char *file, bool showLineEnds) { return 0; } -int main(int argc, char **argv) { +int cat(int argc, char **argv) { if (argc == 1) { char ch; while (read(STDIN_FILENO, &ch, 1) > 0) { diff --git a/src/chroot.c b/src/chroot.c index 8b91707..5a7f8c5 100644 --- a/src/chroot.c +++ b/src/chroot.c @@ -61,7 +61,7 @@ int runChroot(char *executable, char *directory) { return 0; } -int main(int argc, char *argv[]) { +int chr(int argc, char *argv[]) { int i; char *executable = "/bin/sh"; char *directory = argv[argc - 1]; @@ -90,4 +90,4 @@ int main(int argc, char *argv[]) { } } return runChroot(executable, directory); -} \ No newline at end of file +} diff --git a/src/cp.c b/src/cp.c index bd4c378..fc669be 100644 --- a/src/cp.c +++ b/src/cp.c @@ -59,7 +59,7 @@ static int copyFile(const char *src, const char *dst) { return 0; } -int main(int argc, char **argv) { +int cp(int argc, char **argv) { int isDst = 0; char *src; char *dst; diff --git a/src/dbox.c b/src/dbox.c new file mode 100644 index 0000000..1fded1a --- /dev/null +++ b/src/dbox.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include + +/* +BSD 3-Clause License + +Copyright (c) 2021, Ruthenic +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +int matchExec(char *name, int argc, char *argv[]) { + if (!strcmp(name,"arch")) { + arch(argc, argv); + } + if (!strcmp(name,"basename")) { + bn(argc, argv); + } + if (!strcmp(name,"cat")) { + cat(argc, argv); + } + if (!strcmp(name,"chroot")) { + chr(argc, argv); + } + if (!strcmp(name,"cp")) { + cp(argc, argv); + } + if (!strcmp(name,"ls")) { + ls(argc, argv); + } + if (!strcmp(name,"pwd")) { + pwd(argc, argv); + } + if (!strcmp(name,"rm")) { + rm(argc, argv); + } + if (!strcmp(name,"uname")) { + un(argc, argv); + } + if (!strcmp(name,"whoami")) { + whoami(argc, argv); + } + if (!strcmp(name,"yes")) { + yes(argc, argv); + } + if (!strcmp(name,"dbox")) { + char **newArgv = argv + 1; + matchExec(newArgv[0], argc-1, newArgv); + } + return 0; //TODO: return return of exec files +} + +int main(int argc, char *argv[]) +{ + char *linkName = basename(argv[0]); + matchExec(linkName, argc, argv); + return 0; +} diff --git a/src/ls.c b/src/ls.c index b7a3726..4a0284d 100644 --- a/src/ls.c +++ b/src/ls.c @@ -139,7 +139,7 @@ static int listDirs(char *thatpath, bool specpath, bool colour, bool showdot, // lots o' code ~~stolen~~ borrowed from // https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html -int main(int argc, char **argv) { +int ls(int argc, char **argv) { // define default options bool colour = false; bool showdot = false; diff --git a/src/pwd.c b/src/pwd.c index 594ca39..5475c45 100644 --- a/src/pwd.c +++ b/src/pwd.c @@ -43,7 +43,7 @@ Available arguments: --uid: print the users numeric UID, instead of username */ -int main(int argc, char **argv) { +int pwd(int argc, char **argv) { char wd[PATH_MAX]; getcwd(wd, sizeof(wd)); if (argc == 1) { diff --git a/src/rm.c b/src/rm.c index f947b7a..650d5be 100644 --- a/src/rm.c +++ b/src/rm.c @@ -118,7 +118,7 @@ int removeFileOrDirectory(char *path, bool recursive, bool force, } } -int main(int argc, char **argv) { +int rm(int argc, char **argv) { bool recursive = false; bool force = false; bool followSymlink = false; diff --git a/src/uname.c b/src/uname.c index 5962e5a..c8c1a7d 100644 --- a/src/uname.c +++ b/src/uname.c @@ -54,7 +54,7 @@ bool startsWithChar(const char *pre, const char str) { return index == 0; } -int main(int argc, char **argv) { +int un(int argc, char **argv) { struct utsname uts; uname(&uts); char hostname[HOST_NAME_MAX + 1]; diff --git a/src/whoami.c b/src/whoami.c index 4ee5d63..41b964d 100644 --- a/src/whoami.c +++ b/src/whoami.c @@ -43,7 +43,7 @@ Available arguments: --uid: print the users numeric UID, instead of username */ -int main(int argc, char **argv) { +int whoami(int argc, char **argv) { uid_t userid = geteuid(); char *username = getpwuid(userid)->pw_name; if (argc == 1) { diff --git a/src/yes.c b/src/yes.c index e626a10..e1c360f 100644 --- a/src/yes.c +++ b/src/yes.c @@ -43,7 +43,7 @@ Usage: yes [--help] [--version] [message] */ -int main(int argc, char **argv) { +int yes(int argc, char **argv) { char *spammy = malloc((sizeof(char) * 16) * 2); int len = 2048; // max length of buffer char buf[len];