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

#define	SERVER	"sock_s"

int main()
{
  int	listen_fd, fd, rc, len;
  struct sockaddr_un	unix_addr;
  char	buf[256];

  /* ソケットを作る	*/
  listen_fd = socket(AF_UNIX, SOCK_STREAM, 0);
  if(listen_fd < 0){
    printf("server:socket error.\n");
    exit(rc);
  }
  printf("server:socket.\n");

  /* ソケットに名前を付ける(SERVER)	*/
  unix_addr.sun_family = AF_UNIX;
  strcpy(unix_addr.sun_path, SERVER);
  len = sizeof(unix_addr.sun_family)+strlen(unix_addr.sun_path);
  rc = bind(listen_fd, (struct sockaddr *)&unix_addr, len);
  if(rc < 0){
    printf("server:bind error.\n");
    exit(rc);
  }
  printf("server:bind.\n");

  /* SERVERはconnect可能だよ	*/
  rc = listen(listen_fd, 5);
  if(rc < 0){
    printf("server:listen error.\n");
    exit(rc);
  }
  printf("server:listen.\n");

  /* SERVERはクライアントからのconnectを待つ	*/
  len = sizeof(unix_addr);
  fd = accept(listen_fd, (struct sockaddr *)&unix_addr, &len);
  if(fd < 0){
    printf("server:accept error.\n");
    exit(fd);
  }
  printf("server:accept.\n");

  /* acceptしたソケットから受信	*/
  rc = recv(fd, buf, 256, 0);
  if(rc < 0){
    printf("server:recv error.\n");
    exit(rc);
  }
  printf("server:recv %s.\n", buf);

  /* 後始末	*/
  shutdown(listen_fd, 2);
  close(listen_fd);
  unlink(SERVER);

  return 0;
}
