#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <errno.h>

extern char *optarg;
extern int   optind;
void usage(char *);

#ifndef offsetof
#define offsetof(type, member) ((size_t) &((type *)0)->member)
#endif

#define BUFSIZE 1024
/*
 * This program creates a UNIX domain datagram socket, binds a
 * name to it, then reads from the socket.
 */
main(int argc, char *argv[])
{
   int sock, length;
   struct sockaddr_un name;
   int socklen;
   char buf[BUFSIZE];
   int opterr;
   int dflag = 0;
   char *program;
   char *socketname;
   char c;
   int n;
   
   program = strdup (*argv);
   while((c = getopt(argc, argv, "d")) != EOF)
   {
		   switch(c)
		   {
				   case 'd':
						   dflag++;
						   break;
				   default:
						   usage(program);
						   break;
		   }
   }
   if (argc < optind +1)
   {
		   usage(program);
   }
   socketname = strdup (argv[optind]);
   


   /* Create socket from which to read. */
   sock = socket(AF_UNIX, SOCK_DGRAM, 0);
   if (sock < 0) {
      perror("opening dgram socket");
      exit(1);
   }
  

   /* Create name. */
   name.sun_family = AF_UNIX;
   strcpy(name.sun_path, socketname);
   if (bind(sock, (struct sockaddr *)&name, SUN_LEN(&name))) {
      perror("binding name to datagram socket");
      exit(1);
   }

   printf("socket --> %s\n", socketname);
   /* Read from the socket. */
   while (( n = recvfrom(sock,
					   buf,
					   BUFSIZE,
					   0,
					   (struct sockaddr_un *)&name,
					   (socklen_t *)&socklen )) > 0)
   {
		   fprintf (stderr, "%s\n", buf);
   }
   fprintf (stderr, "Error: n=%d %s\n",n, strerror(errno));
   printf("\n");
   close(sock);
   unlink(socketname);
   exit (0);
}

void
usage (char *name)
{
       fprintf (stderr, "usage: %s [options] socketname\n", name);
	   fprintf (stderr, "       options are:\n");
	   fprintf (stderr, "       -d debug\n");
	   exit(1);
}
