簡易cp -pコマンド

コピー元のファイルのタイムスタンプ、ファイル所有者、ファイルモードをコピー先のファイルに設定。

#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < unistd.h >
#include < utime.h >
#include < stdio.h >

int main(int argc, char **argv)
{
    int fd_r, fd_w;
    ssize_t n;
    int err = 0;
    struct stat s_buf;
    struct utimbuf u_buf;
    char buf[4096];
    
    if (argc != 3){
        fprintf(stderr, "Usage: %s source dest\n", argv[0]);
        return 1;
    }
    
    if ((fd_r = open(argv[1], O_RDONLY)) < 0){
        perror(argv[1]);
        return 1;
    }
    
    if (fstat(fd_r, &s_buf) < 0){
        perror(argv[1]);
        return 1;
    }
    
    if ((fd_w = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0){
        perror(argv[2]);
        return 1;
    }
    
    while((n = read(fd_r, buf, sizeof buf)) > 0){
        if (write(fd_w, buf, n)< 0){
            perror(argv[2]);
            return 1;
        }
    }
    if (n < 0){
        perror(argv[1]);
        return 1;
}
    u_buf.actime = s_buf.st_atime;
    u_buf.modtime = s_buf.st_mtime;
    
    if (utime(argv[2], &u_buf)){
        perror(argv[2]);
        err = 1;
    }
    
    fchown(fd_w, s_buf.st_uid, s_buf.st_gid);
    
    if (fchmod(fd_w, s_buf.st_mode)<0){
        perror(argv[2]);
        err = 1;
    }
    return err;
}