2020-06-15 14:18:57 +00:00
|
|
|
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
|
|
|
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
|
|
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
|
|
|
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
|
|
|
│ │
|
2020-12-28 01:18:44 +00:00
|
|
|
│ Permission to use, copy, modify, and/or distribute this software for │
|
|
|
|
│ any purpose with or without fee is hereby granted, provided that the │
|
|
|
|
│ above copyright notice and this permission notice appear in all copies. │
|
2020-06-15 14:18:57 +00:00
|
|
|
│ │
|
2020-12-28 01:18:44 +00:00
|
|
|
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
|
|
|
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
|
|
|
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
|
|
|
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
|
|
|
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
|
|
|
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
|
|
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
|
|
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
2020-06-15 14:18:57 +00:00
|
|
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
|
|
#include "libc/calls/calls.h"
|
|
|
|
#include "libc/calls/internal.h"
|
2022-05-23 22:06:11 +00:00
|
|
|
#include "libc/calls/syscall-nt.internal.h"
|
|
|
|
#include "libc/calls/syscall-sysv.internal.h"
|
2020-06-15 14:18:57 +00:00
|
|
|
#include "libc/dce.h"
|
2022-08-21 07:17:20 +00:00
|
|
|
#include "libc/intrin/describeflags.internal.h"
|
2022-09-13 06:10:38 +00:00
|
|
|
#include "libc/intrin/strace.internal.h"
|
2022-08-13 20:11:56 +00:00
|
|
|
#include "libc/intrin/weaken.h"
|
2021-09-12 05:30:37 +00:00
|
|
|
#include "libc/log/backtrace.internal.h"
|
2021-06-24 19:31:26 +00:00
|
|
|
#include "libc/zipos/zipos.internal.h"
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
/**
|
2022-10-03 05:14:33 +00:00
|
|
|
* Changes current position of file descriptor, e.g.
|
|
|
|
*
|
|
|
|
* int fd = open("hello.bin", O_RDONLY);
|
|
|
|
* lseek(fd, 100, SEEK_SET); // set position to 100th byte
|
|
|
|
* read(fd, buf, 8); // read bytes 100 through 107
|
|
|
|
*
|
|
|
|
* This function may be used to inspect the current position:
|
|
|
|
*
|
|
|
|
* int64_t pos = lseek(fd, 0, SEEK_CUR);
|
|
|
|
*
|
|
|
|
* You may seek past the end of file. If a write happens afterwards
|
|
|
|
* then the gap leading up to it will be filled with zeroes. Please
|
|
|
|
* note that lseek() by itself will not extend the physical medium.
|
|
|
|
*
|
|
|
|
* If dup() is used then the current position will be shared across
|
|
|
|
* multiple file descriptors. If you seek in one it will implicitly
|
|
|
|
* seek the other too.
|
|
|
|
*
|
|
|
|
* The current position of a file descriptor is shared between both
|
|
|
|
* processes and threads. For example, if an fd is inherited across
|
|
|
|
* fork(), and both the child and parent want to read from it, then
|
|
|
|
* changes made by one are observable to the other.
|
|
|
|
*
|
|
|
|
* The pread() and pwrite() functions obfuscate the need for having
|
|
|
|
* global shared file position state. Consider using them, since it
|
|
|
|
* helps avoid the gotchas of this interface described above.
|
|
|
|
*
|
|
|
|
* This function is supported by all OSes within our support vector
|
|
|
|
* and our unit tests demonstrate the behaviors described above are
|
|
|
|
* consistent across platforms.
|
2020-06-15 14:18:57 +00:00
|
|
|
*
|
|
|
|
* @param fd is a number returned by open()
|
2022-10-03 05:14:33 +00:00
|
|
|
* @param offset is 0-indexed byte count w.r.t. `whence`
|
|
|
|
* @param whence can be one of:
|
|
|
|
* - `SEEK_SET`: Sets the file position to `offset` [default]
|
|
|
|
* - `SEEK_CUR`: Sets the file position to `position + offset`
|
|
|
|
* - `SEEK_END`: Sets the file position to `filesize + offset`
|
|
|
|
* @return new position relative to beginning, or -1 w/ errno
|
|
|
|
* @raise ESPIPE if `fd` is a pipe, socket, or fifo
|
|
|
|
* @raise EBADF if `fd` isn't an open file descriptor
|
|
|
|
* @raise EINVAL if resulting offset would be negative
|
|
|
|
* @raise EINVAL if `whence` isn't valid
|
2020-06-15 14:18:57 +00:00
|
|
|
* @asyncsignalsafe
|
2022-10-03 05:14:33 +00:00
|
|
|
* @threadsafe
|
|
|
|
* @vforksafe
|
2020-06-15 14:18:57 +00:00
|
|
|
*/
|
2022-10-11 00:52:41 +00:00
|
|
|
int64_t lseek(int fd, int64_t offset, int whence) {
|
Introduce --strace flag for system call tracing
This is similar to the --ftrace (c function call trace) flag, except
it's less noisy since it only logs system calls to stderr. Having this
flag is valuable because (1) system call tracing tells us a lot about
the behavior of complex programs and (2) it's usually very hard to get
system call tracing on various operating systems, e.g. strace, ktrace,
dtruss, truss, nttrace, etc. Especially on Apple platforms where even
with the special boot trick, debuggers still aren't guaranteed to work.
make -j8 o//examples
o//examples/hello.com --strace
This is enabled by default in MODE=, MODE=opt, and MODE=dbg. In MODE=dbg
extra information will be printed.
make -j8 MODE=dbg o/dbg/examples
o/dbg/examples/hello.com --strace |& less
This change also changes:
- Rename IsText() → _istext()
- Rename IsUtf8() → _isutf8()
- Fix madvise() on Windows NT
- Fix empty string case of inet_ntop()
- vfork() wrapper now saves and restores errno
- Update xsigaction() to yoink syscall support
2022-03-19 01:07:28 +00:00
|
|
|
int64_t rc;
|
2021-06-24 19:31:26 +00:00
|
|
|
if (fd < g_fds.n && g_fds.p[fd].kind == kFdZip) {
|
2022-09-13 06:10:38 +00:00
|
|
|
rc = _weaken(__zipos_lseek)(
|
2021-06-24 19:31:26 +00:00
|
|
|
(struct ZiposHandle *)(intptr_t)g_fds.p[fd].handle, offset, whence);
|
|
|
|
} else if (!IsWindows() && !IsOpenbsd() && !IsNetbsd()) {
|
Introduce --strace flag for system call tracing
This is similar to the --ftrace (c function call trace) flag, except
it's less noisy since it only logs system calls to stderr. Having this
flag is valuable because (1) system call tracing tells us a lot about
the behavior of complex programs and (2) it's usually very hard to get
system call tracing on various operating systems, e.g. strace, ktrace,
dtruss, truss, nttrace, etc. Especially on Apple platforms where even
with the special boot trick, debuggers still aren't guaranteed to work.
make -j8 o//examples
o//examples/hello.com --strace
This is enabled by default in MODE=, MODE=opt, and MODE=dbg. In MODE=dbg
extra information will be printed.
make -j8 MODE=dbg o/dbg/examples
o/dbg/examples/hello.com --strace |& less
This change also changes:
- Rename IsText() → _istext()
- Rename IsUtf8() → _isutf8()
- Fix madvise() on Windows NT
- Fix empty string case of inet_ntop()
- vfork() wrapper now saves and restores errno
- Update xsigaction() to yoink syscall support
2022-03-19 01:07:28 +00:00
|
|
|
rc = sys_lseek(fd, offset, whence, 0);
|
2021-02-07 14:11:44 +00:00
|
|
|
} else if (IsOpenbsd() || IsNetbsd()) {
|
Introduce --strace flag for system call tracing
This is similar to the --ftrace (c function call trace) flag, except
it's less noisy since it only logs system calls to stderr. Having this
flag is valuable because (1) system call tracing tells us a lot about
the behavior of complex programs and (2) it's usually very hard to get
system call tracing on various operating systems, e.g. strace, ktrace,
dtruss, truss, nttrace, etc. Especially on Apple platforms where even
with the special boot trick, debuggers still aren't guaranteed to work.
make -j8 o//examples
o//examples/hello.com --strace
This is enabled by default in MODE=, MODE=opt, and MODE=dbg. In MODE=dbg
extra information will be printed.
make -j8 MODE=dbg o/dbg/examples
o/dbg/examples/hello.com --strace |& less
This change also changes:
- Rename IsText() → _istext()
- Rename IsUtf8() → _isutf8()
- Fix madvise() on Windows NT
- Fix empty string case of inet_ntop()
- vfork() wrapper now saves and restores errno
- Update xsigaction() to yoink syscall support
2022-03-19 01:07:28 +00:00
|
|
|
rc = sys_lseek(fd, offset, offset, whence);
|
2020-06-15 14:18:57 +00:00
|
|
|
} else {
|
Introduce --strace flag for system call tracing
This is similar to the --ftrace (c function call trace) flag, except
it's less noisy since it only logs system calls to stderr. Having this
flag is valuable because (1) system call tracing tells us a lot about
the behavior of complex programs and (2) it's usually very hard to get
system call tracing on various operating systems, e.g. strace, ktrace,
dtruss, truss, nttrace, etc. Especially on Apple platforms where even
with the special boot trick, debuggers still aren't guaranteed to work.
make -j8 o//examples
o//examples/hello.com --strace
This is enabled by default in MODE=, MODE=opt, and MODE=dbg. In MODE=dbg
extra information will be printed.
make -j8 MODE=dbg o/dbg/examples
o/dbg/examples/hello.com --strace |& less
This change also changes:
- Rename IsText() → _istext()
- Rename IsUtf8() → _isutf8()
- Fix madvise() on Windows NT
- Fix empty string case of inet_ntop()
- vfork() wrapper now saves and restores errno
- Update xsigaction() to yoink syscall support
2022-03-19 01:07:28 +00:00
|
|
|
rc = sys_lseek_nt(fd, offset, whence);
|
2020-06-15 14:18:57 +00:00
|
|
|
}
|
2022-08-21 07:17:20 +00:00
|
|
|
STRACE("lseek(%d, %'ld, %s) → %'ld% m", fd, offset, DescribeWhence(whence),
|
|
|
|
rc);
|
Introduce --strace flag for system call tracing
This is similar to the --ftrace (c function call trace) flag, except
it's less noisy since it only logs system calls to stderr. Having this
flag is valuable because (1) system call tracing tells us a lot about
the behavior of complex programs and (2) it's usually very hard to get
system call tracing on various operating systems, e.g. strace, ktrace,
dtruss, truss, nttrace, etc. Especially on Apple platforms where even
with the special boot trick, debuggers still aren't guaranteed to work.
make -j8 o//examples
o//examples/hello.com --strace
This is enabled by default in MODE=, MODE=opt, and MODE=dbg. In MODE=dbg
extra information will be printed.
make -j8 MODE=dbg o/dbg/examples
o/dbg/examples/hello.com --strace |& less
This change also changes:
- Rename IsText() → _istext()
- Rename IsUtf8() → _isutf8()
- Fix madvise() on Windows NT
- Fix empty string case of inet_ntop()
- vfork() wrapper now saves and restores errno
- Update xsigaction() to yoink syscall support
2022-03-19 01:07:28 +00:00
|
|
|
return rc;
|
2020-06-15 14:18:57 +00:00
|
|
|
}
|