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; }
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; }