1
0
Fork 0
mirror of https://repo.or.cz/socat.git synced 2025-01-14 16:06:44 +00:00

Filan for Solaris: /proc/<pid>/path/

This commit is contained in:
Gerhard Rieger 2022-10-29 22:35:10 +02:00
parent e52675faed
commit c4281baabb
4 changed files with 27 additions and 7 deletions

View file

@ -69,6 +69,9 @@ Porting:
Fixed ancillary messages on Solaris.
Filan: Solaris has the open file path infos in /proc/<pid>/path/
Thanks to Andy Fiddaman to directing me to the patch.
Features:
Filan prints target of symlink when appropriate
Test: FILANSYMLINK

View file

@ -652,6 +652,7 @@
/* Define if you have the /proc/$$/fd directories */
#undef HAVE_PROC_DIR_FD
#undef HAVE_PROC_DIR_PATH
#undef HAVE_SETGRENT
#undef HAVE_GETGRENT

View file

@ -1985,6 +1985,16 @@ else
AC_MSG_RESULT(no)
fi
# On Solaris family, we have to use /proc/$$/path/N
AC_MSG_CHECKING(for /proc/*/path)
if test -d /proc/$$/path; then
AC_DEFINE(HAVE_PROC_DIR_PATH, 1)
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
dnl "tcpd" "tcpwrappers"
# on some platforms, raw linking with libwrap fails because allow_severity and
# deny_severity are not explicitely defined. Thus we put the libwrap part to

View file

@ -60,7 +60,7 @@ int fdname(const char *file, int fd, FILE *outfile, const char *numform,
}
}
#if HAVE_PROC_DIR_FD
#if HAVE_PROC_DIR_FD || HAVE_PROC_DIR_PATH
static int procgetfdname(int fd, char *filepath, size_t pathsize) {
static pid_t pid = -1;
char procpath[PATH_MAX];
@ -91,30 +91,36 @@ static int procgetfdname(int fd, char *filepath, size_t pathsize) {
#endif /* !HAVE_STAT64 */
if (pid < 0) pid = Getpid();
snprintf(procpath, sizeof(procpath), "/proc/"F_pid"/fd/%d", pid, fd);
snprintf(procpath, sizeof(procpath), "/proc/"F_pid"/"
#if HAVE_PROC_DIR_PATH
"path"
#else
"fd"
#endif
"/%d", pid, fd);
if ((len = Readlink(procpath, filepath, pathsize-1)) < 0) {
Error4("readlink(\"%s\", %p, "F_Zu"): %s",
Warn4("readlink(\"%s\", %p, "F_Zu"): %s",
procpath, filepath, pathsize, strerror(errno));
return -1;
len = 0;
}
filepath[len] = '\0';
return 0;
}
#endif /* HAVE_PROC_DIR_FD */
#endif /* HAVE_PROC_DIR_FD || HAVE_PROC_DIR_PATH */
int statname(const char *file, int fd, int filetype, FILE *outfile,
char style) {
char filepath[PATH_MAX];
filepath[0] = '\0';
#if HAVE_PROC_DIR_FD
#if HAVE_PROC_DIR_FD || HAVE_PROC_DIR_PATH
if (fd >= 0) {
procgetfdname(fd, filepath, sizeof(filepath));
if (filepath[0] == '/') {
file = filepath;
}
}
#endif /* HAVE_PROC_DIR_FD */
#endif /* HAVE_PROC_DIR_FD || HAVE_PROC_DIR_PATH */
/* now see for type specific infos */
switch (filetype) {
case (S_IFIFO>>12): /* 1, FIFO */