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/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 */