diff options
| author | Ned T. Crigler <crigler@users.sourceforge.net> | 2014-08-04 12:51:15 -0700 |
|---|---|---|
| committer | Ned T. Crigler <crigler@users.sourceforge.net> | 2014-08-04 13:00:24 -0700 |
| commit | b7d5154c18cb57dd5680114315fbc4175cf1ea26 (patch) | |
| tree | df8d256ff73078eef12bc045a70ea25c27c200ce | |
| parent | a51207bf473193016e38814ceea27335f517cb16 (diff) | |
Try to use chdir to get around the sun_path length limit.
If a socket's path name would overflow sun_path, try to make it fit by
temporarily changing to the directory the socket is in and using the
path's basename in sun_path.
This should help for the case where the basename of the socket does fit
in sun_path, even if the rest of the path doesn't.
| -rw-r--r-- | attach.c | 22 | ||||
| -rw-r--r-- | master.c | 22 |
2 files changed, 44 insertions, 0 deletions
@@ -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) @@ -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)); |
