Viewing: mv.c
📄 mv.c (Read Only) ⬅ To go back
/* AdrOS mv utility */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char** argv) {
    if (argc < 3) {
        fprintf(stderr, "Usage: mv <source> <dest>\n");
        return 1;
    }

    /* Try rename first (same filesystem) */
    if (rename(argv[1], argv[2]) == 0)
        return 0;

    /* Fallback: copy + unlink */
    int src = open(argv[1], O_RDONLY);
    if (src < 0) {
        fprintf(stderr, "mv: cannot open '%s'\n", argv[1]);
        return 1;
    }

    int dst = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (dst < 0) {
        fprintf(stderr, "mv: cannot create '%s'\n", argv[2]);
        close(src);
        return 1;
    }

    char buf[4096];
    int r;
    while ((r = read(src, buf, sizeof(buf))) > 0) {
        if (write(dst, buf, (size_t)r) != r) {
            fprintf(stderr, "mv: write error\n");
            close(src); close(dst);
            return 1;
        }
    }

    close(src);
    close(dst);
    unlink(argv[1]);
    return 0;
}