int uic_connect (int *fd) { int res; struct sockaddr_un addr; memset (&addr, 0, sizeof (struct sockaddr_un)); #if defined(OPENAIS_BSD) || defined(OPENAIS_DARWIN) addr.sun_len = sizeof(struct sockaddr_un); #endif addr.sun_family = PF_UNIX; #if defined(OPENAIS_LINUX) strcpy (addr.sun_path + 1, socketname); #else strcpy (addr.sun_path, socketname); #endif *fd = socket (PF_UNIX, SOCK_STREAM, 0); if (*fd == -1) { return -errno; } res = connect (*fd, (struct sockaddr *)&addr, AIS_SUN_LEN(&addr)); if (res == -1) { return -errno; } return 0; }
static void uis_lcr_bind (int *server_fd) { int fd; struct sockaddr_un un_addr; int res; /* * Create socket for lcr clients, name socket, listen for connections */ fd = socket (PF_UNIX, SOCK_STREAM, 0); if (fd == -1) { perror ("uis_lcr_bind failed"); *server_fd = -1; return; }; #if !defined(COROSYNC_LINUX) unlink(socketname); #endif memset (&un_addr, 0, sizeof (struct sockaddr_un)); #if defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN) un_addr.sun_len = sizeof(struct sockaddr_un); #endif un_addr.sun_family = AF_UNIX; #if defined(COROSYNC_LINUX) strcpy (un_addr.sun_path + 1, socketname); #else strcpy (un_addr.sun_path, socketname); #endif res = bind (fd, (struct sockaddr *)&un_addr, AIS_SUN_LEN(&un_addr)); if (res) { char error_str[100]; const char *error_ptr; #ifdef _GNU_SOURCE /* The GNU version of strerror_r returns a (char*) that *must* be used */ error_ptr = strerror_r(errno, error_str, sizeof(error_str)); #else /* The XSI-compliant strerror_r() return 0 or -1 (in case the buffer is full) */ strerror_r(errno, error_str, sizeof(error_str)); error_ptr = error_str; #endif printf ("Could not bind AF_UNIX: %s\n", error_ptr); } listen (fd, SERVER_BACKLOG); *server_fd = fd; }