/* ---------- mcat.c ---------- */
/* Aufruf : mcat filename <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 () {
	close(sock);
}

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

	char* data;
	char filename[64];
	char destname[64];

	int port = DEFPORT;
	char ip[15] = DEFIP;
	
	char buffer[1024];

	int offset = 1;
	int length = 250;
	int ret;

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

	strcpy(filename, argv[1]);
	printf("Viewing file %s ...\n", filename);

	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));
		ret = read(sock, (void*) &buffer, sizeof(buffer));
		s_close();

		/* write to stdout */
		buffer[ret] = 0;
		printf("%s", buffer);

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

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

	}

}