Pre-include LSS
This commit is contained in:
parent
d649b2a3fd
commit
c89f9dddc7
21 changed files with 6438 additions and 1 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -87,5 +87,4 @@ src/Makefile
|
||||||
|
|
||||||
# Ignore directories gclient syncs.
|
# Ignore directories gclient syncs.
|
||||||
src/testing
|
src/testing
|
||||||
src/third_party/lss
|
|
||||||
src/third_party/protobuf
|
src/third_party/protobuf
|
||||||
|
|
3
src/third_party/lss/.gitignore
vendored
Normal file
3
src/third_party/lss/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
*.o
|
||||||
|
|
||||||
|
core
|
12
src/third_party/lss/DIR_METADATA
vendored
Normal file
12
src/third_party/lss/DIR_METADATA
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# Metadata information for this directory.
|
||||||
|
#
|
||||||
|
# For more information on DIR_METADATA files, see:
|
||||||
|
# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md
|
||||||
|
#
|
||||||
|
# For the schema of this file, see Metadata message:
|
||||||
|
# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto
|
||||||
|
|
||||||
|
os: LINUX
|
||||||
|
monorail {
|
||||||
|
project: "linux-syscall-support"
|
||||||
|
}
|
27
src/third_party/lss/LICENSE
vendored
Normal file
27
src/third_party/lss/LICENSE
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
Copyright 2005-2011 Google LLC
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
Neither the name of Google LLC nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
src/third_party/lss/OWNERS
vendored
Normal file
2
src/third_party/lss/OWNERS
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
mseaborn@chromium.org
|
||||||
|
vapier@chromium.org
|
138
src/third_party/lss/README.md
vendored
Normal file
138
src/third_party/lss/README.md
vendored
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
# Linux Syscall Support (LSS)
|
||||||
|
|
||||||
|
Every so often, projects need to directly embed Linux system calls instead of
|
||||||
|
calling the implementations in the system runtime library.
|
||||||
|
|
||||||
|
This project provides a header file that can be included into your application
|
||||||
|
whenever you need to make direct system calls.
|
||||||
|
|
||||||
|
The goal is to provide an API that generally mirrors the standard C library
|
||||||
|
while still making direct syscalls. We try to hide some of the differences
|
||||||
|
between arches when reasonably feasible. e.g. Newer architectures no longer
|
||||||
|
provide an `open` syscall, but do provide `openat`. We will still expose a
|
||||||
|
`sys_open` helper by default that calls into `openat` instead.
|
||||||
|
|
||||||
|
We explicitly do not expose the raw syscall ABI including all of its historical
|
||||||
|
warts to the user. We want people to be able to easily make a syscall, not have
|
||||||
|
to worry that on some arches size args are swapped or they are shifted.
|
||||||
|
|
||||||
|
Please be sure to review the Caveats section below however.
|
||||||
|
|
||||||
|
## How to include linux\_syscall\_support.h in your project
|
||||||
|
|
||||||
|
You can either copy the file into your project, or preferably, you can set up
|
||||||
|
Git submodules to automatically pull from our source repository.
|
||||||
|
|
||||||
|
## Supported targets
|
||||||
|
|
||||||
|
The following architectures/ABIs have been tested (at some point) and should
|
||||||
|
generally work. If you don't see your combo listed here, please double check
|
||||||
|
the header itself as this list might be out of date.
|
||||||
|
|
||||||
|
* x86 32-bit (i.e. i386, i486, i586, i686, Intel, AMD, etc...)
|
||||||
|
* [x86_64 64-bit](https://en.wikipedia.org/wiki/X86-64) (i.e. x86-64, amd64, etc...)
|
||||||
|
* [x32 32-bit](https://sites.google.com/site/x32abi/)
|
||||||
|
* [ARM 32-bit](https://en.wikipedia.org/wiki/ARM_architecture) OABI
|
||||||
|
* [ARM 32-bit](https://en.wikipedia.org/wiki/ARM_architecture) EABI (i.e. armv6, armv7, etc...)
|
||||||
|
* AARCH64 64-bit (i.e. arm64, armv8, etc...)
|
||||||
|
* PowerPC 32-bit (i.e. ppc, ppc32, etc...)
|
||||||
|
* MIPS 32-bit o32 ABI
|
||||||
|
* MIPS 32-bit n32 ABI
|
||||||
|
* MIPS 64-bit n64 ABI
|
||||||
|
* LOONGARCH 64-bit ABI
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
By default, you can just add a `sys_` prefix to any function you want to call.
|
||||||
|
So if you want to call `open(...)`, use `sys_open(...)` instead.
|
||||||
|
|
||||||
|
### Knobs
|
||||||
|
|
||||||
|
The linux\_syscall\_support.h header provides many knobs for you to control
|
||||||
|
the exported API. These are all documented in the top of the header in a big
|
||||||
|
comment block, so refer to that instead.
|
||||||
|
|
||||||
|
## Caveats
|
||||||
|
|
||||||
|
### ABI differences
|
||||||
|
|
||||||
|
Some functions that the standard C library exposes use a different ABI than
|
||||||
|
what the Linux kernel uses. Care must be taken when making syscalls directly
|
||||||
|
that you use the right structure and flags. e.g. Most C libraries define a
|
||||||
|
`struct stat` (commonly in `sys/stat.h` or `bits/stat.h`) that is different
|
||||||
|
from the `struct stat` the kernel uses (commonly in `asm/stat.h`). If you use
|
||||||
|
the wrong structure layout, then you can see errors like memory corruption or
|
||||||
|
weird/shifted values. If you plan on making syscalls directly, you should
|
||||||
|
focus on headers that are available under the `linux/` and `asm/` namespaces.
|
||||||
|
|
||||||
|
Note: LSS provides structs for most of these cases. For `sys_stat()`, it
|
||||||
|
provides `struct kernel_stat` for you to use.
|
||||||
|
|
||||||
|
### Transparent backwards compatibility with older kernels
|
||||||
|
|
||||||
|
While some C libraries (notably, glibc) take care to fallback to older syscalls
|
||||||
|
when running on older kernels, there is no such support in LSS. If you plan on
|
||||||
|
trying to run on older kernels, you will need to handle errors yourself (e.g.
|
||||||
|
`ENOSYS` when using a too new syscall).
|
||||||
|
|
||||||
|
Remember that this can happen with new flag bits too. e.g. The `O_CLOEXEC`
|
||||||
|
flag was added to many syscalls, but if you try to run use it on older kernels,
|
||||||
|
it will fail with `EINVAL`. In that case, you must handle the fallback logic
|
||||||
|
yourself.
|
||||||
|
|
||||||
|
### Variable arguments (varargs)
|
||||||
|
|
||||||
|
We do not support vararg type functions. e.g. While the standard `open()`
|
||||||
|
function can accept 2 or 3 arguments (with the mode field being optional),
|
||||||
|
the `sys_open()` function always requires 3 arguments.
|
||||||
|
|
||||||
|
## Bug reports & feature requests
|
||||||
|
|
||||||
|
If you wish to report a problem or request a feature, please file them in our
|
||||||
|
[bug tracker](https://bugs.chromium.org/p/linux-syscall-support/issues/).
|
||||||
|
|
||||||
|
Please do not post patches to the tracker. Instead, see below for how to send
|
||||||
|
patches to us directly.
|
||||||
|
|
||||||
|
While we welcome feature requests, please keep in mind that it is unlikely that
|
||||||
|
anyone will find time to implement them for you. Sending patches is strongly
|
||||||
|
preferred and will often move things much faster.
|
||||||
|
|
||||||
|
## Projects that use LSS
|
||||||
|
|
||||||
|
* [Chromium](https://www.chromium.org/)
|
||||||
|
* [Breakpad](https://chromium.googlesource.com/breakpad/breakpad)
|
||||||
|
* [Native Client](https://developer.chrome.com/native-client), in nacl\_bootstrap.c
|
||||||
|
|
||||||
|
## How to get an LSS change committed
|
||||||
|
|
||||||
|
### Review
|
||||||
|
|
||||||
|
You get your change reviewed, you can upload it to
|
||||||
|
[Gerrit](https://chromium-review.googlesource.com/q/project:linux-syscall-support+status:open)
|
||||||
|
using `git cl upload` from
|
||||||
|
[Chromium's depot-tools](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html).
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
Tests are found in the [tests/](./tests/) subdirectory. It does not (yet) offer
|
||||||
|
100% coverage, but should grow over time.
|
||||||
|
|
||||||
|
New commits that update/change/add syscall wrappers should include tests for
|
||||||
|
them too. Consult the [test documentation](./tests/README.md) for more details.
|
||||||
|
|
||||||
|
To run, just run `make` inside the tests directory. It will compile & execute
|
||||||
|
the tests locally.
|
||||||
|
|
||||||
|
There is some limited cross-compile coverage available if you run `make cross`.
|
||||||
|
It only compiles things (does not execute at all).
|
||||||
|
|
||||||
|
### Rolling into Chromium
|
||||||
|
|
||||||
|
If you commit a change to LSS, please also commit a Chromium change to update
|
||||||
|
`lss_revision` in
|
||||||
|
[Chromium's DEPS](https://chromium.googlesource.com/chromium/src/+/HEAD/DEPS)
|
||||||
|
file.
|
||||||
|
|
||||||
|
This ensures that the LSS change gets tested, so that people who commit later
|
||||||
|
LSS changes don't run into problems with updating `lss_revision`.
|
5
src/third_party/lss/codereview.settings
vendored
Normal file
5
src/third_party/lss/codereview.settings
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# This file is used by git cl to get repository specific information.
|
||||||
|
CC_LIST: chromium-reviews@chromium.org,mseaborn@chromium.org
|
||||||
|
CODE_REVIEW_SERVER: codereview.chromium.org
|
||||||
|
GERRIT_HOST: True
|
||||||
|
VIEW_VC: https://chromium.googlesource.com/linux-syscall-support/+/
|
5333
src/third_party/lss/linux_syscall_support.h
vendored
Normal file
5333
src/third_party/lss/linux_syscall_support.h
vendored
Normal file
File diff suppressed because it is too large
Load diff
4
src/third_party/lss/tests/.gitignore
vendored
Normal file
4
src/third_party/lss/tests/.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/*_test
|
||||||
|
|
||||||
|
# Some tests create temp files.
|
||||||
|
/tempfile.*
|
147
src/third_party/lss/tests/Makefile
vendored
Normal file
147
src/third_party/lss/tests/Makefile
vendored
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
# Copyright 2018 Google LLC
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above
|
||||||
|
# copyright notice, this list of conditions and the following disclaimer
|
||||||
|
# in the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# * Neither the name of Google LLC nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products derived from
|
||||||
|
# this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
top_srcdir ?= ..
|
||||||
|
|
||||||
|
DEF_FLAGS = -g -pipe
|
||||||
|
DEF_WFLAGS = -Wall
|
||||||
|
CFLAGS ?= $(DEF_FLAGS)
|
||||||
|
CXXFLAGS ?= $(DEF_FLAGS)
|
||||||
|
CFLAGS += $(DEF_WFLAGS) -Wstrict-prototypes
|
||||||
|
CXXFLAGS += $(DEF_WFLAGS)
|
||||||
|
CPPFLAGS += -I$(top_srcdir)
|
||||||
|
# We use static linking here so that if people run through qemu/etc... by hand,
|
||||||
|
# it's a lot easier to run/debug. Same for strace output.
|
||||||
|
LDFLAGS += -static
|
||||||
|
|
||||||
|
TESTS = \
|
||||||
|
fallocate \
|
||||||
|
getitimer \
|
||||||
|
getrandom \
|
||||||
|
lstat \
|
||||||
|
setitimer \
|
||||||
|
sigaction \
|
||||||
|
sigtimedwait \
|
||||||
|
stat \
|
||||||
|
unlink \
|
||||||
|
|
||||||
|
all: check
|
||||||
|
|
||||||
|
%_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h
|
||||||
|
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
# Force building C as C++ code to improve compile-time coverage.
|
||||||
|
%_cc_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h
|
||||||
|
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
%_test: %.cc test_skel.h $(top_srcdir)/linux_syscall_support.h
|
||||||
|
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
%_run: %_test
|
||||||
|
@t=$(@:_run=_test); \
|
||||||
|
echo "./$$t"; \
|
||||||
|
env -i ./$$t; \
|
||||||
|
exit_status=$$?; \
|
||||||
|
if [ $$exit_status = 77 ]; then \
|
||||||
|
echo "SKIP: $$t"; \
|
||||||
|
elif [ $$exit_status != 0 ]; then \
|
||||||
|
echo "FAIL: $$t"; \
|
||||||
|
env -i strace -f -v ./$$t; \
|
||||||
|
echo "TRY: gdb -q -ex r -ex bt ./$$t"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
ALL_TEST_TARGETS = $(TESTS:=_test) $(TESTS:=_cc_test)
|
||||||
|
compile_tests: $(ALL_TEST_TARGETS)
|
||||||
|
|
||||||
|
ALL_RUN_TARGETS = $(TESTS:=_run) $(TESTS:=_cc_run)
|
||||||
|
check: $(ALL_RUN_TARGETS)
|
||||||
|
|
||||||
|
# The "tempfile" targets are the names we use with temp files.
|
||||||
|
# Clean them out in case some tests crashed in the middle.
|
||||||
|
clean:
|
||||||
|
rm -f *~ *.o tempfile.* a.out core $(ALL_TEST_TARGETS)
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.PHONY: all check clean compile_tests
|
||||||
|
.SECONDARY: $(ALL_TEST_TARGETS)
|
||||||
|
|
||||||
|
# Try to cross-compile the tests for all our supported arches. We test with
|
||||||
|
# both gcc and clang. We don't support execution (yet?), but just compiling
|
||||||
|
# & linking helps catch common bugs.
|
||||||
|
.PHONY: cross compile_cross
|
||||||
|
cross_compile:
|
||||||
|
@echo "Running: $(MAKE) $@ CC='$(CC)' CXX='$(CXX)'"; \
|
||||||
|
if (echo '#include <stdio.h>' | $(CC) -x c -c -o /dev/null -) 2>/dev/null; then \
|
||||||
|
$(MAKE) -s clean; \
|
||||||
|
$(MAKE) -k --no-print-directory compile_tests; \
|
||||||
|
else \
|
||||||
|
echo "Skipping $(CC) test: not installed"; \
|
||||||
|
fi; \
|
||||||
|
echo
|
||||||
|
|
||||||
|
# The names here are a best effort. Not easy to probe for.
|
||||||
|
cross:
|
||||||
|
@for cc in \
|
||||||
|
"x86_64-pc-linux-gnu-gcc" \
|
||||||
|
"i686-pc-linux-gnu-gcc" \
|
||||||
|
"x86_64-pc-linux-gnu-gcc -mx32" \
|
||||||
|
"armv7a-unknown-linux-gnueabi-gcc -marm -mhard-float" \
|
||||||
|
"armv7a-unknown-linux-gnueabi-gcc -mthumb -mhard-float" \
|
||||||
|
"powerpc-unknown-linux-gnu-gcc" \
|
||||||
|
"aarch64-unknown-linux-gnu-gcc" \
|
||||||
|
"mips64-unknown-linux-gnu-gcc -mabi=64" \
|
||||||
|
"mips64-unknown-linux-gnu-gcc -mabi=32" \
|
||||||
|
"mips64-unknown-linux-gnu-gcc -mabi=n32" \
|
||||||
|
"s390-ibm-linux-gnu-gcc" \
|
||||||
|
"s390x-ibm-linux-gnu-gcc" \
|
||||||
|
"loongarch64-unknown-linux-gnu-gcc" \
|
||||||
|
; do \
|
||||||
|
cxx=`echo "$$cc" | sed 's:-gcc:-g++:'`; \
|
||||||
|
$(MAKE) --no-print-directory CC="$$cc" CXX="$$cxx" cross_compile; \
|
||||||
|
\
|
||||||
|
sysroot=`$$cc --print-sysroot 2>/dev/null`; \
|
||||||
|
gccdir=`$$cc -print-file-name=libgcc.a 2>/dev/null`; \
|
||||||
|
gccdir=`dirname "$$gccdir"`; \
|
||||||
|
: Skip building for clang for mips/o32 and s390/31-bit until it works.; \
|
||||||
|
case $$cc in \
|
||||||
|
mips64*-mabi=32) continue;; \
|
||||||
|
s390-*) continue;; \
|
||||||
|
esac; \
|
||||||
|
set -- $$cc; \
|
||||||
|
tuple=$${1%-gcc}; \
|
||||||
|
shift; \
|
||||||
|
cc="clang -target $$tuple $$*"; \
|
||||||
|
: Assume the build system is x86_64 based, so ignore the sysroot.; \
|
||||||
|
case $$tuple in \
|
||||||
|
x86_64*) ;; \
|
||||||
|
*) cc="$$cc --sysroot $$sysroot -B$$gccdir -L$$gccdir";; \
|
||||||
|
esac; \
|
||||||
|
cxx=`echo "$$cc" | sed 's:^clang:clang++:'`; \
|
||||||
|
$(MAKE) --no-print-directory CC="$$cc" CXX="$$cxx" cross_compile; \
|
||||||
|
done
|
52
src/third_party/lss/tests/README.md
vendored
Normal file
52
src/third_party/lss/tests/README.md
vendored
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
# LSS Tests
|
||||||
|
|
||||||
|
## Source Layout
|
||||||
|
|
||||||
|
The general layout of the tests:
|
||||||
|
* [test_skel.h]: Test helpers for common checks/etc...
|
||||||
|
* xxx.c: Unittest for the xxx syscall (e.g. `open.c`).
|
||||||
|
* [Makefile]: New tests should be registered in the `TESTS` variable.
|
||||||
|
|
||||||
|
## Test Guidelines
|
||||||
|
|
||||||
|
The unittest itself generally follows the conventions:
|
||||||
|
* Written in C (unless a very specific language behavior is needed).
|
||||||
|
* You should only need to `#include "test_skel.h"`. For new system headers, try
|
||||||
|
to add them here rather than copying to exact unittest (if possible).
|
||||||
|
It might slow compilation down slightly, but makes the code easier to manage.
|
||||||
|
Make sure it is included first.
|
||||||
|
* Use `assert()` on everything to check return values.
|
||||||
|
* Use `sys_xxx()` to access the syscall via LSS (compared to `xxx()` which tends
|
||||||
|
to come from the C library).
|
||||||
|
* If you need a tempfile, use `tempfile.XXXXXX` for templates with helpers like
|
||||||
|
`mkstemp`. Try to clean them up when you're done with them.
|
||||||
|
These will be created in the cwd, but that's fine.
|
||||||
|
* Don't worry about trying to verify the kernel/C library API and various edge
|
||||||
|
cases. The goal of LSS is to make sure that we pass args along correctly to
|
||||||
|
the syscall only.
|
||||||
|
* Make sure to leave comments in the test so it's clear what behavior you're
|
||||||
|
trying to verify (and how).
|
||||||
|
|
||||||
|
Feel free to extend [test_skel.h] with more helpers if they're useful to more
|
||||||
|
than one test.
|
||||||
|
|
||||||
|
If you're looking for a simple example, start with [unlink.c](./unlink.c).
|
||||||
|
You should be able to copy this over and replace the content of `main()`.
|
||||||
|
|
||||||
|
## Running The Tests
|
||||||
|
|
||||||
|
Simply run `make`. This will compile & execute all the tests on your local
|
||||||
|
system. A standard `make clean` will clean up all the objects.
|
||||||
|
|
||||||
|
If you need to debug something, then the programs are simply named `xxx_test`
|
||||||
|
and can easily be thrown into `gdb ./xxx_test`.
|
||||||
|
|
||||||
|
We have rudimentary cross-compile testing via gcc and clang. Try running
|
||||||
|
`make cross` -- for any toolchains you don't have available, it should skip
|
||||||
|
things automatically. This only verifies the compilation & linking stages
|
||||||
|
though.
|
||||||
|
|
||||||
|
The cross-compilers can be created using <http://crosstool-ng.github.io/>.
|
||||||
|
|
||||||
|
[Makefile]: ./Makefile
|
||||||
|
[test_skel.h]: ./test_skel.h
|
69
src/third_party/lss/tests/fallocate.c
vendored
Normal file
69
src/third_party/lss/tests/fallocate.c
vendored
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int fd = 0, mode = 0;
|
||||||
|
loff_t offset = 0, len = 0;
|
||||||
|
|
||||||
|
// Bad file descriptor.
|
||||||
|
fd = -1;
|
||||||
|
assert(sys_fallocate(fd, mode, offset, len) == -1);
|
||||||
|
assert(errno == EBADF);
|
||||||
|
|
||||||
|
char filename[] = "tempfile.XXXXXX";
|
||||||
|
fd = mkstemp(filename);
|
||||||
|
assert(fd >= 0);
|
||||||
|
|
||||||
|
// Invalid len.
|
||||||
|
assert(sys_fallocate(fd, mode, offset, len) == -1);
|
||||||
|
assert(errno == EINVAL);
|
||||||
|
|
||||||
|
// Small offset and length succeeds.
|
||||||
|
len = 4096;
|
||||||
|
assert(sys_fallocate(fd, mode, offset, len) == 0);
|
||||||
|
|
||||||
|
// Large offset succeeds and isn't truncated.
|
||||||
|
offset = 1llu + UINT32_MAX;
|
||||||
|
assert(sys_fallocate(fd, mode , offset, len) == 0);
|
||||||
|
|
||||||
|
#if defined(__NR_fstat64)
|
||||||
|
struct kernel_stat64 st;
|
||||||
|
assert(sys_fstat64(fd, &st) == 0);
|
||||||
|
#else
|
||||||
|
struct kernel_stat st;
|
||||||
|
assert(sys_fstat(fd, &st) == 0);
|
||||||
|
#endif
|
||||||
|
assert(st.st_size == offset + len);
|
||||||
|
|
||||||
|
sys_unlink(filename);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
84
src/third_party/lss/tests/getitimer.c
vendored
Normal file
84
src/third_party/lss/tests/getitimer.c
vendored
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
/* Copyright 2022 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
// We need an invalid timer value. The assert()'s below should
|
||||||
|
// be static asserts but it is not available in older C versions.
|
||||||
|
#define kInvalidTimer 9999
|
||||||
|
assert(kInvalidTimer != ITIMER_REAL);
|
||||||
|
assert(kInvalidTimer != ITIMER_VIRTUAL);
|
||||||
|
assert(kInvalidTimer != ITIMER_PROF);
|
||||||
|
|
||||||
|
// This should fail with EINVAL.
|
||||||
|
struct kernel_itimerval curr_itimer;
|
||||||
|
assert(sys_getitimer(kInvalidTimer, &curr_itimer) == -1);
|
||||||
|
assert(errno == EINVAL);
|
||||||
|
|
||||||
|
// Create a read-only page.
|
||||||
|
size_t page_size = getpagesize();
|
||||||
|
void* read_only_page = sys_mmap(NULL, page_size, PROT_READ,
|
||||||
|
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
|
assert(read_only_page != MAP_FAILED);
|
||||||
|
|
||||||
|
// This should fail with EFAULT.
|
||||||
|
assert(sys_getitimer(ITIMER_REAL,
|
||||||
|
(struct kernel_itimerval*) read_only_page) == -1);
|
||||||
|
assert(errno == EFAULT);
|
||||||
|
|
||||||
|
// This should complete without an error.
|
||||||
|
assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0);
|
||||||
|
|
||||||
|
// Set up a real time timer with very long interval and value so that
|
||||||
|
// we do not need to handle SIGALARM in test.
|
||||||
|
struct kernel_itimerval new_itimer;
|
||||||
|
const time_t kIntervalSec = 60 * 60 * 24 * 365; // One year.
|
||||||
|
const long kIntervalUSec = 123;
|
||||||
|
new_itimer.it_interval.tv_sec = kIntervalSec;
|
||||||
|
new_itimer.it_interval.tv_usec = kIntervalUSec;
|
||||||
|
new_itimer.it_value = new_itimer.it_interval;
|
||||||
|
assert(sys_setitimer(ITIMER_REAL, &new_itimer, NULL) == 0);
|
||||||
|
|
||||||
|
assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0);
|
||||||
|
assert(kernel_timeval_eq(&curr_itimer.it_interval, &new_itimer.it_interval));
|
||||||
|
|
||||||
|
// Disable timer.
|
||||||
|
struct kernel_itimerval empty_itimer;
|
||||||
|
empty_itimer.it_interval.tv_sec = 0;
|
||||||
|
empty_itimer.it_interval.tv_usec = 0;
|
||||||
|
empty_itimer.it_value = empty_itimer.it_interval;
|
||||||
|
assert(sys_setitimer(ITIMER_REAL, &empty_itimer, NULL) == 0);
|
||||||
|
|
||||||
|
// We should read back an empty itimer.
|
||||||
|
assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0);
|
||||||
|
assert(kernel_itimerval_eq(&curr_itimer, &empty_itimer));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
59
src/third_party/lss/tests/getrandom.c
vendored
Normal file
59
src/third_party/lss/tests/getrandom.c
vendored
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/* Copyright 2020 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 256
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
char buffer[BUFFER_SIZE];
|
||||||
|
// Zero it out so we can check later that it's at least not all 0s.
|
||||||
|
memset(buffer, 0, BUFFER_SIZE);
|
||||||
|
bool buffer_contains_all_zeros = true;
|
||||||
|
|
||||||
|
// Don't bother passing any flags. (If we're using lss, we might not have the
|
||||||
|
// right header files with the flags defined anyway, and we'd have to copy
|
||||||
|
// this in here too, and risk getting out of sync in yet another way.)
|
||||||
|
const ssize_t r = sys_getrandom(buffer, BUFFER_SIZE, 0);
|
||||||
|
|
||||||
|
// Make sure it either worked, or that it's just not supported.
|
||||||
|
assert(r == BUFFER_SIZE || errno == ENOSYS);
|
||||||
|
|
||||||
|
if (r == BUFFER_SIZE) {
|
||||||
|
// If all the bytes are 0, it didn't really work.
|
||||||
|
for (size_t i = 0; i < BUFFER_SIZE; ++i) {
|
||||||
|
if (buffer[i] != 0) {
|
||||||
|
buffer_contains_all_zeros = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(!buffer_contains_all_zeros);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
97
src/third_party/lss/tests/lstat.c
vendored
Normal file
97
src/third_party/lss/tests/lstat.c
vendored
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int exit_status = 0;
|
||||||
|
|
||||||
|
// Get two unique paths to play with.
|
||||||
|
char foo[] = "tempfile.XXXXXX";
|
||||||
|
char bar[] = "tempfile.XXXXXX";
|
||||||
|
int fd_foo = mkstemp(foo);
|
||||||
|
int fd_bar = mkstemp(bar);
|
||||||
|
assert(fd_foo != -1);
|
||||||
|
assert(fd_bar != -1);
|
||||||
|
|
||||||
|
// Then delete foo.
|
||||||
|
assert(sys_unlink(foo) == 0);
|
||||||
|
|
||||||
|
// Now make foo a symlink to bar.
|
||||||
|
assert(symlink(bar, foo) == 0);
|
||||||
|
|
||||||
|
// Make sure sys_stat() and sys_lstat() implementation return different
|
||||||
|
// information.
|
||||||
|
|
||||||
|
// We need to check our stat syscalls for EOVERFLOW, as sometimes the integer
|
||||||
|
// types used in the stat structures are too small to fit the actual value.
|
||||||
|
// E.g. on some systems st_ino is 32-bit, but some filesystems have 64-bit
|
||||||
|
// inodes.
|
||||||
|
|
||||||
|
struct kernel_stat lstat_info;
|
||||||
|
int rc = sys_lstat(foo, &lstat_info);
|
||||||
|
if (rc < 0 && errno == EOVERFLOW) {
|
||||||
|
// Bail out since we had an overflow in the stat structure.
|
||||||
|
exit_status = SKIP_TEST_EXIT_STATUS;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
assert(rc == 0);
|
||||||
|
|
||||||
|
struct kernel_stat stat_info;
|
||||||
|
rc = sys_stat(foo, &stat_info);
|
||||||
|
if (rc < 0 && errno == EOVERFLOW) {
|
||||||
|
// Bail out since we had an overflow in the stat structure.
|
||||||
|
exit_status = SKIP_TEST_EXIT_STATUS;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
assert(rc == 0);
|
||||||
|
|
||||||
|
struct kernel_stat bar_stat_info;
|
||||||
|
rc = sys_stat(bar, &bar_stat_info);
|
||||||
|
if (rc < 0 && errno == EOVERFLOW) {
|
||||||
|
// Bail out since we had an overflow in the stat structure.
|
||||||
|
exit_status = SKIP_TEST_EXIT_STATUS;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
assert(rc == 0);
|
||||||
|
|
||||||
|
// lstat should produce information about a symlink.
|
||||||
|
assert((lstat_info.st_mode & S_IFMT) == S_IFLNK);
|
||||||
|
|
||||||
|
// stat-ing foo and bar should produce the same inode.
|
||||||
|
assert(stat_info.st_ino == bar_stat_info.st_ino);
|
||||||
|
|
||||||
|
// lstat-ing foo should give a different inode than stat-ing foo.
|
||||||
|
assert(stat_info.st_ino != lstat_info.st_ino);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
sys_unlink(foo);
|
||||||
|
sys_unlink(bar);
|
||||||
|
return exit_status;
|
||||||
|
}
|
90
src/third_party/lss/tests/setitimer.c
vendored
Normal file
90
src/third_party/lss/tests/setitimer.c
vendored
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/* Copyright 2022 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
// We need an invalid timer value. The assert()'s below should
|
||||||
|
// be static asserts but it is not avalible in older C versions.
|
||||||
|
#define kInvalidTimer 9999
|
||||||
|
assert(kInvalidTimer != ITIMER_REAL);
|
||||||
|
assert(kInvalidTimer != ITIMER_VIRTUAL);
|
||||||
|
assert(kInvalidTimer != ITIMER_PROF);
|
||||||
|
|
||||||
|
// Invalid timer returns EINVAL.
|
||||||
|
assert(sys_setitimer(kInvalidTimer, NULL, NULL) == -1);
|
||||||
|
assert(errno == EINVAL);
|
||||||
|
|
||||||
|
const int kSignal = SIGALRM;
|
||||||
|
const size_t kSigsetSize = sizeof(struct kernel_sigset_t);
|
||||||
|
|
||||||
|
// Block SIGALRM.
|
||||||
|
struct kernel_sigset_t sigalarm_only;
|
||||||
|
struct kernel_sigset_t old_sigset;
|
||||||
|
assert(sys_sigemptyset(&sigalarm_only) == 0);
|
||||||
|
assert(sys_sigaddset(&sigalarm_only, kSignal) == 0);
|
||||||
|
assert(sys_rt_sigprocmask(SIG_BLOCK, &sigalarm_only, &old_sigset,
|
||||||
|
kSigsetSize) == 0);
|
||||||
|
|
||||||
|
// Set up a real time timer.
|
||||||
|
struct kernel_itimerval new_itimer = {};
|
||||||
|
const long kIntervalUSec = 123;
|
||||||
|
new_itimer.it_interval.tv_sec = 0;
|
||||||
|
new_itimer.it_interval.tv_usec = kIntervalUSec;
|
||||||
|
new_itimer.it_value = new_itimer.it_interval;
|
||||||
|
assert(sys_setitimer(ITIMER_REAL, &new_itimer, NULL) == 0);
|
||||||
|
|
||||||
|
// Wait for alarm.
|
||||||
|
struct timespec timeout;
|
||||||
|
const unsigned long kNanoSecsPerSec = 1000000000;
|
||||||
|
const unsigned long kNanoSecsPerMicroSec = 1000;
|
||||||
|
|
||||||
|
// Use a timeout 3 times of the timer interval.
|
||||||
|
unsigned long duration_ns = kIntervalUSec * kNanoSecsPerMicroSec * 3;
|
||||||
|
timeout.tv_sec = duration_ns / kNanoSecsPerSec ;
|
||||||
|
timeout.tv_nsec = duration_ns % kNanoSecsPerSec;
|
||||||
|
|
||||||
|
int sig;
|
||||||
|
do {
|
||||||
|
sig = sys_sigtimedwait(&sigalarm_only, NULL, &timeout);
|
||||||
|
} while (sig == -1 && errno == EINTR);
|
||||||
|
assert(sig == kSignal);
|
||||||
|
|
||||||
|
// Disable timer, check saving of old timer value.
|
||||||
|
struct kernel_itimerval empty_itimer = {};
|
||||||
|
struct kernel_itimerval old_itimer;
|
||||||
|
empty_itimer.it_interval.tv_sec = 0;
|
||||||
|
empty_itimer.it_interval.tv_usec = 0;
|
||||||
|
empty_itimer.it_value = empty_itimer.it_interval;
|
||||||
|
|
||||||
|
assert(sys_setitimer(ITIMER_REAL, &empty_itimer, &old_itimer) == 0);
|
||||||
|
assert(kernel_timeval_eq(&old_itimer.it_interval, &new_itimer.it_interval));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
54
src/third_party/lss/tests/sigaction.c
vendored
Normal file
54
src/third_party/lss/tests/sigaction.c
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/* Copyright 2020 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
void test_handler(int sig) {}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
const size_t kSigsetSize = sizeof(struct kernel_sigset_t);
|
||||||
|
struct kernel_sigaction action = {};
|
||||||
|
// Invalid signal returns EINVAL.
|
||||||
|
assert(sys_rt_sigaction(SIGKILL, &action, NULL, kSigsetSize) == -1);
|
||||||
|
assert(errno == EINVAL);
|
||||||
|
|
||||||
|
// Set an action.
|
||||||
|
action.sa_handler_ = test_handler;
|
||||||
|
action.sa_flags = SA_SIGINFO;
|
||||||
|
assert(sys_sigemptyset(&action.sa_mask) == 0);
|
||||||
|
assert(sys_sigaddset(&action.sa_mask, SIGPIPE) == 0);
|
||||||
|
assert(sys_rt_sigaction(SIGSEGV, &action, NULL, kSigsetSize) == 0);
|
||||||
|
|
||||||
|
// Retrieve the action.
|
||||||
|
struct kernel_sigaction old_action = {};
|
||||||
|
assert(sys_rt_sigaction(SIGSEGV, NULL, &old_action, kSigsetSize) == 0);
|
||||||
|
assert(memcmp(&action, &old_action, sizeof(action)) == 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
58
src/third_party/lss/tests/sigtimedwait.c
vendored
Normal file
58
src/third_party/lss/tests/sigtimedwait.c
vendored
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
struct kernel_sigset_t sigset = {};
|
||||||
|
siginfo_t siginfo = {};
|
||||||
|
struct timespec timeout = {};
|
||||||
|
|
||||||
|
// Invalid timeouts.
|
||||||
|
timeout.tv_sec = -1;
|
||||||
|
assert(sys_sigtimedwait(&sigset, &siginfo, &timeout) == -1);
|
||||||
|
assert(errno == EINVAL);
|
||||||
|
|
||||||
|
// Expired timeouts.
|
||||||
|
timeout.tv_sec = 0;
|
||||||
|
assert(sys_sigtimedwait(&sigset, &siginfo, &timeout) == -1);
|
||||||
|
assert(errno == EAGAIN);
|
||||||
|
|
||||||
|
// Success.
|
||||||
|
const int kTestSignal = SIGCONT;
|
||||||
|
assert(sys_sigemptyset(&sigset) == 0);
|
||||||
|
assert(sys_sigaddset(&sigset, kTestSignal) == 0);
|
||||||
|
assert(sys_sigprocmask(SIG_BLOCK, &sigset, NULL) == 0);
|
||||||
|
assert(raise(kTestSignal) == 0);
|
||||||
|
assert(sys_sigtimedwait(&sigset, &siginfo, &timeout) == kTestSignal);
|
||||||
|
assert(siginfo.si_signo == kTestSignal);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
67
src/third_party/lss/tests/stat.c
vendored
Normal file
67
src/third_party/lss/tests/stat.c
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int exit_status = 0;
|
||||||
|
|
||||||
|
// Get two unique paths to play with.
|
||||||
|
char foo[] = "tempfile.XXXXXX";
|
||||||
|
int fd_foo = mkstemp(foo);
|
||||||
|
assert(fd_foo != -1);
|
||||||
|
|
||||||
|
// Make sure it exists.
|
||||||
|
assert(access(foo, F_OK) == 0);
|
||||||
|
|
||||||
|
// Make sure sys_stat() and a libc stat() implementation return the same
|
||||||
|
// information.
|
||||||
|
struct stat libc_stat;
|
||||||
|
assert(stat(foo, &libc_stat) == 0);
|
||||||
|
|
||||||
|
struct kernel_stat raw_stat;
|
||||||
|
// We need to check our stat syscall for EOVERFLOW, as sometimes the integer
|
||||||
|
// types used in the stat structures are too small to fit the actual value.
|
||||||
|
// E.g. on some systems st_ino is 32-bit, but some filesystems have 64-bit
|
||||||
|
// inodes.
|
||||||
|
int rc = sys_stat(foo, &raw_stat);
|
||||||
|
if (rc < 0 && errno == EOVERFLOW) {
|
||||||
|
// Bail out since we had an overflow in the stat structure.
|
||||||
|
exit_status = SKIP_TEST_EXIT_STATUS;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
assert(rc == 0);
|
||||||
|
|
||||||
|
assert(libc_stat.st_ino == raw_stat.st_ino);
|
||||||
|
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
sys_unlink(foo);
|
||||||
|
return exit_status;
|
||||||
|
}
|
89
src/third_party/lss/tests/test_skel.h
vendored
Normal file
89
src/third_party/lss/tests/test_skel.h
vendored
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
/* Copyright 2018 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure it's defined before including anything else. A number of syscalls
|
||||||
|
* are GNU extensions and rely on being exported by glibc.
|
||||||
|
*/
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the assert checks aren't removed as all the unittests are based
|
||||||
|
* on them.
|
||||||
|
*/
|
||||||
|
#undef NDEBUG
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/vfs.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <linux/capability.h>
|
||||||
|
|
||||||
|
#include "linux_syscall_support.h"
|
||||||
|
|
||||||
|
#define SKIP_TEST_EXIT_STATUS 77
|
||||||
|
|
||||||
|
void assert_buffers_eq_len(const void *buf1, const void *buf2, size_t len) {
|
||||||
|
const uint8_t *u8_1 = (const uint8_t *)buf1;
|
||||||
|
const uint8_t *u8_2 = (const uint8_t *)buf2;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; ++i) {
|
||||||
|
if (u8_1[i] != u8_2[i])
|
||||||
|
printf("offset %zu: %02x != %02x\n", i, u8_1[i], u8_2[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#define assert_buffers_eq(obj1, obj2) assert_buffers_eq_len(obj1, obj2, sizeof(*obj1))
|
||||||
|
|
||||||
|
// Returns true iff pointed timevals are equal.
|
||||||
|
static inline bool kernel_timeval_eq(const struct kernel_timeval* lhs,
|
||||||
|
const struct kernel_timeval* rhs) {
|
||||||
|
return (lhs->tv_sec == rhs->tv_sec) && (lhs->tv_usec == rhs->tv_usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true iff pointed itimervals are equal.
|
||||||
|
static inline bool kernel_itimerval_eq(const struct kernel_itimerval* lhs,
|
||||||
|
const struct kernel_itimerval* rhs) {
|
||||||
|
return kernel_timeval_eq(&lhs->it_interval, &rhs->it_interval) &&
|
||||||
|
kernel_timeval_eq(&lhs->it_value, &rhs->it_value);
|
||||||
|
}
|
||||||
|
|
48
src/third_party/lss/tests/unlink.c
vendored
Normal file
48
src/third_party/lss/tests/unlink.c
vendored
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/* Copyright 2018 Google LLC
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Google LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_skel.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
// Get a unique path to play with.
|
||||||
|
char foo[] = "tempfile.XXXXXX";
|
||||||
|
int fd = mkstemp(foo);
|
||||||
|
assert(fd != -1);
|
||||||
|
|
||||||
|
// Make sure it exists.
|
||||||
|
assert(access(foo, F_OK) == 0);
|
||||||
|
|
||||||
|
// Then delete it.
|
||||||
|
assert(sys_unlink(foo) == 0);
|
||||||
|
|
||||||
|
// Make sure it's gone.
|
||||||
|
assert(access(foo, F_OK) != 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue