Date: Sat, 3 Oct 2015 12:49:05 +0000 (UTC) From: Hiroki Sato <hrs@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r288602 - head/bin/cat Message-ID: <201510031249.t93Cn5rW099160@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: hrs Date: Sat Oct 3 12:49:05 2015 New Revision: 288602 URL: https://svnweb.freebsd.org/changeset/base/288602 Log: Use getaddrinfo() to fill struct sockaddr_un. It now supports SOCK_DGRAM and SOCK_SEQPACKET in addition to SOCK_STREAM. Modified: head/bin/cat/cat.c Modified: head/bin/cat/cat.c ============================================================================== --- head/bin/cat/cat.c Sat Oct 3 12:40:54 2015 (r288601) +++ head/bin/cat/cat.c Sat Oct 3 12:49:05 2015 (r288602) @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include <sys/socket.h> #include <sys/un.h> #include <errno.h> +#include <netdb.h> #endif #include <ctype.h> @@ -302,31 +303,39 @@ raw_cat(int rfd) static int udom_open(const char *path, int flags) { - struct sockaddr_un sou; - int fd; - unsigned int len; - - bzero(&sou, sizeof(sou)); + struct addrinfo hints, *res, *res0; + char rpath[PATH_MAX]; + int fd, error; /* - * Construct the unix domain socket address and attempt to connect + * Construct the unix domain socket address and attempt to connect. */ - fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd >= 0) { - sou.sun_family = AF_UNIX; - if ((len = strlcpy(sou.sun_path, path, - sizeof(sou.sun_path))) >= sizeof(sou.sun_path)) { - close(fd); - errno = ENAMETOOLONG; + bzero(&hints, sizeof(hints)); + hints.ai_family = AF_LOCAL; + if (realpath(path, rpath) == NULL) + return (-1); + error = getaddrinfo(rpath, NULL, &hints, &res0); + if (error) { + warn("%s", gai_strerror(error)); + errno = EINVAL; + return (-1); + } + for (res = res0; res != NULL; res = res->ai_next) { + fd = socket(res->ai_family, res->ai_socktype, + res->ai_protocol); + if (fd < 0) { + freeaddrinfo(res0); return (-1); } - len = offsetof(struct sockaddr_un, sun_path[len+1]); - - if (connect(fd, (void *)&sou, len) < 0) { + error = connect(fd, res->ai_addr, res->ai_addrlen); + if (error == 0) + break; + else { close(fd); fd = -1; } } + freeaddrinfo(res0); /* * handle the open flags by shutting down appropriate directions
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510031249.t93Cn5rW099160>