diff --git a/attach.c b/attach.c index a4ae626..45788e2 100644 --- a/attach.c +++ b/attach.c @@ -156,6 +156,28 @@ attach_main(int noerror) /* Attempt to open the socket. Don't display an error if noerror is ** set. */ s = connect_socket(sockname); + if (s < 0 && errno == ENAMETOOLONG) + { + char *slash = strrchr(sockname, '/'); + + /* Try to shorten the socket's path name by using chdir. */ + if (slash) + { + int dirfd = open(".", O_RDONLY); + + if (dirfd >= 0) + { + *slash = '\0'; + if (chdir(sockname) >= 0) + { + s = connect_socket(slash + 1); + fchdir(dirfd); + } + *slash = '/'; + close(dirfd); + } + } + } if (s < 0) { if (!noerror) diff --git a/master.c b/master.c index 86195d1..146110d 100644 --- a/master.c +++ b/master.c @@ -561,6 +561,28 @@ master_main(char **argv, int waitattach, int dontfork) /* Create the unix domain socket. */ s = create_socket(sockname); + if (s < 0 && errno == ENAMETOOLONG) + { + char *slash = strrchr(sockname, '/'); + + /* Try to shorten the socket's path name by using chdir. */ + if (slash) + { + int dirfd = open(".", O_RDONLY); + + if (dirfd >= 0) + { + *slash = '\0'; + if (chdir(sockname) >= 0) + { + s = create_socket(slash + 1); + fchdir(dirfd); + } + *slash = '/'; + close(dirfd); + } + } + } if (s < 0) { printf("%s: %s: %s\n", progname, sockname, strerror(errno));