/*
   client server model [client]

   enviroment : TEST_PORT .. port no. of socket
                TEST_HOST .. host name for server

   > cli
   12345      <-- input
   12345      --> echo from server
   C_Quit     <-- input
                  cli quit
   C_Close    <-- input
                  client close 
   DS_C_Quit  <-- input
                  client and dedicated server quit
*/
#include "tcp.h"
char    *uname;

int main(int argc,char *argv[]) {
   int                sockfd,ret,newsockfd,clilen,childpid;
   struct sockaddr_in srv_addr,cli_addr;
   struct hostent     *ent;
   struct in_addr     *ip;

     uname = argv[0];
     PRT_TRS("s:socket()\n");
     if (( sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
        die_err(1);
     }
     PRT_TRS("e:socket()\n");
/* set addr   */
     get_env();                    /* get host_name/port_no    */
     ent = gethostbyname(host_nm);
     if (! ent) die_err(30);
     {
       u_char a1,a2,a3,a4;

         ip = (struct in_addr *)ent->h_addr_list[0];
         if (! ip)   die_err(35);
         printf("Server Host [%s] ",host_nm);
#ifdef SUN
         a1 = ip->s_net;
         a2 = ip->s_host;
         a3 = ip->s_lh;
         a4 = ip->s_impno;
         printf("is %d.%d.%d.%d\n",a1,a2,a3,a4);
#endif
     }
     bzero((char *) &srv_addr,SZ_ADDR);
     srv_addr.sin_family         = AF_INET;
     srv_addr.sin_addr.s_addr    = ip->s_addr;
     srv_addr.sin_port           = htons(port_no);

     PRT_TRS("s:connect()\n");
     ret = connect(sockfd,(struct sockaddr *) &srv_addr,SZ_ADDR);
     PRT_TRS("e:connect()\n");
     if (ret == -1)  die_err(2);

     ret = str_cli(stdin,sockfd);
     if (ret != CLOSED) close(sockfd);
     exit(0);
}

int str_cli(FILE *fp,int sockfd) {
   int   n,ret=0;
   char  sendline[MAX_LINE],recvline[MAX_LINE+1];

   while (fgets(sendline,MAX_LINE,fp) != NULL) {
      if (! strcmp(sendline,C_QUIT))     return ret;
      n = strlen(sendline);
      if (writen(sockfd,sendline,n) != n)  die_err(10);
      n = readline(sockfd,recvline,MAX_LINE);
      if (n < 0)     die_err(12);
      recvline[n] = 0;
      printf("Back string : %s",recvline);
      if (! strcmp(sendline,DS_C_QUIT))  return ret;
      if (! strcmp(sendline,C_CLOSE)) {
         close(sockfd);
         ret = CLOSED;
      }
      if (! strcmp(sendline,CQUIT_SWQUIT))  {
         close(sockfd);
         ret = CLOSED;
         return ret;
      }
   }
   if (ferror(fp))      die_err(13);
}

int readline(int fd,char *ptr, int maxlen) {
   int   n,rc;
   char  c;

   for (n=1; n<maxlen; n++) {
      if ((rc = read(fd,&c,1)) == 1) {
         *ptr++ = c;
         if (c == '\n')   break;
      }
      else if (rc == 0) {
         if (n == 1)   return (0);
         else          break;
      }  else          return (-1);
   }
   *ptr = 0;
   return (n);
}

int writen(int fd,char *ptr,int nbytes) {
   int   nleft,nwritten;

   nleft = nbytes;
   while (nleft > 0)  {
      nwritten  = write(fd,ptr,nleft);
      if (nwritten <= 0)  return (nwritten);
      nleft    -= nwritten;
      ptr      += nwritten;
   }
   return (nbytes - nleft);
}
   
void usage() {
}

void die_err(int no) {
  perror(uname);
  exit(no);
}