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;
}
Пример #2
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;
}