aboutsummaryrefslogtreecommitdiffstats
path: root/doc/program_flow
blob: 3a399a7e534cae699eb6fbf0d64a07e179669ecf (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
76
77
78
79
80
81
82
83
84
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_DISABLED
			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*()
			pseudo_setupenv()
			if PSEUDO_UNLOAD
				pseudo_dropenv()
			real_exec*()

	fork()
		pseudo_check_wrappers():
			pseudo_reinit_libpseudo if necessary
		call wrap_fork()
			real_fork()
			if (child)
				pseudo_setupenv()
				if !PSEUDO_UNLOAD
					pseudo_reinit_libpseudo()
						_libpseudo_init()
				else
					pseudo_dropenv()

	clone()
		pseudo_check_wrappers():
			pseudo_reinit_libpseudo if necessary
		call wrap_clone()
			pseudo_setupenv()
			if !PSEUDO_UNLOAD
				pseudo_reinit_libpseudo()
					_libpseudo_init()
			else
				pseudo_dropenv()
			real_clone()

	... 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