#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;
}
