text: /*
   * vim:ts=4:sw=4:expandtab
   *
   * i3 - an improved dynamic tiling window manager
   * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
   *
   */
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <sys/un.h>
  #include <string.h>
  #include <err.h>
  #include <stdlib.h>
  
  #include "libi3.h"
  
  /*
   * Connects to the i3 IPC socket and returns the file descriptor for the
   * socket. die()s if anything goes wrong.
   *
   */
  int ipc_connect(const char *socket_path) {
      int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);
      if (sockfd == -1)
          err(EXIT_FAILURE, "Could not create socket");
  
      struct sockaddr_un addr;
      memset(&addr, 0, sizeof(struct sockaddr_un));
      addr.sun_family = AF_LOCAL;
      strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);
      if (connect(sockfd, (const struct sockaddr*)&addr, sizeof(struct sockaddr_un)) < 0)
          err(EXIT_FAILURE, "Could not connect to i3");
  
      return sockfd;
  }
  