#include <sys/types.h>
#include <sys/socket.h>

#include <netiso/iso.h>

#include <stdio.h>

const char NR[]= "UUUUUUUUUUUUUUUU\n";
#define NRL sizeof(NR)

char buf[256];
#define Nbuf sizeof(buf)

void
isoprint(struct sockaddr_iso *sa, socklen_t len) {
       int i;

       if (sa->siso_family != AF_ISO) {
               printf("Family not AF_ISO (%d), but %d\n",
                       AF_ISO, sa->siso_family);
               return;
       }
       if (len < sa->siso_len) {
               printf("sockaddr len truncated(%d < %d)\n",
                       len, sa->siso_len);
       }
       printf("nsap: [%d]{", sa->siso_nlen);

       for(i=0; i<sa->siso_nlen; i++) {
               printf(" %02x", sa->siso_data[i]);
       }
       printf(" } tsel: (", sa->siso_tlen);
       for(/*i=sa->siso_nlen*/;
                   i<sa->siso_nlen + sa->siso_tlen; i++) {

               printf(" %02x", sa->siso_data[i]);
       }
       printf(" )\n");
}

int
main()
{
       int s,r;
       int i,j;
       struct sockaddr_iso src,dst;
       socklen_t fromwherelen;
       struct sockaddr_iso myname;
       socklen_t mynamelen;

       struct sockaddr_iso fromwhere;

       memset(&src, 0, sizeof(src));
       memset(&dst, 0, sizeof(src));

       src.siso_len=sizeof(src);
       src.siso_family = AF_ISO;
       j=0;
#if 0
       src.siso_data[j++] = 0x12;
       src.siso_data[j++] = 0x34;
       src.siso_data[j++] = 0x56;
#endif
       src.siso_nlen=j;
       src.siso_tlen = 0;
       src.siso_data[j++] = 55;

       dst.siso_len=sizeof(src);
       dst.siso_family = AF_ISO;


       s = socket(PF_ISO, SOCK_DGRAM, ISOPROTO_CLTP);

       if (s < 0) {
         err(1, "socket");
       }

       r = bind(s, (struct sockaddr *) &src, sizeof(src));

       if (r < 0) {
         err(1, "bind");
       }

       mynamelen = sizeof(myname);

       r = getsockname(s, (struct sockaddr *)&myname, &mynamelen);
       if (r < 0)
         warn(1, "getsockname");

       else
               isoprint(&myname,mynamelen);

       while (1) {
               fromwherelen=sizeof(fromwhere);
               r = recvfrom(s, buf, Nbuf, 0,
                       (struct sockaddr *)&fromwhere, &fromwherelen);
               if (r < 0)
                       err(1, "recv");

               printf("Received message from ");
               isoprint(&fromwhere, fromwherelen);
               printf(":\n>>>%s<<<\n", buf);
       }

       return 0;
}