]> granicus.if.org Git - strace/commitdiff
file.c: move open, openat, and creat parsers to a separate file
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 6 Dec 2014 03:53:16 +0000 (03:53 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 11 Dec 2014 21:40:20 +0000 (21:40 +0000)
* 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.

Makefile.am
file.c
open.c [new file with mode: 0644]

index 06a18bde7e6a263a52dffe3f19a199444155a6ea..ef1f1d00a37a93c8eb3d551fcd8082c795c67753 100644 (file)
@@ -50,6 +50,7 @@ strace_SOURCES =      \
        mount.c         \
        mtd.c           \
        net.c           \
+       open.c          \
        or1k_atomic.c   \
        pathtrace.c     \
        personality.c   \
diff --git a/file.c b/file.c
index ad85ef00d23460e0fdbcc5f60ea42681a12d4f8f..8dd0231639cef03cd39ab8cd46ef5cd1fb22174e 100644 (file)
--- a/file.c
+++ b/file.c
@@ -189,146 +189,6 @@ struct __old_kernel_stat {
 # 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 @@ sys_lxstat(struct tcb *tcp)
        return 0;
 }
 
-#endif /* SPARC[64] */
+#endif /* SPARC || SPARC64 */
diff --git a/open.c b/open.c
new file mode 100644 (file)
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 */