Date: Thu, 20 Aug 2009 15:27:02 GMT From: Stanislav Sedov <stas@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 167541 for review Message-ID: <200908201527.n7KFR2w8052918@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=167541 Change 167541 by stas@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 //----------------------------------------------------------------------help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908201527.n7KFR2w8052918>
