file.c: move open, openat, and creat parsers to a separate file
* open.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* file.c: Move sys_open, sys_openat, sys_creat, and related code
to open.c.
diff --git a/Makefile.am b/Makefile.am
index 06a18bd..ef1f1d0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -50,6 +50,7 @@
mount.c \
mtd.c \
net.c \
+ open.c \
or1k_atomic.c \
pathtrace.c \
personality.c \
diff --git a/file.c b/file.c
index ad85ef0..8dd0231 100644
--- a/file.c
+++ b/file.c
@@ -189,146 +189,6 @@
# include <sys/mkdev.h>
#endif
-#ifdef O_LARGEFILE
-# if O_LARGEFILE == 0 /* biarch platforms in 64-bit mode */
-# undef O_LARGEFILE
-# ifdef SPARC64
-# define O_LARGEFILE 0x40000
-# elif defined X86_64 || defined S390X
-# define O_LARGEFILE 0100000
-# endif
-# endif
-#endif
-
-#include "xlat/open_access_modes.h"
-#include "xlat/open_mode_flags.h"
-
-#ifndef AT_FDCWD
-# define AT_FDCWD -100
-#endif
-
-/* The fd is an "int", so when decoding x86 on x86_64, we need to force sign
- * extension to get the right value. We do this by declaring fd as int here.
- */
-void
-print_dirfd(struct tcb *tcp, int fd)
-{
- if (fd == AT_FDCWD)
- tprints("AT_FDCWD, ");
- else {
- printfd(tcp, fd);
- tprints(", ");
- }
-}
-
-/*
- * low bits of the open(2) flags define access mode,
- * other bits are real flags.
- */
-const char *
-sprint_open_modes(int flags)
-{
- static char outstr[(1 + ARRAY_SIZE(open_mode_flags)) * sizeof("O_LARGEFILE")];
- char *p;
- char sep;
- const char *str;
- const struct xlat *x;
-
- sep = ' ';
- p = stpcpy(outstr, "flags");
- str = xlookup(open_access_modes, flags & 3);
- if (str) {
- *p++ = sep;
- p = stpcpy(p, str);
- flags &= ~3;
- if (!flags)
- return outstr;
- sep = '|';
- }
-
- for (x = open_mode_flags; x->str; x++) {
- if ((flags & x->val) == x->val) {
- *p++ = sep;
- p = stpcpy(p, x->str);
- flags &= ~x->val;
- if (!flags)
- return outstr;
- sep = '|';
- }
- }
- /* flags is still nonzero */
- *p++ = sep;
- sprintf(p, "%#x", flags);
- return outstr;
-}
-
-void
-tprint_open_modes(int flags)
-{
- tprints(sprint_open_modes(flags) + sizeof("flags"));
-}
-
-static int
-decode_open(struct tcb *tcp, int offset)
-{
- if (entering(tcp)) {
- printpath(tcp, tcp->u_arg[offset]);
- tprints(", ");
- /* flags */
- tprint_open_modes(tcp->u_arg[offset + 1]);
- if (tcp->u_arg[offset + 1] & O_CREAT) {
- /* mode */
- tprintf(", %#lo", tcp->u_arg[offset + 2]);
- }
- }
- return RVAL_FD;
-}
-
-int
-sys_open(struct tcb *tcp)
-{
- return decode_open(tcp, 0);
-}
-
-int
-sys_openat(struct tcb *tcp)
-{
- if (entering(tcp))
- print_dirfd(tcp, tcp->u_arg[0]);
- return decode_open(tcp, 1);
-}
-
-#if defined(SPARC) || defined(SPARC64)
-#include "xlat/openmodessol.h"
-
-int
-solaris_open(struct tcb *tcp)
-{
- if (entering(tcp)) {
- printpath(tcp, tcp->u_arg[0]);
- tprints(", ");
- /* flags */
- printflags(openmodessol, tcp->u_arg[1] + 1, "O_???");
- if (tcp->u_arg[1] & 0x100) {
- /* mode */
- tprintf(", %#lo", tcp->u_arg[2]);
- }
- }
- return 0;
-}
-
-#endif
-
-int
-sys_creat(struct tcb *tcp)
-{
- if (entering(tcp)) {
- printpath(tcp, tcp->u_arg[0]);
- tprintf(", %#lo", tcp->u_arg[1]);
- }
- return RVAL_FD;
-}
-
/* several stats */
#if defined(SPARC) || defined(SPARC64)
@@ -1065,4 +925,4 @@
return 0;
}
-#endif /* SPARC[64] */
+#endif /* SPARC || SPARC64 */
diff --git a/open.c b/open.c
new file mode 100644
index 0000000..e97be42
--- /dev/null
+++ b/open.c
@@ -0,0 +1,143 @@
+#include "defs.h"
+
+#include <fcntl.h>
+
+#ifdef O_LARGEFILE
+# if O_LARGEFILE == 0 /* biarch platforms in 64-bit mode */
+# undef O_LARGEFILE
+# ifdef SPARC64
+# define O_LARGEFILE 0x40000
+# elif defined X86_64 || defined S390X
+# define O_LARGEFILE 0100000
+# endif
+# endif
+#endif
+
+#include "xlat/open_access_modes.h"
+#include "xlat/open_mode_flags.h"
+
+#ifndef AT_FDCWD
+# define AT_FDCWD -100
+#endif
+
+/* The fd is an "int", so when decoding x86 on x86_64, we need to force sign
+ * extension to get the right value. We do this by declaring fd as int here.
+ */
+void
+print_dirfd(struct tcb *tcp, int fd)
+{
+ if (fd == AT_FDCWD)
+ tprints("AT_FDCWD, ");
+ else {
+ printfd(tcp, fd);
+ tprints(", ");
+ }
+}
+
+/*
+ * low bits of the open(2) flags define access mode,
+ * other bits are real flags.
+ */
+const char *
+sprint_open_modes(int flags)
+{
+ static char outstr[(1 + ARRAY_SIZE(open_mode_flags)) * sizeof("O_LARGEFILE")];
+ char *p;
+ char sep;
+ const char *str;
+ const struct xlat *x;
+
+ sep = ' ';
+ p = stpcpy(outstr, "flags");
+ str = xlookup(open_access_modes, flags & 3);
+ if (str) {
+ *p++ = sep;
+ p = stpcpy(p, str);
+ flags &= ~3;
+ if (!flags)
+ return outstr;
+ sep = '|';
+ }
+
+ for (x = open_mode_flags; x->str; x++) {
+ if ((flags & x->val) == x->val) {
+ *p++ = sep;
+ p = stpcpy(p, x->str);
+ flags &= ~x->val;
+ if (!flags)
+ return outstr;
+ sep = '|';
+ }
+ }
+ /* flags is still nonzero */
+ *p++ = sep;
+ sprintf(p, "%#x", flags);
+ return outstr;
+}
+
+void
+tprint_open_modes(int flags)
+{
+ tprints(sprint_open_modes(flags) + sizeof("flags"));
+}
+
+static int
+decode_open(struct tcb *tcp, int offset)
+{
+ if (entering(tcp)) {
+ printpath(tcp, tcp->u_arg[offset]);
+ tprints(", ");
+ /* flags */
+ tprint_open_modes(tcp->u_arg[offset + 1]);
+ if (tcp->u_arg[offset + 1] & O_CREAT) {
+ /* mode */
+ tprintf(", %#lo", tcp->u_arg[offset + 2]);
+ }
+ }
+ return RVAL_FD;
+}
+
+int
+sys_open(struct tcb *tcp)
+{
+ return decode_open(tcp, 0);
+}
+
+int
+sys_openat(struct tcb *tcp)
+{
+ if (entering(tcp))
+ print_dirfd(tcp, tcp->u_arg[0]);
+ return decode_open(tcp, 1);
+}
+
+int
+sys_creat(struct tcb *tcp)
+{
+ if (entering(tcp)) {
+ printpath(tcp, tcp->u_arg[0]);
+ tprintf(", %#lo", tcp->u_arg[1]);
+ }
+ return RVAL_FD;
+}
+
+#if defined(SPARC) || defined(SPARC64)
+# include "xlat/openmodessol.h"
+
+int
+solaris_open(struct tcb *tcp)
+{
+ if (entering(tcp)) {
+ printpath(tcp, tcp->u_arg[0]);
+ tprints(", ");
+ /* flags */
+ printflags(openmodessol, tcp->u_arg[1] + 1, "O_???");
+ if (tcp->u_arg[1] & 0x100) {
+ /* mode */
+ tprintf(", %#lo", tcp->u_arg[2]);
+ }
+ }
+ return 0;
+}
+
+#endif /* SPARC || SPARC64 */