return buf;
}
-/* ---------------------------------------------------------------------
- proc filesystem
- ------------------------------------------------------------------ */
-Bool VG_(is_procfs_mounted)(void)
-{
- static int have_proc_fs = -1;
-
- if (have_proc_fs < 0)
- {
- have_proc_fs
- = VG_(access)("/proc/self/fd", 1, 0, 0) == 0
- && VG_(access)("/proc/self/exe", 1, 0, 0) == 0
- && VG_(access)("/proc/self/maps", 1, 0, 0) == 0;
- }
- return have_proc_fs;
-}
-
/*--------------------------------------------------------------------*/
/*--- end ---*/
// when it tries to open /proc/<pid>/cmdline for itself.
// p: setup file descriptors
//--------------------------------------------------------------
- if (! VG_(is_procfs_mounted)()) {
- // client shouldn't be using /proc!
- VG_(cl_cmdline_fd) = -1;
- } else {
- if (!need_help) {
- HChar buf[50], buf2[50+64];
- HChar nul[1];
- Int fd, r;
- HChar* exename;
-
- VG_(debugLog)(1, "main", "Create fake /proc/<pid>/cmdline\n");
-
- VG_(sprintf)(buf, "proc_%d_cmdline", VG_(getpid)());
- fd = VG_(mkstemp)( buf, buf2 );
- if (fd == -1)
- VG_(err_config_error)("Can't create client cmdline file in /tmp.");
-
- nul[0] = 0;
- exename = VG_(args_the_exename) ? VG_(args_the_exename)
- : "unknown_exename";
- VG_(write)(fd, VG_(args_the_exename),
- VG_(strlen)( VG_(args_the_exename) ));
- VG_(write)(fd, nul, 1);
+#if !defined(VGO_linux)
+ // client shouldn't be using /proc!
+ VG_(cl_cmdline_fd) = -1;
+#else
+ if (!need_help) {
+ HChar buf[50], buf2[50+64];
+ HChar nul[1];
+ Int fd, r;
+ HChar* exename;
- for (i = 0; i < VG_(sizeXA)( VG_(args_for_client) ); i++) {
- HChar* arg = * (HChar**) VG_(indexXA)( VG_(args_for_client), i );
- VG_(write)(fd, arg, VG_(strlen)( arg ));
- VG_(write)(fd, nul, 1);
- }
+ VG_(debugLog)(1, "main", "Create fake /proc/<pid>/cmdline\n");
- /* Don't bother to seek the file back to the start; instead do
- it every time a copy of it is given out (by PRE(sys_open)).
- That is probably more robust across fork() etc. */
+ VG_(sprintf)(buf, "proc_%d_cmdline", VG_(getpid)());
+ fd = VG_(mkstemp)( buf, buf2 );
+ if (fd == -1)
+ VG_(err_config_error)("Can't create client cmdline file in /tmp.");
- /* Now delete it, but hang on to the fd. */
- r = VG_(unlink)( buf2 );
- if (r)
- VG_(err_config_error)("Can't delete client cmdline file in /tmp.");
+ nul[0] = 0;
+ exename = VG_(args_the_exename) ? VG_(args_the_exename)
+ : "unknown_exename";
+ VG_(write)(fd, VG_(args_the_exename),
+ VG_(strlen)( VG_(args_the_exename) ));
+ VG_(write)(fd, nul, 1);
- VG_(cl_cmdline_fd) = fd;
+ for (i = 0; i < VG_(sizeXA)( VG_(args_for_client) ); i++) {
+ HChar* arg = * (HChar**) VG_(indexXA)( VG_(args_for_client), i );
+ VG_(write)(fd, arg, VG_(strlen)( arg ));
+ VG_(write)(fd, nul, 1);
}
+
+ /* Don't bother to seek the file back to the start; instead do
+ it every time a copy of it is given out (by PRE(sys_open)).
+ That is probably more robust across fork() etc. */
+
+ /* Now delete it, but hang on to the fd. */
+ r = VG_(unlink)( buf2 );
+ if (r)
+ VG_(err_config_error)("Can't delete client cmdline file in /tmp.");
+
+ VG_(cl_cmdline_fd) = fd;
}
+#endif
//--------------------------------------------------------------
// Init tool part 1: pre_clo_init
}
PRE_MEM_RASCIIZ( "open(filename)", ARG1 );
- if (VG_(is_procfs_mounted)())
+#if defined(VGO_linux)
+ /* Handle the case where the open is of /proc/self/cmdline or
+ /proc/<pid>/cmdline, and just give it a copy of the fd for the
+ fake file we cooked up at startup (in m_main). Also, seek the
+ cloned fd back to the start. */
{
- /* Handle the case where the open is of /proc/self/cmdline or
- /proc/<pid>/cmdline, and just give it a copy of the fd for the
- fake file we cooked up at startup (in m_main). Also, seek the
- cloned fd back to the start. */
HChar name[30];
Char* arg1s = (Char*) ARG1;
SysRes sres;
return;
}
}
+#endif // defined(VGO_linux)
/* Otherwise handle normally */
*flags |= SfMayBlock;
PRE_MEM_WRITE( "readlink(buf)", ARG2,ARG3 );
{
+#if defined(VGO_linux)
/*
* Handle the case where readlink is looking at /proc/self/exe or
* /proc/<pid>/exe.
HChar name[25];
Char* arg1s = (Char*) ARG1;
VG_(sprintf)(name, "/proc/%d/exe", VG_(getpid)());
- if (VG_(is_procfs_mounted()) && ML_(safe_to_deref)(arg1s, 1) &&
+ if (ML_(safe_to_deref)(arg1s, 1) &&
(VG_STREQ(arg1s, name) || VG_STREQ(arg1s, "/proc/self/exe"))
)
{
SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, (UWord)name,
ARG2, ARG3));
} else
+#endif // defined(VGO_linux)
{
/* Normal case */
SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, ARG1, ARG2, ARG3));