From patchwork Thu Jun 28 19:27:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julio Guerra X-Patchwork-Id: 28113 Received: (qmail 35251 invoked by alias); 28 Jun 2018 19:27:07 -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 35232 invoked by uid 89); 28 Jun 2018 19:27:06 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=julio, H*MI:000000, H*M:000000, H*M:amazonses X-HELO: a6-212.smtp-out.eu-west-1.amazonses.com Received: from a6-212.smtp-out.eu-west-1.amazonses.com (HELO a6-212.smtp-out.eu-west-1.amazonses.com) (54.240.6.212) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 28 Jun 2018 19:27:04 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=jl7vyxitgsfircfdhxflkj2c3tgxidze; d=farjump.io; t=1530214021; h=Subject:From:To:Cc:Date:Mime-Version:Content-Type:Content-Transfer-Encoding:References:Message-Id; bh=qvyNFu01uyeqd7+HcRC815LX85MUSDvGPNue3Ftsu+c=; b=WDOGr8JSv8ZQOjg1/M5V/BPgPlz9kmzdxSvZMuzMLaPdKn/1khAyPnwVT0W+XNh/ 6JB2C9dGPvkDCwZa5Kqk+vGL0Qn9ccoTrBUSE1gqaHahatCO54oBR3lqUS+q5Y8hh7a 6z2MQ9FrcxrBPPWoh2mlC1esxgqhSyC60eC7G08Q= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=uku4taia5b5tsbglxyj6zym32efj7xqv; d=amazonses.com; t=1530214021; h=Subject:From:To:Cc:Date:Mime-Version:Content-Type:Content-Transfer-Encoding:References:Message-Id:Feedback-ID; bh=qvyNFu01uyeqd7+HcRC815LX85MUSDvGPNue3Ftsu+c=; b=fY8Zyc+qya9iTs8Yz0O12EHsFg1f2FN6iaYaiTsiaJHCU77LNEzoyN9LRSN7yzT6 8M3VPaDmv+yJ1LrL3a/K8lVmjuWRbw5ba6pKPOa1lXV+GD4pAvd0tm/X5RLnddG8W40 VRJtMXoMm+EphB+IuBkIZfGQdA+bW4lqyoM0p1C8= Subject: [PATCH v3] Allow using special files with File I/O functions From: =?UTF-8?Q?Julio_Guerra?= To: =?UTF-8?Q?gdb-patches=40sourceware=2Eorg?= Cc: =?UTF-8?Q?Pedro_Alves?= , =?UTF-8?Q?Julio_Guerra?= Date: Thu, 28 Jun 2018 19:27:01 +0000 Mime-Version: 1.0 References: <20180628192635.44056-1-julio@farjump.io> X-Original-Mailer: git-send-email 2.18.0 Message-ID: <0102016447dcf9e9-3989bcd9-1272-4a05-93c5-77823c7a0921-000000@eu-west-1.amazonses.com> - Remove the restriction to regular files only and add support for special file types in the File IO stat structure. - Define a few more macro definitions of file types such as FIFOs, etc. The major goal is being able to write advanced embedded testing functions, like: - using a FIFO between the embedded program and the host, instead of being restricted only to the GDB console. - mocking features based on host's by opening some /dev special files. 2018-06-28 Julio Guerra * remote-fileio.c (remote_fileio_func_open, remote_fileio_func_stat): Allow using File I/O functions open(), stat() and fstat() on special files. * ../include/gdb/fileio.h: Add macro definitions for special files, both for fst_dev and fst_mode fields of struct fst_stat. * common/fileio.c (fileio_to_host_mode, fileio_mode_pack): Add new special file types in fst_mode's definition. (host_to_fileio_stat): Define fst_dev using the new macro definitions and according to the file's type. Signed-off-by: Julio Guerra --- gdb/ChangeLog | 12 ++++++++ gdb/common/fileio.c | 66 +++++++++++++++++++++++++++++++++++--------- gdb/remote-fileio.c | 28 ++----------------- include/gdb/fileio.h | 19 +++++++++++-- 4 files changed, 83 insertions(+), 42 deletions(-) -- 2.18.0 diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 18c1915675..19cf5e38a6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2018-06-28 Julio Guerra + + * remote-fileio.c (remote_fileio_func_open, remote_fileio_func_stat): + Allow using File I/O functions open(), stat() and fstat() on special + files. + * ../include/gdb/fileio.h: Add macro definitions for special files, + both for fst_dev and fst_mode fields of struct fst_stat. + * common/fileio.c (fileio_to_host_mode, fileio_mode_pack): Add new + special file types in fst_mode's definition. + (host_to_fileio_stat): Define fst_dev using the new macro definitions + and according to the file's type. + 2018-06-27 Simon Marchi * gdb-gdb.py.in (StructMainTypePrettyPrinter) : Don't diff --git a/gdb/common/fileio.c b/gdb/common/fileio.c index 912a7ede3c..9ee78e227c 100644 --- a/gdb/common/fileio.c +++ b/gdb/common/fileio.c @@ -119,12 +119,31 @@ fileio_to_host_mode (int fileio_mode, mode_t *mode_p) if (fileio_mode & ~FILEIO_S_SUPPORTED) return -1; - if (fileio_mode & FILEIO_S_IFREG) - mode |= S_IFREG; - if (fileio_mode & FILEIO_S_IFDIR) - mode |= S_IFDIR; - if (fileio_mode & FILEIO_S_IFCHR) - mode |= S_IFCHR; + switch (fileio_mode & FILEIO_S_IFMT) + { + case FILEIO_S_IFSOCK: + *mode_p |= S_IFSOCK; + break; + case FILEIO_S_IFLNK: + mode |= S_IFLNK; + break; + case FILEIO_S_IFREG: + mode |= S_IFREG; + break; + case FILEIO_S_IFBLK: + mode |= S_IFBLK; + break; + case FILEIO_S_IFDIR: + mode |= S_IFDIR; + break; + case FILEIO_S_IFCHR: + mode |= S_IFCHR; + break; + case FILEIO_S_IFIFO: + mode |= S_IFIFO; + break; + } + if (fileio_mode & FILEIO_S_IRUSR) mode |= S_IRUSR; if (fileio_mode & FILEIO_S_IWUSR) @@ -165,12 +184,31 @@ fileio_mode_pack (mode_t mode) { mode_t tmode = 0; - if (S_ISREG (mode)) - tmode |= FILEIO_S_IFREG; - if (S_ISDIR (mode)) - tmode |= FILEIO_S_IFDIR; - if (S_ISCHR (mode)) - tmode |= FILEIO_S_IFCHR; + switch (mode & S_IFMT) + { + case S_IFSOCK: + tmode |= FILEIO_S_IFSOCK; + break; + case S_IFLNK: + tmode |= FILEIO_S_IFLNK; + break; + case S_IFREG: + tmode |= FILEIO_S_IFREG; + break; + case S_IFBLK: + tmode |= FILEIO_S_IFBLK; + break; + case S_IFDIR: + tmode |= FILEIO_S_IFDIR; + break; + case S_IFCHR: + tmode |= FILEIO_S_IFCHR; + break; + case S_IFIFO: + tmode |= FILEIO_S_IFIFO; + break; + } + if (mode & S_IRUSR) tmode |= FILEIO_S_IRUSR; if (mode & S_IWUSR) @@ -224,8 +262,10 @@ void host_to_fileio_stat (struct stat *st, struct fio_stat *fst) { LONGEST blksize; + long fst_dev; - host_to_fileio_uint ((long) st->st_dev, fst->fst_dev); + fst_dev = S_ISREG(st->st_mode) ? FILEIO_STDEV_FILE : FILEIO_STDEV_SPECIAL; + host_to_fileio_uint (fst_dev, fst->fst_dev); host_to_fileio_uint ((long) st->st_ino, fst->fst_ino); host_to_fileio_mode (st->st_mode, fst->fst_mode); host_to_fileio_uint ((long) st->st_nlink, fst->fst_nlink); diff --git a/gdb/remote-fileio.c b/gdb/remote-fileio.c index 313da642ea..837081269a 100644 --- a/gdb/remote-fileio.c +++ b/gdb/remote-fileio.c @@ -407,24 +407,6 @@ remote_fileio_func_open (remote_target *remote, char *buf) return; } - /* Check if pathname exists and is not a regular file or directory. If so, - return an appropriate error code. Same for trying to open directories - for writing. */ - if (!stat (pathname, &st)) - { - if (!S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode)) - { - remote_fileio_reply (remote, -1, FILEIO_ENODEV); - return; - } - if (S_ISDIR (st.st_mode) - && ((flags & O_WRONLY) == O_WRONLY || (flags & O_RDWR) == O_RDWR)) - { - remote_fileio_reply (remote, -1, FILEIO_EISDIR); - return; - } - } - fd = gdb_open_cloexec (pathname, flags, mode); if (fd < 0) { @@ -885,16 +867,9 @@ remote_fileio_func_stat (remote_target *remote, char *buf) remote_fileio_return_errno (remote, -1); return; } - /* Only operate on regular files and directories. */ - if (!ret && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode)) - { - remote_fileio_reply (remote, -1, FILEIO_EACCES); - return; - } if (statptr) { host_to_fileio_stat (&st, &fst); - host_to_fileio_uint (0, fst.fst_dev); errno = target_write_memory (statptr, (gdb_byte *) &fst, sizeof fst); if (errno != 0) @@ -939,7 +914,6 @@ remote_fileio_func_fstat (remote_target *remote, char *buf) if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT) { - host_to_fileio_uint (1, fst.fst_dev); memset (&st, 0, sizeof (st)); st.st_mode = S_IFCHR | (fd == FIO_FD_CONSOLE_IN ? S_IRUSR : S_IWUSR); st.st_nlink = 1; @@ -972,6 +946,8 @@ remote_fileio_func_fstat (remote_target *remote, char *buf) if (ptrval) { host_to_fileio_stat (&st, &fst); + if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT) + host_to_fileio_uint (FILEIO_STDEV_CONSOLE, fst.fst_dev); errno = target_write_memory (ptrval, (gdb_byte *) &fst, sizeof fst); if (errno != 0) diff --git a/include/gdb/fileio.h b/include/gdb/fileio.h index 7bb55f579f..ada84c5f10 100644 --- a/include/gdb/fileio.h +++ b/include/gdb/fileio.h @@ -37,10 +37,24 @@ FILEIO_O_CREAT | FILEIO_O_TRUNC| \ FILEIO_O_EXCL) +/* Device id values of fst_dev field */ +/* Regular file */ +#define FILEIO_STDEV_FILE 0 +/* GDB's console */ +#define FILEIO_STDEV_CONSOLE 1 +/* Not a regular file nor the console. + Bits FILEIO_S_IFMT of fst_mode give the exact file type. */ +#define FILEIO_STDEV_SPECIAL 2 + /* mode_t bits */ +#define FILEIO_S_IFSOCK 0140000 +#define FILEIO_S_IFLNK 0120000 #define FILEIO_S_IFREG 0100000 +#define FILEIO_S_IFBLK 060000 #define FILEIO_S_IFDIR 040000 #define FILEIO_S_IFCHR 020000 +#define FILEIO_S_IFIFO 010000 +#define FILEIO_S_IFMT 0170000 #define FILEIO_S_IRUSR 0400 #define FILEIO_S_IWUSR 0200 #define FILEIO_S_IXUSR 0100 @@ -53,9 +67,8 @@ #define FILEIO_S_IWOTH 02 #define FILEIO_S_IXOTH 01 #define FILEIO_S_IRWXO 07 -#define FILEIO_S_SUPPORTED (FILEIO_S_IFREG|FILEIO_S_IFDIR| \ - FILEIO_S_IRWXU|FILEIO_S_IRWXG| \ - FILEIO_S_IRWXO) +#define FILEIO_S_SUPPORTED (FILEIO_S_IFMT | FILEIO_S_IRWXU| \ + FILEIO_S_IRWXG | FILEIO_S_IRWXO) /* lseek(2) flags */ #define FILEIO_SEEK_SET 0