forked from OSchip/llvm-project
[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:
parent
0663844b06
commit
bfd84b1c03
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue