svn commit: r288602 - head/bin/cat
Hiroki Sato
hrs at FreeBSD.org
Sat Oct 3 12:49:06 UTC 2015
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
More information about the svn-src-all
mailing list