diff options
author | Gary Benson <gbenson@redhat.com> | 2015-06-09 10:00:15 +0100 |
---|---|---|
committer | Gary Benson <gbenson@redhat.com> | 2015-06-09 13:24:46 +0100 |
commit | 3ac2e371a1abd1279f66477aa4fc68039da1872e (patch) | |
tree | 5571999b6a42fbfb6249c98fcf86a790b117d594 /gdb/common/fileio.c | |
parent | ecef18c564bd609aa7640564747b807bfe1632c6 (diff) | |
download | gdb-3ac2e371a1abd1279f66477aa4fc68039da1872e.zip gdb-3ac2e371a1abd1279f66477aa4fc68039da1872e.tar.gz gdb-3ac2e371a1abd1279f66477aa4fc68039da1872e.tar.bz2 |
Don't assume File-I/O mode bits match the host's format
inf_child_fileio_open and its gdbserver equivalent both assume that
the mode_t bits defined in gdb/fileio.h are the same as those used
by the open system call, but there is no mechanism to ensure this is
the case. This commit adds a conversion function to handle systems
where the File-I/O definitions do not align with the host's.
gdb/ChangeLog:
* common/fileio.h (fileio_to_host_mode): New declaration.
* common/fileio.c (fileio_to_host_mode): New Function.
* inf-child.c (inf_child_fileio_open): Process mode argument
with fileio_to_host_mode.
gdb/gdbserver/ChangeLog:
* hostio.c (handle_open): Process mode argument with
fileio_to_host_mode.
Diffstat (limited to 'gdb/common/fileio.c')
-rw-r--r-- | gdb/common/fileio.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/gdb/common/fileio.c b/gdb/common/fileio.c index ef00ea8..d219f30 100644 --- a/gdb/common/fileio.c +++ b/gdb/common/fileio.c @@ -109,6 +109,55 @@ fileio_to_host_openflags (int fileio_open_flags, int *open_flags_p) return 0; } +/* See fileio.h. */ + +int +fileio_to_host_mode (int fileio_mode, mode_t *mode_p) +{ + mode_t mode = 0; + + 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; + if (fileio_mode & FILEIO_S_IRUSR) + mode |= S_IRUSR; + if (fileio_mode & FILEIO_S_IWUSR) + mode |= S_IWUSR; + if (fileio_mode & FILEIO_S_IXUSR) + mode |= S_IXUSR; +#ifdef S_IRGRP + if (fileio_mode & FILEIO_S_IRGRP) + mode |= S_IRGRP; +#endif +#ifdef S_IWGRP + if (fileio_mode & FILEIO_S_IWGRP) + mode |= S_IWGRP; +#endif +#ifdef S_IXGRP + if (fileio_mode & FILEIO_S_IXGRP) + mode |= S_IXGRP; +#endif + if (fileio_mode & FILEIO_S_IROTH) + mode |= S_IROTH; +#ifdef S_IWOTH + if (fileio_mode & FILEIO_S_IWOTH) + mode |= S_IWOTH; +#endif +#ifdef S_IXOTH + if (fileio_mode & FILEIO_S_IXOTH) + mode |= S_IXOTH; +#endif + + *mode_p = mode; + return 0; +} + /* Convert a host-format mode_t into a bitmask of File-I/O flags. */ static LONGEST |