aboutsummaryrefslogtreecommitdiff
path: root/gdb/common/fileio.c
diff options
context:
space:
mode:
authorGary Benson <gbenson@redhat.com>2015-06-09 10:00:15 +0100
committerGary Benson <gbenson@redhat.com>2015-06-09 13:24:46 +0100
commit3ac2e371a1abd1279f66477aa4fc68039da1872e (patch)
tree5571999b6a42fbfb6249c98fcf86a790b117d594 /gdb/common/fileio.c
parentecef18c564bd609aa7640564747b807bfe1632c6 (diff)
downloadgdb-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.c49
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