#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <fcntl.h>
#include <string.h>

#define BLOCK_SIZE 4096
#define BUF_SIZE BLOCK_SIZE

int main (int argc, char *argv[]) {

    if (argc != 3) {
	fprintf (stderr, "Usage: %s remote_filename local_filename\n", argv[0]);
	exit (1);
    }

    struct addrinfo *res;
    int sfd, fd, count;
    char buffer[BUF_SIZE];

    if (getaddrinfo ("localhost", "4096", NULL, &res) != 0) {
	perror ("getaddrinfo()");
	exit (1);
    }

    sfd = socket (AF_INET, SOCK_STREAM, 0);
    if (sfd == -1) {
	perror ("socket()");
	exit (1);
    }

    if (connect (sfd, res->ai_addr, res->ai_addrlen) == -1) {
	perror ("connect()");
	exit (1);
    }

    //connected to server. now send filename to server
    if (write (sfd, argv[1], strlen (argv[1])) < strlen (argv[1])) {
	perror ("write()");
	exit (1);
    }
    //now create the file for writing
    fd = open (argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0777);
    if (fd == -1) {
	perror ("open()");
	exit (1);
    }

    //start reading the file contents from the server
    while (1) {
	count = read (sfd, buffer, BUF_SIZE);
	if (count == -1) {
	    perror ("read()");
	    exit (1);
	}
	if (write (fd, buffer, count) < count) {
	    perror ("write()");
	    exit (1);
	}
	if (count < BUF_SIZE) // nothing more to read
	    break;
    }

    close (sfd);
    close (fd);
    return 0;
}


