Example #1
0
static int unix_stream_connect(const char *path, struct watchman_error *error)
{
    struct sockaddr_un sa;
    struct unix_sockaddr_context ctx;

    if (unix_sockaddr_init(&sa, path, &ctx) < 0) {
        return -1;
    }
    int fd = unix_stream_socket();
    if (fd < 0) {
        return -1;
    }
    if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
        watchman_err(error, WATCHMAN_ERR_CONNECT, "Connect error %s",
                     strerror(errno));

        if (unix_sockaddr_cleanup(&ctx, error)) {
            error->code |= WATCHMAN_ERR_CWD;
        }
        close(fd);
        return -1;
    }
    if (unix_sockaddr_cleanup(&ctx, error)) {
        close(fd);
        return -1;
    }
    return fd;
}
Example #2
0
int unix_stream_listen(const char *path)
{
	int fd, saved_errno;
	struct sockaddr_un sa;
	struct unix_sockaddr_context ctx;

	unlink(path);

	if (unix_sockaddr_init(&sa, path, &ctx) < 0)
		return -1;
	fd = unix_stream_socket();

	if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0)
		goto fail;

	if (listen(fd, 5) < 0)
		goto fail;

	unix_sockaddr_cleanup(&ctx);
	return fd;

fail:
	saved_errno = errno;
	unix_sockaddr_cleanup(&ctx);
	close(fd);
	errno = saved_errno;
	return -1;
}