From patchwork Wed Feb 21 21:37:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 25988 Received: (qmail 126730 invoked by alias); 21 Feb 2018 21:37:49 -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 126176 invoked by uid 89); 21 Feb 2018 21:37:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=3337 X-HELO: gateway31.websitewelcome.com Received: from gateway31.websitewelcome.com (HELO gateway31.websitewelcome.com) (192.185.144.95) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 21 Feb 2018 21:37:46 +0000 Received: from cm10.websitewelcome.com (cm10.websitewelcome.com [100.42.49.4]) by gateway31.websitewelcome.com (Postfix) with ESMTP id 13EE659393 for ; Wed, 21 Feb 2018 15:37:44 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id oc5AeA4SWcGlpoc5Ae6YS9; Wed, 21 Feb 2018 15:37:44 -0600 Received: from 174-29-60-18.hlrn.qwest.net ([174.29.60.18]:59856 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.89) (envelope-from ) id 1eoc59-000DAw-QP; Wed, 21 Feb 2018 15:37:43 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA v3] Return gdb::optional from target_fileio_readlink Date: Wed, 21 Feb 2018 14:37:41 -0700 Message-Id: <20180221213741.19409-1-tom@tromey.com> X-BWhitelist: no X-Source-L: No X-Exim-ID: 1eoc59-000DAw-QP X-Source-Sender: 174-29-60-18.hlrn.qwest.net (bapiya.Home) [174.29.60.18]:59856 X-Source-Auth: tom+tromey.com X-Email-Count: 1 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes This is an updated version of a patch originally submitted here: https://sourceware.org/ml/gdb-patches/2017-11/msg00556.html This one updates the patch as requested and fixes a couple of typos in the commit message from the second submission. This changes to_fileio_readlink and target_fileio_readlink to return a gdb::optional, and then fixes up the callers and implementations. This allows the removal of some cleanups. Regression tested by the buildbot. gdb/ChangeLog 2018-02-21 Tom Tromey * linux-tdep.c (linux_info_proc): Update. * target.h (struct target_ops) : Return optional. (target_fileio_readlink): Return optional. * remote.c (remote_hostio_readlink): Return optional. * inf-child.c (inf_child_fileio_readlink): Return optional. * target.c (target_fileio_readlink): Return optional. --- gdb/ChangeLog | 11 +++++++++++ gdb/inf-child.c | 12 ++++-------- gdb/linux-nat.c | 10 +++------- gdb/linux-tdep.c | 22 ++++++++-------------- gdb/remote.c | 12 +++++------- gdb/target.c | 12 ++++++------ gdb/target.h | 13 ++++++------- 7 files changed, 43 insertions(+), 49 deletions(-) diff --git a/gdb/inf-child.c b/gdb/inf-child.c index 6875596f33..c7c45530b6 100644 --- a/gdb/inf-child.c +++ b/gdb/inf-child.c @@ -333,7 +333,7 @@ inf_child_fileio_unlink (struct target_ops *self, /* Implementation of to_fileio_readlink. */ -static char * +static gdb::optional inf_child_fileio_readlink (struct target_ops *self, struct inferior *inf, const char *filename, int *target_errno) @@ -343,22 +343,18 @@ inf_child_fileio_readlink (struct target_ops *self, #if defined (PATH_MAX) char buf[PATH_MAX]; int len; - char *ret; len = readlink (filename, buf, sizeof buf); if (len < 0) { *target_errno = host_to_fileio_error (errno); - return NULL; + return {}; } - ret = (char *) xmalloc (len + 1); - memcpy (ret, buf, len); - ret[len] = '\0'; - return ret; + return std::string (buf, len); #else *target_errno = FILEIO_ENOSYS; - return NULL; + return {}; #endif } diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index cc930c6334..1bbad7bacc 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4709,27 +4709,23 @@ linux_nat_fileio_open (struct target_ops *self, /* Implementation of to_fileio_readlink. */ -static char * +static gdb::optional linux_nat_fileio_readlink (struct target_ops *self, struct inferior *inf, const char *filename, int *target_errno) { char buf[PATH_MAX]; int len; - char *ret; len = linux_mntns_readlink (linux_nat_fileio_pid_of (inf), filename, buf, sizeof (buf)); if (len < 0) { *target_errno = host_to_fileio_error (errno); - return NULL; + return {}; } - ret = (char *) xmalloc (len + 1); - memcpy (ret, buf, len); - ret[len] = '\0'; - return ret; + return std::string (buf, len); } /* Implementation of to_fileio_unlink. */ diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index d54e56ce8d..b5bb16215d 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -764,26 +764,20 @@ linux_info_proc (struct gdbarch *gdbarch, const char *args, if (cwd_f) { xsnprintf (filename, sizeof filename, "/proc/%ld/cwd", pid); - data = target_fileio_readlink (NULL, filename, &target_errno); - if (data) - { - struct cleanup *cleanup = make_cleanup (xfree, data); - printf_filtered ("cwd = '%s'\n", data); - do_cleanups (cleanup); - } + gdb::optional contents + = target_fileio_readlink (NULL, filename, &target_errno); + if (contents.has_value ()) + printf_filtered ("cwd = '%s'\n", contents->c_str ()); else warning (_("unable to read link '%s'"), filename); } if (exe_f) { xsnprintf (filename, sizeof filename, "/proc/%ld/exe", pid); - data = target_fileio_readlink (NULL, filename, &target_errno); - if (data) - { - struct cleanup *cleanup = make_cleanup (xfree, data); - printf_filtered ("exe = '%s'\n", data); - do_cleanups (cleanup); - } + gdb::optional contents + = target_fileio_readlink (NULL, filename, &target_errno); + if (contents.has_value ()) + printf_filtered ("exe = '%s'\n", contents->c_str ()); else warning (_("unable to read link '%s'"), filename); } diff --git a/gdb/remote.c b/gdb/remote.c index 15d6c5bdbf..7992a69e2a 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -11713,7 +11713,7 @@ remote_hostio_unlink (struct target_ops *self, /* Implementation of to_fileio_readlink. */ -static char * +static gdb::optional remote_hostio_readlink (struct target_ops *self, struct inferior *inf, const char *filename, int *remote_errno) @@ -11724,10 +11724,9 @@ remote_hostio_readlink (struct target_ops *self, int left = get_remote_packet_size (); int len, attachment_len; int read_len; - char *ret; if (remote_hostio_set_filesystem (inf, remote_errno) != 0) - return NULL; + return {}; remote_buffer_add_string (&p, &left, "vFile:readlink:"); @@ -11739,16 +11738,15 @@ remote_hostio_readlink (struct target_ops *self, &attachment_len); if (len < 0) - return NULL; + return {}; - ret = (char *) xmalloc (len + 1); + std::string ret (len + 1, '\0'); read_len = remote_unescape_input ((gdb_byte *) attachment, attachment_len, - (gdb_byte *) ret, len); + (gdb_byte *) &ret[0], len); if (read_len != len) error (_("Readlink returned %d, but %d bytes."), len, read_len); - ret[len] = '\0'; return ret; } diff --git a/gdb/target.c b/gdb/target.c index db7c09ba0f..ccce0fe73e 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3059,7 +3059,7 @@ target_fileio_unlink (struct inferior *inf, const char *filename, /* See target.h. */ -char * +gdb::optional target_fileio_readlink (struct inferior *inf, const char *filename, int *target_errno) { @@ -3069,22 +3069,22 @@ target_fileio_readlink (struct inferior *inf, const char *filename, { if (t->to_fileio_readlink != NULL) { - char *ret = t->to_fileio_readlink (t, inf, filename, - target_errno); + gdb::optional ret + = t->to_fileio_readlink (t, inf, filename, target_errno); if (targetdebug) fprintf_unfiltered (gdb_stdlog, "target_fileio_readlink (%d,%s)" " = %s (%d)\n", inf == NULL ? 0 : inf->num, - filename, ret? ret : "(nil)", - ret? 0 : *target_errno); + filename, ret ? ret->c_str () : "(nil)", + ret ? 0 : *target_errno); return ret; } } *target_errno = FILEIO_ENOSYS; - return NULL; + return {}; } static void diff --git a/gdb/target.h b/gdb/target.h index 83cf48575f..05575df35f 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -935,10 +935,10 @@ struct target_ops seen by the debugger (GDB or, for remote targets, the remote stub). Return a null-terminated string allocated via xmalloc, or NULL if an error occurs (and set *TARGET_ERRNO). */ - char *(*to_fileio_readlink) (struct target_ops *, - struct inferior *inf, - const char *filename, - int *target_errno); + gdb::optional (*to_fileio_readlink) (struct target_ops *, + struct inferior *inf, + const char *filename, + int *target_errno); /* Implement the "info proc" command. */ @@ -2091,9 +2091,8 @@ extern int target_fileio_unlink (struct inferior *inf, by the debugger (GDB or, for remote targets, the remote stub). Return a null-terminated string allocated via xmalloc, or NULL if an error occurs (and set *TARGET_ERRNO). */ -extern char *target_fileio_readlink (struct inferior *inf, - const char *filename, - int *target_errno); +extern gdb::optional target_fileio_readlink + (struct inferior *inf, const char *filename, int *target_errno); /* Read target file FILENAME, in the filesystem as seen by INF. If INF is NULL, use the filesystem seen by the debugger (GDB or, for