From patchwork Sat Sep 8 00:36:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Baldwin X-Patchwork-Id: 29241 Received: (qmail 34779 invoked by alias); 8 Sep 2018 00:46:56 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 34688 invoked by uid 89); 8 Sep 2018 00:46:45 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS, SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy= X-HELO: mail.baldwin.cx Received: from bigwig.baldwin.cx (HELO mail.baldwin.cx) (96.47.65.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 08 Sep 2018 00:46:43 +0000 Received: from ralph.com (ralph.baldwin.cx [66.234.199.215]) by mail.baldwin.cx (Postfix) with ESMTPSA id 5894C10B476 for ; Fri, 7 Sep 2018 20:38:13 -0400 (EDT) From: John Baldwin To: gdb-patches@sourceware.org Subject: [PATCH 4/5] Support 'info proc files' on live FreeBSD processes. Date: Fri, 7 Sep 2018 17:36:58 -0700 Message-Id: <20180908003659.37482-5-jhb@FreeBSD.org> In-Reply-To: <20180908003659.37482-1-jhb@FreeBSD.org> References: <20180908003659.37482-1-jhb@FreeBSD.org> X-IsSubscribed: yes This walks the list of struct kinfo_file objects returned by a call to kinfo_getfile outputting a description of each open file descriptor. gdb/ChangeLog: * fbsd-nat.c (fbsd_nat_target::info_proc): List open file descriptors for IP_FILES and IP_ALL. --- gdb/ChangeLog | 5 +++++ gdb/fbsd-nat.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e3d9f40d02..fb62bc55ea 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-09-07 John Baldwin + + * fbsd-nat.c (fbsd_nat_target::info_proc): List open file + descriptors for IP_FILES and IP_ALL. + 2018-09-07 John Baldwin * fbsd-tdep.c (KF_FLAGS, KF_OFFSET, KF_VNODE_TYPE, KF_SOCK_DOMAIN) diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index a255318d14..d7db03336e 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -266,6 +266,9 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what) bool do_cmdline = false; bool do_cwd = false; bool do_exe = false; +#ifdef HAVE_KINFO_GETFILE + bool do_files = false; +#endif #ifdef HAVE_KINFO_GETVMMAP bool do_mappings = false; #endif @@ -296,10 +299,18 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what) case IP_CWD: do_cwd = true; break; +#ifdef HAVE_KINFO_GETFILE + case IP_FILES: + do_files = true; + break; +#endif case IP_ALL: do_cmdline = true; do_cwd = true; do_exe = true; +#ifdef HAVE_KINFO_GETFILE + do_files = true; +#endif #ifdef HAVE_KINFO_GETVMMAP do_mappings = true; #endif @@ -323,7 +334,7 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what) printf_filtered (_("process %d\n"), pid); #ifdef HAVE_KINFO_GETFILE - if (do_cwd || do_exe) + if (do_cwd || do_exe || do_files) fdtbl.reset (kinfo_getfile (pid, &nfd)); #endif @@ -375,6 +386,37 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what) else warning (_("unable to fetch executable path name")); } +#ifdef HAVE_KINFO_GETFILE + if (do_files) + { + struct kinfo_file *kf = fdtbl.get (); + + if (nfd > 0) + { + printf_filtered (_("Open files:\n\n")); + printf_filtered (" %6s %6s %10s %9s %s\n", + "FD", "Type", "Offset", "Flags ", "Name"); + for (int i = 0; i < nfd; i++, kf++) + { + printf_filtered (" %6s %6s %10s %8s ", + fbsd_file_fd (kf->kf_fd), + fbsd_file_type (kf->kf_type, kf->kf_vnode_type), + kf->kf_offset > -1 ? hex_string (kf->kf_offset) + : "-", + fbsd_file_flags (kf->kf_flags)); + if (kf->kf_type == KF_TYPE_SOCKET) + fbsd_print_socket (kf->kf_sock_domain, kf->kf_sock_type, + kf->kf_sock_protocol, &kf->kf_sa_local, + &kf->kf_sa_peer); + else + printf_filtered ("%s", kf->kf_path); + printf_filtered ("\n"); + } + } + else + warning (_("unable to fetch list of open files")); + } +#endif #ifdef HAVE_KINFO_GETVMMAP if (do_mappings) {