Write a c program to copy files using system calls.

C program that copies a file using system calls, specifically open(), read(), and write(). This program takes the source file and destination file as command-line arguments.

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

	#define BUFFER_SIZE 1024  // Buffer size for file copy

	void copy_file(const char *src, const char *dest) {
	    int src_fd, dest_fd;
	    char buffer[BUFFER_SIZE];
	    ssize_t bytes_read, bytes_written;

	    // Open source file for reading
	    src_fd = open(src, O_RDONLY);
	    if (src_fd == -1) {
	        perror("Error opening source file");
	        exit(EXIT_FAILURE);
	    }

	    // Open/create destination file for writing
	    dest_fd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
	    if (dest_fd == -1) {
	        perror("Error opening/creating destination file");
	        close(src_fd);
	        exit(EXIT_FAILURE);
	    }

	    // Copy the file content
	    while ((bytes_read = read(src_fd, buffer, BUFFER_SIZE)) > 0) {
	        bytes_written = write(dest_fd, buffer, bytes_read);
	        if (bytes_written != bytes_read) {
	            perror("Error writing to destination file");
	            close(src_fd);
	            close(dest_fd);
	            exit(EXIT_FAILURE);
	        }
	    }

	    // Check for read error
	    if (bytes_read == -1) {
	        perror("Error reading from source file");
	    }

	    // Close the file descriptors
	    close(src_fd);
	    close(dest_fd);
	}

	int main(int argc, char *argv[]) {
	    if (argc != 3) {
	        fprintf(stderr, "Usage: %s <source_file> <destination_file>\n", argv[0]);
	        exit(EXIT_FAILURE);
	    }

	    copy_file(argv[1], argv[2]);
	    printf("File copied from %s to %s\n", argv[1], argv[2]);
	    return 0;
	}