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