]> granicus.if.org Git - strace/blobdiff - desc.c
2004-09-03 Roland McGrath <roland@redhat.com>
[strace] / desc.c
diff --git a/desc.c b/desc.c
index f1e0334dc1e8b6ec383d4aa6dbb964d457183fcf..f4e92571f46300c810bc5aa5dbcab0e02c050725 100644 (file)
--- a/desc.c
+++ b/desc.c
@@ -2,6 +2,7 @@
  * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
  * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
+ * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include <fcntl.h>
 #include <sys/file.h>
 
-static struct xlat fcntlcmds[] = {
+#if HAVE_LONG_LONG_OFF_T
+/*
+ * Hacks for systems that have a long long off_t
+ */
+#define flock64        flock           /* Horrid hack */
+#define printflock printflock64        /* Horrider hack */
+#endif
+
+
+static const struct xlat fcntlcmds[] = {
        { F_DUPFD,      "F_DUPFD"       },
        { F_GETFD,      "F_GETFD"       },
        { F_SETFD,      "F_SETFD"       },
@@ -56,11 +66,83 @@ static struct xlat fcntlcmds[] = {
 #endif
 #ifdef F_CNVT
        { F_CNVT,       "F_CNVT"        },
+#endif
+#ifdef F_SETSIG
+       { F_SETSIG,     "F_SETSIG"      },
+#endif
+#ifdef F_GETSIG
+       { F_GETSIG,     "F_GETSIG"      },
+#endif
+#ifdef F_CHKFL
+       { F_CHKFL,      "F_CHKFL"       },
+#endif
+#ifdef F_DUP2FD
+       { F_DUP2FD,     "F_DUP2FD"      },
+#endif
+#ifdef F_ALLOCSP
+       { F_ALLOCSP,    "F_ALLOCSP"     },
+#endif
+#ifdef F_ISSTREAM
+       { F_ISSTREAM,   "F_ISSTREAM"    },
+#endif
+#ifdef F_PRIV
+       { F_PRIV,       "F_PRIV"        },
+#endif
+#ifdef F_NPRIV
+       { F_NPRIV,      "F_NPRIV"       },
+#endif
+#ifdef F_QUOTACL
+       { F_QUOTACL,    "F_QUOTACL"     },
+#endif
+#ifdef F_BLOCKS
+       { F_BLOCKS,     "F_BLOCKS"      },
+#endif
+#ifdef F_BLKSIZE
+       { F_BLKSIZE,    "F_BLKSIZE"     },
+#endif
+#ifdef F_GETOWN
+       { F_GETOWN,     "F_GETOWN"      },
+#endif
+#ifdef F_SETOWN
+       { F_SETOWN,     "F_SETOWN"      },
+#endif
+#ifdef F_REVOKE
+       { F_REVOKE,     "F_REVOKE"      },
+#endif
+#ifdef F_SETLK
+       { F_SETLK,      "F_SETLK"       },
+#endif
+#ifdef F_SETLKW
+       { F_SETLKW,     "F_SETLKW"      },
+#endif
+#ifdef F_FREESP
+       { F_FREESP,     "F_FREESP"      },
+#endif
+#ifdef F_GETLK
+       { F_GETLK,      "F_GETLK"       },
+#endif
+#ifdef F_SETLK64
+       { F_SETLK64,    "F_SETLK64"     },
+#endif
+#ifdef F_SETLKW64
+       { F_SETLKW64,   "F_SETLKW64"    },
+#endif
+#ifdef F_FREESP64
+       { F_FREESP64,   "F_FREESP64"    },
+#endif
+#ifdef F_GETLK64
+       { F_GETLK64,    "F_GETLK64"     },
+#endif
+#ifdef F_SHARE
+       { F_SHARE,      "F_SHARE"       },
+#endif
+#ifdef F_UNSHARE
+       { F_UNSHARE,    "F_UNSHARE"     },
 #endif
        { 0,            NULL            },
 };
 
-static struct xlat fdflags[] = {
+static const struct xlat fdflags[] = {
 #ifdef FD_CLOEXEC
        { FD_CLOEXEC,   "FD_CLOEXEC"    },
 #endif
@@ -69,7 +151,7 @@ static struct xlat fdflags[] = {
 
 #ifdef LOCK_SH
 
-static struct xlat flockcmds[] = {
+static const struct xlat flockcmds[] = {
        { LOCK_SH,      "LOCK_SH"       },
        { LOCK_EX,      "LOCK_EX"       },
        { LOCK_NB,      "LOCK_NB"       },
@@ -79,7 +161,7 @@ static struct xlat flockcmds[] = {
 
 #endif /* LOCK_SH */
 
-static struct xlat lockfcmds[] = {
+static const struct xlat lockfcmds[] = {
        { F_RDLCK,      "F_RDLCK"       },
        { F_WRLCK,      "F_WRLCK"       },
        { F_UNLCK,      "F_UNLCK"       },
@@ -92,18 +174,19 @@ static struct xlat lockfcmds[] = {
        { 0,            NULL            },
 };
 
-static struct xlat whence[] = {
+static const struct xlat whence[] = {
        { SEEK_SET,     "SEEK_SET"      },
        { SEEK_CUR,     "SEEK_CUR"      },
        { SEEK_END,     "SEEK_END"      },
        { 0,            NULL            },
 };
 
+#ifndef HAVE_LONG_LONG_OFF_T
 /* fcntl/lockf */
 static void
 printflock(tcp, addr, getlk)
 struct tcb *tcp;
-int addr;
+long addr;
 int getlk;
 {
        struct flock fl;
@@ -122,10 +205,37 @@ int getlk;
        else
                tprintf("}");
 }
+#endif
+
+#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
+/* fcntl/lockf */
+static void
+printflock64(tcp, addr, getlk)
+struct tcb *tcp;
+long addr;
+int getlk;
+{
+       struct flock64 fl;
+
+       if (umove(tcp, addr, &fl) < 0) {
+               tprintf("{...}");
+               return;
+       }
+       tprintf("{type=");
+       printxval(lockfcmds, fl.l_type, "F_???");
+       tprintf(", whence=");
+       printxval(whence, fl.l_whence, "SEEK_???");
+       tprintf(", start=%lld, len=%lld", (long long) fl.l_start, (long long) fl.l_len);
+       if (getlk)
+               tprintf(", pid=%lu}", (unsigned long) fl.l_pid);
+       else
+               tprintf("}");
+}
+#endif
 
 static char *
 sprintflags(xlat, flags)
-struct xlat *xlat;
+const struct xlat *xlat;
 int flags;
 {
        static char outstr[1024];
@@ -151,7 +261,7 @@ int
 sys_fcntl(tcp)
 struct tcb *tcp;
 {
-       extern struct xlat openmodes[];
+       extern const struct xlat openmodes[];
 
        if (entering(tcp)) {
                tprintf("%ld, ", tcp->u_arg[0]);
@@ -171,10 +281,29 @@ struct tcb *tcp;
                                tprintf("0");
                        break;
                case F_SETLK: case F_SETLKW:
+#ifdef F_FREESP
+               case F_FREESP:
+#endif
                        tprintf(", ");
                        printflock(tcp, tcp->u_arg[2], 0);
                        break;
-               }
+#if _LFS64_LARGEFILE
+#ifdef F_FREESP64
+               case F_FREESP64:
+#endif
+               /* Linux glibc defines SETLK64 as SETLK,
+                  even though the kernel has different values - as does Solaris. */
+#if defined(F_SETLK64) && F_SETLK64+0!=F_SETLK
+               case F_SETLK64:
+#endif
+#if defined(F_SETLKW64) && F_SETLKW64+0!=F_SETLKW
+               case F_SETLKW64:
+#endif
+                       tprintf(", ");
+                       printflock64(tcp, tcp->u_arg[2], 0);
+                       break;
+#endif
+               }
        }
        else {
                switch (tcp->u_arg[1]) {
@@ -195,7 +324,15 @@ struct tcb *tcp;
                        tprintf(", ");
                        printflock(tcp, tcp->u_arg[2], 1);
                        break;
-               default:
+#if _LFS64_LARGEFILE
+#if defined(F_GETLK64) && F_GETLK64+0!=F_GETLK
+               case F_GETLK64:
+#endif
+                       tprintf(", ");
+                       printflock64(tcp, tcp->u_arg[2], 1);
+                       break;
+#endif
+               default:
                        tprintf(", %#lx", tcp->u_arg[2]);
                        break;
                }
@@ -256,13 +393,20 @@ struct tcb *tcp;
 }
 
 static int
-decode_select(tcp, args)
+decode_select(tcp, args, bitness)
 struct tcb *tcp;
 long *args;
+int bitness;
 {
        int i, j, nfds;
        fd_set fds;
        struct timeval tv;
+#ifdef ALPHA
+       struct timeval32 {
+               unsigned tv_sec;
+               unsigned tv_usec;
+       } *tv32;
+#endif
        static char outstr[1024];
        char *sep;
        long arg;
@@ -300,11 +444,18 @@ long *args;
                else if (umove(tcp, args[4], &tv) < 0)
                        tprintf(", {...}");
                else {
-                       tprintf(", {%lu, %lu}",
-                               (long) tv.tv_sec, (long) tv.tv_usec);
+#ifdef ALPHA
+                       if (bitness) {
+                               tv32=(struct timeval32*)&tv;
+                               tprintf(", {%u, %u}", tv32->tv_sec, tv32->tv_usec);
+                       } else
+#endif
+                               tprintf(", {%lu, %lu}",
+                                       (long) tv.tv_sec, (long) tv.tv_usec);
                }
        }
-       else {
+       else
+       {
                unsigned int cumlen = 0;
                char *sep = "";
 
@@ -352,11 +503,20 @@ long *args;
                if (args[4]) {
                        char str[20];
 
-                       if (umove(tcp, args[4], &tv) >= 0)
-                               sprintf(str, "%sleft {%lu, %lu}", sep,
-                                       (long) tv.tv_sec, (long) tv.tv_usec);
-                       if ((cumlen += strlen(str)) < sizeof(outstr))
-                               strcat(outstr, str);
+                       if (umove(tcp, args[4], &tv) >= 0) {
+#ifdef ALPHA
+                               if (bitness) {
+                                       tv32=(struct timeval32*)&tv;
+                                       sprintf(str, "%sleft {%u, %u}", sep,
+                                               tv32->tv_sec, tv32->tv_usec);
+                               } else
+#endif
+                                       sprintf(str, "%sleft {%lu, %lu}", sep,
+                                               (long) tv.tv_sec, (long) tv.tv_usec);
+
+                               if ((cumlen += strlen(str)) < sizeof(outstr))
+                                       strcat(outstr, str);
+                       }
                }
 #endif /* LINUX */
                return RVAL_STR;
@@ -376,8 +536,18 @@ struct tcb *tcp;
                tprintf("[...]");
                return 0;
        }
-       return decode_select(tcp, args);
+       return decode_select(tcp, args, 0);
+}
+
+#ifdef ALPHA
+int
+sys_osf_select(tcp)
+struct tcb *tcp;
+{
+       long *args = tcp->u_arg;
+       return decode_select(tcp, args, 1);
 }
+#endif
 
 #endif /* LINUX */
 
@@ -386,5 +556,5 @@ sys_select(tcp)
 struct tcb *tcp;
 {
        long *args = tcp->u_arg;
-       return decode_select(tcp, args);
+       return decode_select(tcp, args, 0);
 }