blob: 8991681929a862aa1730c0590d107fbb113d3529 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
This is a quick attempt at documenting the basic program flow for both the main
pseudo executable and the pseudo wrapper library. The key thing to note is
that there are key init functions. These functions are designed to be
re-invoked if it becomes necessary to reset the system environment.
libpseudo execution flow:
# on startup #
pseudo_wrappers.c: (constructor) _libpseudo_init()
pseudo_util.c: pseudo_init_util()
copy environment
setup PSEUDO_DEBUG levels
pseudo_wrappers.c: pseudo_init_wrappers()
setup pseudo_functions
setup pseudo_logfile
pseudo_client.c: pseudo_init_client()
setup PSEUDO_DISBLED
setup pseudo_prefix_dir_fd
setup pseudo_localstate_dir_fd
setup PSEUDO_NOSYMLINKEXP
setup PSEUDO_UIDS
setup PSEUDO_GIDS
setup PSEUDO_CHROOT
setup PSEUDO_PASSWD
# regular program execution #
exec*()
pseudo_check_wrappers():
pseudo_reinit_libpseudo if necessary
call wrap_exec*()
if !PSEUDO_RELOADED
pseudo_setupenv()
else
pseudo_setupenv()
pseudo_dropenv()
real_exec*()
fork()
clone()
pseudo_check_wrappers():
pseudo_reinit_libpseudo if necessary
call wrap_exec*()
if !PSEUDO_RELOADED
pseudo_setupenv()
pseudo_reinit_libpseudo()
_libpseudo_init()
else
pseudo_setupenv()
pseudo_dropenv()
real_*()
... normal function wrappers ... (templates/wrapfuncs.c):
pseudo_check_wrappers() || !real_*
return enosys
variadic setup (if necessary)
if pseudo_disabled return real_*()
pseudo_sigblock
pseudo_getlock
if antimagic rc = real_*()
else rc = wrap_*()
variadic end (if necessary)
pseudo_droplock
unmask signals
return rc
pseudo execution flow:
pseudo.c: main()
pseudo_util.c: pseudo_init_util()
<see above>
check LD_PRELOAD
process arguments
setup PSEUDO_OPTS
...
startup server
|