PERFORCE change 167784 for review
Stanislav Sedov
stas at FreeBSD.org
Tue Aug 25 11:44:16 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167784
Change 167784 by stas at stas_yandex on 2009/08/25 11:43:32
- Add resolve_pathname implementation to libcfile.
Affected files ...
.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-common.c#7 edit
.. //depot/projects/valgrind/coregrind/m_libcfile.c#10 edit
Differences ...
==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-common.c#7 (text+ko) ====
@@ -353,7 +353,6 @@
Int mib[4];
SysRes sres;
vki_size_t len;
- Int cnt;
Char *bp, *eb;
struct vki_kinfo_file *kf;
==== //depot/projects/valgrind/coregrind/m_libcfile.c#10 (text+ko) ====
@@ -74,10 +74,14 @@
return newfd;
}
+#if defined(VGO_freebsd)
+#define M_FILEDESC_BUF 1000000
+static Char filedesc_buf[M_FILEDESC_BUF];
+#endif
+
/* Given a file descriptor, attempt to deduce its filename. To do
this, we use /proc/self/fd/<FD>. If this doesn't point to a file,
or if it doesn't exist, we return False. */
-#if !defined(VGO_freebsd)
Bool VG_(resolve_filename) ( Int fd, HChar* buf, Int n_buf )
{
# if defined(VGO_linux)
@@ -89,6 +93,38 @@
else
return False;
+#elif defined(VGO_freebsd)
+ Int mib[4];
+ SysRes sres;
+ vki_size_t len;
+ Char *bp, *eb;
+ struct vki_kinfo_file *kf;
+
+ mib[0] = VKI_CTL_KERN;
+ mib[1] = VKI_KERN_PROC;
+ mib[2] = VKI_KERN_PROC_FILEDESC;
+ mib[3] = sr_Res(VG_(do_syscall0)(__NR_getpid));
+ len = sizeof(filedesc_buf);
+ sres = VG_(do_syscall6)(__NR___sysctl, (UWord)mib, 4, (UWord)filedesc_buf,
+ (UWord)&len, 0, 0);
+ if (sr_isError(sres)) {
+ VG_(debugLog)(0, "sysctl(kern.proc.filedesc)", "%s\n", VG_(strerror)(sr_Err(sres)));
+ return False;
+ }
+ /* Walk though the list. */
+ bp = filedesc_buf;
+ eb = filedesc_buf + len;
+ while (bp < eb) {
+ kf = (struct vki_kinfo_file *)bp;
+ if (kf->kf_fd == fd)
+ break;
+ bp += kf->kf_structsize;
+ }
+ if (bp >= eb || *kf->kf_path == '\0')
+ return False;
+ VG_(strncpy)( buf, kf->kf_path, n_buf );
+ return True;
+
# elif defined(VGO_aix5)
I_die_here; /* maybe just return False? */
return False;
@@ -108,37 +144,6 @@
# error Unknown OS
# endif
}
-#else
-Bool VG_(resolve_filename) ( Int fd, HChar* buf, Int n_buf )
-{
- static int nr_fromfd = -1;
- SysRes res;
-
- VG_(memset)(buf, 0, n_buf);
- if (nr_fromfd == -1) {
- Int error, sc;
- vki_size_t scl;
-
- scl = sizeof(sc);
- sc = -1;
-#warning XXX: wtf?
- error = VG_(sysctlbyname)("machdep.getpath_fromfd_num", &sc, &scl, 0, 0);
- if (error != -1 && sc > 0)
- nr_fromfd = sc;
- if (nr_fromfd == -1)
- nr_fromfd = -2;
- }
- if (nr_fromfd < 0)
- return False;
-
- res = VG_(do_syscall3)(nr_fromfd, fd, (UWord)buf, n_buf);
- if (!sr_isError(res) && buf[0] == '/') {
- return True;
- } else {
- return False;
- }
-}
-#endif
SysRes VG_(open) ( const Char* pathname, Int flags, Int mode )
{
More information about the p4-projects
mailing list