[SystemZ/ZOS] Implement getMainExecutable() and is_local_impl()

Adds implementation of getMainExecutable() and is_local_impl() to
Support/Unix/Path.inc. Both are needed to compile LLVM for z/OS.

Reviewed By: hubert.reinterpretcast, emaste

Differential Revision: https://reviews.llvm.org/D82544
This commit is contained in:
Kai Nacke 2020-07-06 05:53:29 -04:00
parent 0663844b06
commit bfd84b1c03
1 changed files with 34 additions and 3 deletions

View File

@ -48,6 +48,8 @@ extern char **environ;
#endif
#elif defined(__DragonFly__)
#include <sys/mount.h>
#elif defined(__MVS__)
#include <sys/ps.h>
#endif
// Both stdio.h and cstdio are included via different paths and
@ -56,9 +58,13 @@ extern char **environ;
#undef ferror
#undef feof
#if !defined(PATH_MAX)
// For GNU Hurd
#if defined(__GNU__) && !defined(PATH_MAX)
# define PATH_MAX 4096
#if defined(__GNU__)
#define PATH_MAX 4096
#elif defined(__MVS__)
#define PATH_MAX _XOPEN_PATH_MAX
#endif
#endif
#include <sys/types.h>
@ -100,7 +106,8 @@ typedef uint_t uint;
#define STATVFS_F_FRSIZE(vfs) static_cast<uint64_t>(vfs.f_bsize)
#endif
#if defined(__NetBSD__) || defined(__DragonFly__) || defined(__GNU__)
#if defined(__NetBSD__) || defined(__DragonFly__) || defined(__GNU__) || \
defined(__MVS__)
#define STATVFS_F_FLAG(vfs) (vfs).f_flag
#else
#define STATVFS_F_FLAG(vfs) (vfs).f_flags
@ -265,6 +272,26 @@ std::string getMainExecutable(const char *argv0, void *MainAddr) {
// Fall back to the classical detection.
if (getprogpath(exe_path, argv0))
return exe_path;
#elif defined(__MVS__)
int token = 0;
W_PSPROC buf;
char exe_path[PS_PATHBLEN];
pid_t pid = getpid();
memset(&buf, 0, sizeof(buf));
buf.ps_pathptr = exe_path;
buf.ps_pathlen = sizeof(exe_path);
while (true) {
if ((token = w_getpsent(token, &buf, sizeof(buf))) <= 0)
break;
if (buf.ps_pid != pid)
continue;
char real_path[PATH_MAX];
if (realpath(exe_path, real_path))
return std::string(real_path);
break; // Found entry, but realpath failed.
}
#elif defined(HAVE_DLFCN_H) && defined(HAVE_DLADDR)
// Use dladdr to get executable path if available.
Dl_info DLInfo;
@ -493,6 +520,10 @@ static bool is_local_impl(struct STATVFS &Vfs) {
// vmount entry not found; "remote" is the conservative answer.
return false;
#elif defined(__MVS__)
// The file system can have an arbitrary structure on z/OS; must go with the
// conservative answer.
return false;
#else
return !!(STATVFS_F_FLAG(Vfs) & MNT_LOCAL);
#endif