/*
  TCPECHO ----/--+----- INET --- hostname ----+-- count --- text ---<
                 |                            |
                 +----- IUCV ---- userid -----+
 
To run:
1. GLOBAL LOADLIB SCEERUN
2. TCPECHO ....
 
To build:
1. GLOBAL TXTLIB SCEELKED CMSLIB
2. GLOBAL LOADLIB SCEERUN
3. CC tcpecho (sscomm
*/
#include "tcpecho.h"
int main ( int argc, char *argv[])
{
 int s, rc, socktype, socksize, ch, count, i;
 char *p;
 union {
  struct sockaddr_iucv siucv;
  struct sockaddr_in sinet;
 } mySock, hisSock;
 
 struct {
  char    userid[8];
  int     seqno;
  char    text[BUFFER_LEN];
 } buffer;
 
 
 struct clientid myClient;
 struct hostent *hostname;
 
 if (argc < 4) {
    rc = helpme();
    exit(rc);
   }
 
 /* Translate socket type to uppercase */
 for (ch=0; ch < strlen(argv[1]); ch++) {
    p = (char *)argv[1]+ch;
    memset(p,toupper(*p), 1);
 }
 if ( strcmp(argv[1],kINET) == 0)
   socktype = AF_INET;
 else {
   if (strcmp(argv[1],kIUCV) == 0)
     socktype = AF_IUCV;
   else {
    printf("Invalid socket type '%s'\a\n", argv[1]);
    rc = helpme();
    exit(rc);
   }
 }
 
 count = atoi(argv[3]);
 
 strcpy(buffer.userid, "________");
 strcpy(buffer.text, argv[4]);
 
 s = socket(socktype, SOCK_STREAM, 0);
 exit_if_error(Socket, s);
 
 Clear(mySock);
 Clear(hisSock);
 
 switch (socktype)
 {
  case AF_IUCV:
    printf("Using domain AF_IUCV\n");
    socksize = sizeof mySock.siucv;
 
    mySock.siucv.siucv_family = AF_IUCV;
    memcpy( mySock.siucv.siucv_name, CLIENT, 8);
    memset( mySock.siucv.siucv_nodeid, ' ', 8);
 
    hisSock.siucv.siucv_family = AF_IUCV;
    memcpy( hisSock.siucv.siucv_userid, argv[2], strlen(argv[2]) );
    for (ch=0; ch < strlen(argv[2]); ch++)
       toupper(*(hisSock.siucv.siucv_userid+ch));
    memcpy( hisSock.siucv.siucv_name, SERVER, 8);
    memset( hisSock.siucv.siucv_nodeid, ' ', 8);
    break;
 
  case AF_INET:
    printf("Using domain AF_INET\n");
    socksize = sizeof mySock.sinet;
 
    mySock.sinet.sin_family = AF_INET;
    mySock.sinet.sin_addr.s_addr = INADDR_ANY;
 
    hisSock.sinet.sin_family = AF_INET;
    if (isdigit(*argv[2]))
      hisSock.sinet.sin_addr.s_addr = inet_addr(argv[2]);
    else {
      hostname = gethostbyname(argv[2]);
 
      if (hostname == NULL) {
        printf("Host %s not known\a\n",argv[2]);
        exit(-1);
      } else {
        printf("Host %s is %s\n", hostname->h_name,
             inet_ntoa(*(struct in_addr *)(hostname->h_addr)) );
        hisSock.sinet.sin_addr = *(struct in_addr *)(hostname->h_addr);
      }
    }
    hisSock.sinet.sin_port = SERVER_PORT;
 
    rc = getclientid( AF_INET, &myClient);
    exit_if_error(getclientid, rc);
 
    memcpy(buffer.userid, myClient.c_name.name, 8);
    break;
  default:
    break;
 }
 
 rc = bind(s, (struct sockaddr *)&mySock, socksize);
 exit_if_error(bind, rc);
 
 rc = connect(s, (struct sockaddr *) &hisSock, socksize);
 exit_if_error(connect, rc);
 
 for (i=1; i <= count; i++) {
   buffer.seqno = i;
   rc = send(s, (char *)&buffer, sizeof buffer, 0);
   exit_if_error(send, rc);
 }
 
 rc = close(s);
 exit_if_error(close, rc);
 
 printf("%d copies of '%s' have been sent to %s\n", count,
                                                argv[4], argv[2]);
 exit(0);
}
 
int helpme( void ) {
 printf(
   "TCPECHO --/--+-- INET -- hostname --+-- count -- text --<\a\n"
   "             |                      |                    \n"
   "             +-- IUCV --- userid ---+                    \n"
 );
 return(24);
}