13 typedef struct rpmsig_s * rpmsig;
17 typedef struct rpmsqElem * rpmsq;
20 * Default signal handler prototype.
21 * @param signum signal number
22 * @param info (siginfo_t) signal info
23 * @param context signal context
25 typedef void (*rpmsqAction_t) (int signum, void * info, void * context)
30 extern int _rpmsq_debug;
34 * SIGCHLD queue element.
37 struct rpmsqElem * q_forw; /*!< for use by insque(3)/remque(3). */
38 struct rpmsqElem * q_back;
39 pid_t child; /*!< Currently running child. */
40 volatile pid_t reaped; /*!< Reaped waitpid(3) return. */
41 volatile int status; /*!< Reaped waitpid(3) status. */
42 struct rpmsw_s begin; /*!< Start time. */
43 rpmtime_t msecs; /*!< Instance duration (msecs). */
44 rpmtime_t script_msecs; /*!< Accumulated script duration (msecs). */
45 int reaper; /*!< Register SIGCHLD handler? */
46 int pipes[2]; /*!< Parent/child interlock. */
47 void * id; /*!< Blocking thread id (pthread_t). */
48 pthread_mutex_t mutex; /*!< Signal delivery to thread condvar. */
54 extern rpmsq rpmsqQueue;
58 extern sigset_t rpmsqCaught;
65 * Insert node into from queue.
66 * @param elem node to link
67 * @param prev previous node from queue
68 * @return 0 on success
71 int rpmsqInsert(/*@null@*/ void * elem, /*@null@*/ void * prev)
76 * Remove node from queue.
77 * @param elem node to link
78 * @return 0 on success
81 int rpmsqRemove(/*@null@*/ void * elem)
82 /*@globals fileSystem, internalState @*/
83 /*@modifies elem, fileSystem, internalState @*/;
87 * Default signal handler.
88 * @param signum signal number
89 * @param info (siginfo_t) signal info
90 * @param context signal context
93 void rpmsqAction(int signum, void * info, void * context)
94 /*@globals rpmsqCaught, errno, fileSystem @*/
95 /*@modifies rpmsqCaught, errno, fileSystem @*/;
99 * Enable or disable a signal handler.
100 * @param signum signal to enable (or disable if negative)
101 * @param handler sa_sigaction handler (or NULL to use rpmsqHandler())
102 * @return no. of refs, -1 on error
104 int rpmsqEnable(int signum, /*@null@*/ rpmsqAction_t handler)
105 /*@globals rpmsqCaught, fileSystem, internalState @*/
106 /*@modifies rpmsqCaught, fileSystem, internalState @*/;
109 * Fork a child process.
110 * @param sq scriptlet queue element
111 * @return fork(2) pid
113 pid_t rpmsqFork(rpmsq sq)
114 /*@globals fileSystem, internalState @*/
115 /*@modifies sq, fileSystem, internalState @*/;
118 * Wait for child process to be reaped.
119 * @param sq scriptlet queue element
120 * @return reaped child pid
122 pid_t rpmsqWait(rpmsq sq)
123 /*@globals fileSystem, internalState @*/
124 /*@modifies sq, fileSystem, internalState @*/;
127 * Call a function in a thread synchronously.
128 * @param start function
129 * @param arg function argument
130 * @return 0 on success
132 int rpmsqThread(void * (*start) (void * arg), void * arg)
133 /*@globals internalState @*/
134 /*@modifies internalState @*/;
137 * Execute a command, returning its status.
139 int rpmsqExecve (const char ** argv)
140 /*@globals fileSystem, internalState @*/
141 /*@modifies fileSystem, internalState @*/;