|
NAME | SYNOPSIS | DESCRIPTION | RETURN VALUE | CONFORMING TO | REPORTING BUGS | SEE ALSO | COLOPHON |
|
|
|
LIBPSX(3) Linux Programmer's Manual LIBPSX(3)
psx_syscall3, psx_syscall6, psx_set_sensitivity - POSIX semantics
for system calls
#include <sys/psx_syscall.h>
long int psx_syscall3(long int syscall_nr,
long int arg1, long int arg2, long int arg3);
long int psx_syscall6(long int syscall_nr,
long int arg1, long int arg2, long int arg3,
long int arg4, long int arg5, long int arg6);
int psx_set_sensitivity(psx_sensitivity_t sensitivity);
void psx_load_syscalls(long int (**syscall_fn)(long int,
long int, long int, long int),
long int (**syscall6_fn)(long int,
long int, long int, long int,
long int, long int, long int));
Any code that uses one of the above functions can be linked as
follows:
ld ... -lpsx -lpthread
gcc ... -lpsx -lpthread
Note, special flags are needed to get -lcap to operated with
process wide capabilities when linked with -lpsx. Namely, use the
pkg-config option file: gcc ... -lcap $(pkg-config --libs --cflags
libpsx) More details are available in the cap_get_proc(3) man
page.
The libpsx library attempts to fill a gap left by the pthreads(7)
implementation on Linux. To be compliant POSIX threads, via the
nptl(7) setxid mechanism, glibc maintains consistent UID and GID
credentials amongst all of the threads associated with the current
process. However, other credential state is not supported by this
abstraction. To support these extended kernel managed security
attributes, libpsx provides a more generic pair of wrapping system
call functions: psx_syscall3() and psx_syscall6(). Like the
setxid mechanism, the coordination of thread state is mediated by
a realtime signal. Whereas the nptl:setxid mechanism uses signo=33
(which is hidden by glibc below a redefined SIGRTMIN), libpsx
inserts itself in the SIGSYS handler stack. It goes to great
length to be the first such handler but acts as a pass-through for
other SIGSYS uses.
An inefficient macrology trick supports the psx_syscall() pseudo
function which takes 1 to 7 arguments, depending on the needs of
the caller. The macrology (which ultimately invokes
__psx_syscall()) pads out the call to actually use psx_syscall3()
or psx_syscall6() with zeros filling the missing arguments. While
using this in source code will make it appear clean, the actual
code footprint is larger. You are encouraged to use the more
explicit psx_syscall3() and psx_syscall6() functions as needed.
psx_set_sensitivity() changes the behavior of the mirrored system
calls: PSX_IGNORE ensures that differences are ignored (the
default behavior); PSX_WARNING prints a stderr notification about
how the results differ; and PSX_ERROR prints the error details and
generates a SIGSYS signal.
psx_load_syscalls() can be used to set caller defined function
pointers for invoking 3 and 6 argument syscalls. This function can
be used to configure a library, or program to change behavior when
linked against libpsx. Indeed, libcap uses this function from
libpsx to override its thread scoped default system call based
API. When linked with libpsx, libcap can operate on all the
threads of a multithreaded program to operate with POSIX
semantics.
The return value for system call functions is generally the value
returned by the kernel, or -1 in the case of an error. In such
cases errno(3) is set to the detailed error value. The
psx_syscall3() and psx_syscall6() functions attempt a single
threaded system call and return immediately in the case of an
error. Should this call succeed, then the same system calls are
executed from a signal handler on each of the other threads of the
process.
The needs of libcap(3) for POSIX semantics of capability
manipulation. You can read more about why this is needed here:
https://sites.google.com/site/fullycapable/who-ordered-libpsx
Versions of libpsx prior to 2.72 only supported pthreads. Since
libpsx-2.72 the library works with all Linux thread
implementations as it operates at the lowest level of thread
abstraction, LWPs.
The libpsx library is distributed from
https://sites.google.com/site/fullycapable/ where the release
notes may already cover recent issues. Please report newly
discovered bugs via:
https://bugzilla.kernel.org/buglist.cgi?component=libcap&list_id=1090757
libcap(3), cap_get_proc(3), pthreads(7) and nptl(7).
This page is part of the libcap (capabilities commands and
library) project. Information about the project can be found at
⟨https://git.kernel.org/pub/scm/libs/libcap/libcap.git/⟩. If you
have a bug report for this manual page, send it to
[email protected] (please put "libcap" in the Subject line). This
page was obtained from the project's upstream Git repository
⟨https://git.kernel.org/pub/scm/libs/libcap/libcap.git/⟩ on
2025-08-11. (At that time, the date of the most recent commit
that was found in the repository was 2025-08-10.) If you discover
any rendering problems in this HTML version of the page, or you
believe there is a better or more up-to-date source for the page,
or you have corrections or improvements to the information in this
COLOPHON (which is not part of the original manual page), send a
mail to [email protected]
2024-11-09 LIBPSX(3)
Pages that refer to this page: cap_get_proc(3), cap_launch(3), libcap(3)