/* aarecv.c */

/* This version receives from an atm socket and     */
/* copies to stdout.                                */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <signal.h>

#ifdef GLIBC_PATCH
#include <stdint.h>
#undef __GLIBC__
#include <linux/socket.h>
#include <linux/atm.h>
#else
#include <sys/socket.h>
#include <linux/types.h>
#endif


char buf[1024] = "This is a test";

int main(
int argc,
char **argv)
{
   struct sockaddr_atmpvc addr;
   struct atm_qos         qos;
   int    s,size,offset;
   int    rc;
   int    vci = 32;
   int    count;

   if (argc > 1)
      sscanf(argv[1], "%d", &vci);

   s = socket(PF_ATMPVC,SOCK_DGRAM,ATM_AAL5);
   printf("Socket call returned %d \n", s);

   qos.aal = 5;
   qos.txtp.traffic_class = ATM_UBR;
   qos.txtp.max_sdu = 768;
   qos.txtp.max_pcr = 5 * 1024 * 1024;
   qos.txtp.min_pcr = 1 * 1024 * 1024;
   qos.txtp.max_cdv = 1 * 1024 * 1024;

   qos.rxtp.traffic_class = ATM_UBR;
   qos.rxtp.max_sdu = 768;
   qos.rxtp.max_pcr = 5 * 1024 * 1024;
   qos.rxtp.min_pcr = 1 * 1024 * 1024;
   qos.rxtp.max_cdv = 1 * 1024 * 1024;

   rc = setsockopt(s, SOL_ATM, SO_ATMQOS, &qos, sizeof(qos));
   printf("Return from setsock is %d \n", rc);

   addr.sap_family   = AF_ATMPVC;
   addr.sap_addr.itf = 0;
   addr.sap_addr.vpi = 0;
   addr.sap_addr.vci = vci;

   while (rc = connect(s,(struct sockaddr *) &addr,sizeof(addr)))
   {
      printf("Connect returned %d \n", rc);
      count += 1;
      if (count >= 3)
      {
         printf("Connection on vci %d refused \n", vci);
         exit(1);
      }
      sleep(1);
   }
   printf("Return from connect is %d \n", rc);

   if (rc < 0)
      exit(1);

   memset(buf, 0, sizeof(buf));
   rc = read(s, buf, 768);

   while (rc >= 0)
   {

      write(1, buf, rc);
      memset(buf, 0, sizeof(buf));
      rc = read(s, buf, 768);
   /* printf("Read %d bytes \n", rc); */
   }

   if (rc < 0)
   {
      printf("Read socket returned %d \n", rc);
   }

   close(s);

}

