* 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" },
#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
#ifdef LOCK_SH
-static struct xlat flockcmds[] = {
+static const struct xlat flockcmds[] = {
{ LOCK_SH, "LOCK_SH" },
{ LOCK_EX, "LOCK_EX" },
{ LOCK_NB, "LOCK_NB" },
#endif /* LOCK_SH */
-static struct xlat lockfcmds[] = {
+static const struct xlat lockfcmds[] = {
{ F_RDLCK, "F_RDLCK" },
{ F_WRLCK, "F_WRLCK" },
{ F_UNLCK, "F_UNLCK" },
{ 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;
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];
sys_fcntl(tcp)
struct tcb *tcp;
{
- extern struct xlat openmodes[];
+ extern const struct xlat openmodes[];
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
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]) {
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;
}
}
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;
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 = "";
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;
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 */
struct tcb *tcp;
{
long *args = tcp->u_arg;
- return decode_select(tcp, args);
+ return decode_select(tcp, args, 0);
}