.----. | .----.
/ \ | / __ \
| \\\\....^.........| / \ |
.-------------| '----- argv[] ---> | | =----------------.
{ portal-exec | ------ envp[] ---->| |== portal-spawner }
'-------------| .----open fds ---> | | =----------------'
| /////''''v'''''''''| '' |
\.__./ | \.__../
|
Run a program in another environment on the same machine by forwarding arguments, environment variables and open file descriptors through a single unix domain socket.
Start the spawner like this, providing the full path to an executable:
$ ./portal-spawner /usr/games/cowsay
This will create a unix domain socket by default named portal.sock
in the
local directory. As long as this socket is reachable by portal-exec
, try
the following in another terminal:
$ ./portal-exec moo
_____
< moo >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
stdin
, stdout
and stderr
and the moo
argument and all environment
variables of portal-exec
are transferred through portal.sock
to the
spawner process. It forks a worker process and then finally runs the
specified executable cowsay
with all args, envs and file descriptors set
up. The exit code or exit signals are transferred back to portal-exec
.
As cowsay
has the file descriptors originating from portal-exec
, all
output appears in its terminal.
You can also omit the executable when running portal-spawner
or already
provide arguments to a specified program. The arguments of portal-exec
are appended to the arguments of portal-spawner
putting together the full
argv[]
and executable in argv[0]
passed to exeve
.
You can change the portal.sock
filename by setting a PORTAL_NAME
prior
to launching both portal-spawner
and portal-exec
. PORTAL_NAME
itself
is not transferred from exec to spawner.
The portal-spawner
can run in a restricted environment or directly use
something like bubblewrap to set one up on each invocation. Right now this
is used in an experimental info-beamer package where arguments and
crucially an dmabuf fd is forwarded from one process to another running in
a squashfs overlay. As the overlay can remain active between multiple runs,
the filesystem cache doesn't get invalidated as would be the case if
overlay would be set up each run.