/* Client fuer Fileserver
 * Als Kommandozeilenparameter werden der Servername und der Dateiname
 * uebergeben. Das Programm versucht dann, diese Datei vom Server zu
 * laden, indem es den Dateinamen sendet;  und gibt diese dann auf der 
 * Standardausgabe aus
 */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

/* Port fuer die Requests */
#define PORT 7777

/* Puffergroesse */
#define BUFSIZE 4096

/* Fehlermeldung ausgeben und exit */
void err_exit(char *message)
  {
  perror(message);
  exit(1);
  }

int main(int argc, char* argv[])
  {
  int sockd;
  int count;
  struct sockaddr_in serv_name;
  struct hostent *host;
  char buf[BUFSIZE];
  int status;

  if (argc < 3)
    {
    fprintf(stderr, "Usage: %s servername filename\n", argv[0]);
    exit(1);
    }

  host = gethostbyname(argv[1]);
  if (host == NULL)
    {
    fprintf(stderr, "Unbekannter Host %s\n",argv[1]);
    return -1;
    }

  /* create a socket */
  sockd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockd == -1)
    err_exit("Socket creation");

  /* server address */
  memset( &serv_name, 0, sizeof (serv_name));
  serv_name.sin_family = AF_INET;
  serv_name.sin_addr = *((struct in_addr *)host->h_addr);
  serv_name.sin_port = htons(PORT);

  /* connect to the server */
  status = connect(sockd, (struct sockaddr*)&serv_name, sizeof(serv_name));
  if (status == -1)
    err_exit("Connection error");

  write(sockd, argv[2], strlen(argv[2])+1);
  shutdown(sockd, 1);
  while ((count = read(sockd, buf, BUFSIZE)) > 0)
    { write(1, buf, count); }
  if (count == -1)
    err_exit("Read error");

  close(sockd);
  return 0;
  }

