diff --git a/programs/src/copy/main.cpp b/programs/src/copy/main.cpp new file mode 100644 index 0000000..c368673 --- /dev/null +++ b/programs/src/copy/main.cpp @@ -0,0 +1,98 @@ +/* + * main.cpp + * copy - command to copy files + * Copyright (c) 2026 Daniel Hammer +*/ + +#include +#include + +extern "C" void _start() { + char args[256]; + montauk::getargs((char *)&args, 256); + + const char* p = montauk::skip_spaces((const char *)&args); + if (*p == '\0') { + montauk::print("usage: cp [source] [dest]\n"); + montauk::exit(-1); + } + + // Parse source path + const char* src = p; + while (*p && *p != ' ') p++; + if (*p == '\0') { + montauk::print("copy: missing destination\n"); + montauk::exit(-1); + } + char srcPath[256]; + size_t len = p - src; + if (len >= sizeof(srcPath)) len = sizeof(srcPath) - 1; + for (size_t i = 0; i < len; i++) srcPath[i] = src[i]; + srcPath[len] = '\0'; + + // Parse dest path + p = montauk::skip_spaces(p); + if (*p == '\0') { + montauk::print("copy: missing destination\n"); + montauk::exit(-1); + } + const char* dst = p; + + // Open source file + int srcFd = montauk::open(srcPath); + if (srcFd < 0) { + montauk::print("copy: cannot open source file\n"); + montauk::exit(-1); + } + + // Get source size + uint64_t size = montauk::getsize(srcFd); + if (size == 0) { + montauk::close(srcFd); + // Create empty destination + int dstFd = montauk::fcreate(dst); + if (dstFd < 0) { + montauk::print("copy: cannot create destination file\n"); + montauk::exit(-1); + } + montauk::close(dstFd); + montauk::exit(0); + } + + // Allocate buffer for file contents + uint8_t* buf = (uint8_t*)montauk::alloc(size); + if (!buf) { + montauk::close(srcFd); + montauk::print("copy: out of memory\n"); + montauk::exit(-1); + } + + // Read source file + int bytesRead = montauk::read(srcFd, buf, 0, size); + montauk::close(srcFd); + if (bytesRead < 0 || (uint64_t)bytesRead != size) { + montauk::free(buf); + montauk::print("copy: failed to read source file\n"); + montauk::exit(-1); + } + + // Create destination file + int dstFd = montauk::fcreate(dst); + if (dstFd < 0) { + montauk::free(buf); + montauk::print("copy: cannot create destination file\n"); + montauk::exit(-1); + } + + // Write to destination + int written = montauk::fwrite(dstFd, buf, 0, size); + montauk::close(dstFd); + montauk::free(buf); + + if (written < 0 || (uint64_t)written != size) { + montauk::print("copy: failed to write destination file\n"); + montauk::exit(-1); + } + + montauk::exit(0); +} diff --git a/programs/src/move/main.cpp b/programs/src/move/main.cpp new file mode 100644 index 0000000..bd7570d --- /dev/null +++ b/programs/src/move/main.cpp @@ -0,0 +1,47 @@ +/* + * main.cpp + * move - command to move/rename files + * Copyright (c) 2026 Daniel Hammer +*/ + +#include +#include + +extern "C" void _start() { + char args[256]; + montauk::getargs((char *)&args, 256); + + const char* p = montauk::skip_spaces((const char *)&args); + if (*p == '\0') { + montauk::print("usage: move [source] [dest]\n"); + montauk::exit(-1); + } + + // Parse source path + const char* src = p; + while (*p && *p != ' ') p++; + if (*p == '\0') { + montauk::print("move: missing destination\n"); + montauk::exit(-1); + } + char srcPath[256]; + size_t len = p - src; + if (len >= sizeof(srcPath)) len = sizeof(srcPath) - 1; + for (size_t i = 0; i < len; i++) srcPath[i] = src[i]; + srcPath[len] = '\0'; + + // Parse dest path + p = montauk::skip_spaces(p); + if (*p == '\0') { + montauk::print("move: missing destination\n"); + montauk::exit(-1); + } + const char* dst = p; + + if (montauk::frename(srcPath, dst) < 0) { + montauk::print("move: failed to move file\n"); + montauk::exit(-1); + } + + montauk::exit(0); +}