- int fd, rc;
- struct sockaddr_un addr;
- size_t length;
-
- length = strlen(path);
- if (length >= 108) {
- errno = ENAMETOOLONG;
- return -1;
- }
-
- if (server && path[0] != '@')
- unlink(path);
-
- fd = socket(AF_UNIX, SOCK_STREAM, 0);
- if (fd < 0)
- return fd;
-
- memset(&addr, 0, sizeof addr);
- addr.sun_family = AF_UNIX;
- strcpy(addr.sun_path, path);
- if (addr.sun_path[0] == '@')
- addr.sun_path[0] = 0; /* implement abstract sockets */
- if (server) {
- rc = bind(fd, (struct sockaddr *) &addr, (socklen_t)(sizeof addr));
- } else {
- rc = connect(fd, (struct sockaddr *) &addr, (socklen_t)(sizeof addr));
- }
- if (rc < 0) {
- close(fd);
- return rc;
- }
- return fd;
-}
-
-static int api_ws_socket_inet(const char *path, int server)
-{
- int rc, fd;
- const char *service, *host, *api;
- struct addrinfo hint, *rai, *iai;
-
- /* scan the uri */
- api = strrchr(path, '/');
- service = strrchr(path, ':');
- if (api == NULL || service == NULL || api < service) {
- errno = EINVAL;
- return -1;
- }
- host = strndupa(path, service++ - path);
- service = strndupa(service, api - service);