Mirror of strace – the linux syscall tracer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lseek.c 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
  3. * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
  4. * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
  5. * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
  6. * Copyright (c) 2002-2005 Roland McGrath <roland@redhat.com>
  7. * Copyright (c) 2009 Andreas Schwab <schwab@redhat.com>
  8. * Copyright (c) 2012 H.J. Lu <hongjiu.lu@intel.com>
  9. * Copyright (c) 2013 Denys Vlasenko <vda.linux@googlemail.com>
  10. * Copyright (c) 2014-2016 Dmitry V. Levin <ldv@altlinux.org>
  11. * Copyright (c) 2014-2018 The strace developers.
  12. * All rights reserved.
  13. *
  14. * SPDX-License-Identifier: LGPL-2.1-or-later
  15. */
  16. #include "defs.h"
  17. #include "xlat/whence_codes.h"
  18. /* Linux kernel has exactly one version of lseek:
  19. * fs/read_write.c::SYSCALL_DEFINE3(lseek, unsigned, fd, off_t, offset, unsigned, origin)
  20. * In kernel, off_t is always the same as (kernel's) long
  21. * (see include/uapi/asm-generic/posix_types.h).
  22. * Use test/x32_lseek.c to test lseek decoding.
  23. */
  24. SYS_FUNC(lseek)
  25. {
  26. printfd(tcp, tcp->u_arg[0]);
  27. kernel_long_t offset;
  28. #ifndef current_klongsize
  29. if (current_klongsize < sizeof(kernel_long_t)) {
  30. offset = (int) tcp->u_arg[1];
  31. } else
  32. #endif /* !current_klongsize */
  33. {
  34. offset = tcp->u_arg[1];
  35. }
  36. tprintf(", %" PRI_kld ", ", offset);
  37. printxval(whence_codes, tcp->u_arg[2], "SEEK_???");
  38. return RVAL_DECODED;
  39. }
  40. /* llseek syscall takes explicitly two ulong arguments hi, lo,
  41. * rather than one 64-bit argument for which ULONG_LONG works
  42. * appropriate for the native byte order.
  43. *
  44. * See kernel's fs/read_write.c::SYSCALL_DEFINE5(llseek, ...)
  45. *
  46. * hi,lo are "unsigned longs" and combined exactly this way in kernel:
  47. * ((loff_t) hi << 32) | lo
  48. * Note that for architectures with kernel's long wider than userspace long
  49. * (such as x32), combining code will use *kernel's*, i.e. *wide* longs
  50. * for hi and lo.
  51. */
  52. SYS_FUNC(llseek)
  53. {
  54. if (entering(tcp)) {
  55. printfd(tcp, tcp->u_arg[0]);
  56. tprintf(", %lld, ",
  57. ((long long) tcp->u_arg[1] << 32)
  58. | ((long long) tcp->u_arg[2]));
  59. } else {
  60. printnum_int64(tcp, tcp->u_arg[3], "%" PRIu64);
  61. tprints(", ");
  62. printxval(whence_codes, tcp->u_arg[4], "SEEK_???");
  63. }
  64. return 0;
  65. }