/* ---------- mcp.c ---------- */
/* Aufruf : mcp filename destname <Server-Port> <Server-IP> */

#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define DEFPORT 4000
#define DEFIP "127.0.0.1"

int sock;
int ret;
struct sockaddr_in servaddr;
char buffer[16384];
	

void s_bind (int port, char* ip) {
        strcpy(buffer, "");
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == -1) {
		perror("socket() error");
		exit(1);
	}
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(inet_addr(ip));
	servaddr.sin_port = htons(port);
	
	ret = connect(sock, (struct sockaddr *) &servaddr, sizeof(servaddr));
	if (ret == -1) {
		perror("connect() error");
		exit(1);
	}
}

void s_close () {
	ret = read(sock, (void *) &buffer, sizeof(buffer));
	buffer[ret] = '\0';
	printf("Reply: %s\n", buffer);
	close(sock);
}

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

	char* data;
	int offset = 1;
	int length = 5;
	char filename[64];
	char destname[64];
	
	int port = DEFPORT;
	char ip[15] = DEFIP;
	
	char buffer[1024];

        /* check for port */
        if (argc == 4) {
            port = atoi(argv[3]);
        }

	strcpy(filename, argv[1]);
	strcpy(destname, argv[2]);

        /* create destination file */
	s_bind(port, ip);
	sprintf(buffer, "c %s\r\n", destname);
	write(sock, buffer, strlen(buffer));
	read(sock, (void*) &buffer, sizeof(buffer));
	printf("Reply from server : %s", buffer);
	s_close();

	while (1) {

		/* read <length> bytes from file */
		s_bind(port, ip);
		sprintf(buffer, "r %s %d %d\r\n", filename, offset, length);
		ret = write(sock, buffer, strlen(buffer));
		strcpy(buffer, ""); buffer[0] = 0;
		ret = read(sock, (char*) &data, sizeof(data));
		s_close();

		/* append to destination file */
		buffer[ret] = 0;
		strcpy(buffer, ""); buffer[0] = 0;
		s_bind(port, ip);

		sprintf(buffer, "a %s %s\r\n", destname, data);

		printf(buffer);
		write(sock, buffer, strlen(buffer));
		s_close();

		/* write to stdout */
		/*printf("%s", buffer);*/

		if (ret < length) {
			printf("\ndone ...\n");
			exit(0);
		}

		offset = offset + length;
		strcpy(buffer, ""); buffer[0] = 0;

	}

}