PERFORCE change 167541 for review

Stanislav Sedov stas at FreeBSD.org
Thu Aug 20 15:27:03 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=167541

Change 167541 by stas at stas_yandex on 2009/08/20 15:26:15

	- Implement resolve_pathname.

Affected files ...

.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-common.c#6 edit
.. //depot/projects/valgrind/include/vki/vki-freebsd.h#16 edit

Differences ...

==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-common.c#6 (text+ko) ====

@@ -332,6 +332,11 @@
    return False;
 }
 
+#if defined(VGO_freebsd)
+#define	M_FILEDESC_BUF	1000000
+static Char filedesc_buf[M_FILEDESC_BUF];
+#endif
+   
 Bool ML_(am_resolve_filename) ( Int fd, /*OUT*/HChar* buf, Int nbuf )
 {
 #if defined(VGO_linux)
@@ -345,9 +350,38 @@
       return False;
 
 #elif defined(VGO_freebsd)
-   I_die_here; /* maybe just return False? */
-   return False;
+   Int mib[4];
+   SysRes sres;
+   vki_size_t len;
+   Int cnt;
+   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)));
+       ML_(am_exit)(1);
+   }
+   /* 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, nbuf );
+   VG_(debugLog)(0, "aspacem", "Valgrind: found %s for %d\n", kf->kf_path, fd);
+   return True;
 #elif defined(VGO_aix5)
    I_die_here; /* maybe just return False? */
    return False;

==== //depot/projects/valgrind/include/vki/vki-freebsd.h#16 (text+ko) ====

@@ -1897,6 +1897,25 @@
 	int	kve_ispare[3];
 };
 
+struct vki_kinfo_file {
+        int     kf_structsize;                  /* Variable size of record. */
+        int     kf_type;                        /* Descriptor type. */
+        int     kf_fd;                          /* Array index. */
+        int     kf_ref_count;                   /* Reference count. */
+        int     kf_flags;                       /* Flags. */
+        int     _kf_pad0;                       /* Round to 64 bit alignment */
+        Off64T  kf_offset;                      /* Seek location. */
+        int     kf_vnode_type;                  /* Vnode type. */
+        int     kf_sock_domain;                 /* Socket domain. */
+        int     kf_sock_type;                   /* Socket type. */
+        int     kf_sock_protocol;               /* Socket protocol. */
+        char    kf_sa_local[128];               /* Socket address. */
+        char    kf_sa_peer[128];                /* Peer address. */
+        int     _kf_ispare[16];                 /* Space for more stuff. */
+        /* Truncated before copyout in sysctl */
+        char    kf_path[VKI_PATH_MAX];          /* Path to file, if any. */
+};
+
 #if defined(VGP_x86_freebsd)
 /* Special case.. adapt to what the 64 bit kernel gives us */
 struct vki_kinfo_vmentry_32on64 {
@@ -1927,6 +1946,7 @@
 #define VKI_CTL_HW           6
 #define VKI_KERN_PROC        14
 #define VKI_KERN_PROC_VMMAP  13
+#define VKI_KERN_PROC_FILEDESC 33
 #define VKI_HW_MACHINE       1
 
 //----------------------------------------------------------------------


More information about the p4-projects mailing list