#include "system.h"#include <signal.h>#include <sys/signal.h>#include <sys/wait.h>#include <search.h>#include <rpmsq.h>#include "debug.h"Go to the source code of this file.
Data Structures | |
| struct | rpmsig_s |
Defines | |
| #define | DO_LOCK() |
| #define | DO_UNLOCK() |
| #define | INIT_LOCK() |
| #define | ADD_REF(__tbl) /*@-noeffect@*/ (0) |
| #define | SUB_REF(__tbl) /*@-noeffect@*/ (0) |
| #define | CLEANUP_HANDLER(__handler, __arg, __oldtypeptr) |
| #define | CLEANUP_RESET(__execute, __oldtype) |
| #define | SAME_THREAD(_a, _b) (42) |
| #define | ME() (((void *)getpid())) |
| #define | _RPMSQ_DEBUG 0 |
| #define | rpmsigTbl_sigint (&rpmsigTbl[0]) |
| #define | rpmsigTbl_sigquit (&rpmsigTbl[1]) |
| #define | rpmsigTbl_sigchld (&rpmsigTbl[2]) |
| #define | rpmsigTbl_sighup (&rpmsigTbl[3]) |
| #define | rpmsigTbl_sigterm (&rpmsigTbl[4]) |
| #define | rpmsigTbl_sigpipe (&rpmsigTbl[5]) |
Functions | |
| int | rpmsqInsert (void *elem, void *prev) |
| Insert node into from queue. | |
| int | rpmsqRemove (void *elem) |
| Remove node from queue. | |
| void | rpmsqAction (int signum, void *info, void *context) |
| Default signal handler. | |
| int | rpmsqEnable (int signum, rpmsqAction_t handler) |
| Enable or disable a signal handler. | |
| pid_t | rpmsqFork (rpmsq sq) |
| Fork a child process. | |
| static int | rpmsqWaitUnregister (rpmsq sq) |
| Wait for child process to be reaped, and unregister SIGCHLD handler. | |
| pid_t | rpmsqWait (rpmsq sq) |
| Wait for child process to be reaped. | |
| void * | rpmsqThread (void *(*start)(void *arg), void *arg) |
| Call a function in a thread. | |
| int | rpmsqJoin (void *thread) |
| Wait for thread to terminate. | |
| int | rpmsqThreadEqual (void *thread) |
| Compare thread with current thread. | |
| static void | sigchld_cancel (void *arg) |
| SIGCHLD cancellation handler. | |
| int | rpmsqExecve (const char **argv) |
| Execute a command, returning its status. | |
Variables | |
| int | _rpmsq_debug = 0 |
| static struct rpmsqElem | rpmsqRock |
| rpmsq | rpmsqQueue = &rpmsqRock |
| sigset_t | rpmsqCaught |
| static struct rpmsig_s | rpmsigTbl [] |
Definition in file rpmsq.c.
| #define ADD_REF | ( | __tbl | ) | /*@-noeffect@*/ (0) |
| #define CLEANUP_HANDLER | ( | __handler, | |||
| __arg, | |||||
| __oldtypeptr | ) |
| #define CLEANUP_RESET | ( | __execute, | |||
| __oldtype | ) |
| #define DO_LOCK | ( | ) |
Definition at line 169 of file rpmsq.c.
Referenced by rpmsqEnable(), rpmsqExecve(), and sigchld_cancel().
| #define DO_UNLOCK | ( | ) |
| #define INIT_LOCK | ( | ) |
| #define ME | ( | ) | (((void *)getpid())) |
Definition at line 179 of file rpmsq.c.
Referenced by rpmsqEnable(), rpmsqFork(), rpmsqInsert(), rpmsqRemove(), rpmsqWait(), and rpmsqWaitUnregister().
| #define rpmsigTbl_sigchld (&rpmsigTbl[2]) |
Referenced by rpmsqExecve(), and sigchld_cancel().
| #define rpmsigTbl_sighup (&rpmsigTbl[3]) |
| #define rpmsigTbl_sigint (&rpmsigTbl[0]) |
Referenced by rpmsqExecve().
| #define rpmsigTbl_sigpipe (&rpmsigTbl[5]) |
| #define rpmsigTbl_sigquit (&rpmsigTbl[1]) |
Referenced by rpmsqExecve().
| #define rpmsigTbl_sigterm (&rpmsigTbl[4]) |
| #define SUB_REF | ( | __tbl | ) | /*@-noeffect@*/ (0) |
Definition at line 173 of file rpmsq.c.
Referenced by rpmsqEnable(), rpmsqExecve(), and sigchld_cancel().
| void rpmsqAction | ( | int | signum, | |
| void * | info, | |||
| void * | context | |||
| ) |
Default signal handler.
| signum | signal number | |
| info | (siginfo_t) signal info | |
| context | signal context |
Definition at line 292 of file rpmsq.c.
References errno, rpmsqElem::q_forw, rpmsqQueue, save, and rpmsig_s::signum.
Referenced by rpmsqEnable().
| int rpmsqEnable | ( | int | signum, | |
| rpmsqAction_t | handler | |||
| ) |
Enable or disable a signal handler.
| signum | signal to enable (or disable if negative) | |
| handler | sa_sigaction handler (or NULL to use rpmsqHandler()) |
Definition at line 346 of file rpmsq.c.
References ADD_REF, DO_LOCK, rpmsqElem::id, ME, rpmsqAction(), rpmsqQueue, and SUB_REF.
Referenced by openDatabase(), rpmdbClose(), rpmsqExecve(), rpmsqFork(), rpmsqWaitUnregister(), and sigchld_cancel().
| int rpmsqExecve | ( | const char ** | argv | ) |
Execute a command, returning its status.
Definition at line 636 of file rpmsq.c.
References ADD_REF, alloca(), CLEANUP_HANDLER, CLEANUP_RESET, DO_LOCK, DO_UNLOCK, environ, errno, INIT_LOCK, rpmsigTbl_sigchld, rpmsigTbl_sigint, rpmsigTbl_sigquit, rpmsqEnable(), sigchld_cancel(), and SUB_REF.
| pid_t rpmsqFork | ( | rpmsq | sq | ) |
Fork a child process.
| sq | scriptlet queue element |
Definition at line 401 of file rpmsq.c.
References rpmsqElem::child, ME, rpmsqElem::mutex, rpmsqElem::pipes, rpmsqElem::reaper, rpmsqEnable(), and rpmsqInsert().
Referenced by runScript().
| int rpmsqInsert | ( | void * | elem, | |
| void * | prev | |||
| ) |
Insert node into from queue.
| elem | node to link | |
| prev | previous node from queue |
Definition at line 199 of file rpmsq.c.
References rpmsqElem::child, rpmsqElem::id, ME, rpmsqElem::mutex, rpmsqElem::pipes, rpmsqElem::reaped, rpmsqElem::reaper, rpmsqQueue, and rpmsqElem::status.
Referenced by rpmsqFork().
| int rpmsqJoin | ( | void * | thread | ) |
Wait for thread to terminate.
| thread | thread |
Definition at line 592 of file rpmsq.c.
Referenced by fsmNext(), and rpmpsmNext().
| int rpmsqRemove | ( | void * | elem | ) |
Remove node from queue.
| elem | node to link |
Definition at line 228 of file rpmsq.c.
References rpmsqElem::child, rpmsqElem::id, ME, rpmsqElem::mutex, rpmsqElem::pipes, rpmsqElem::reaped, rpmsqElem::reaper, and rpmsqElem::status.
Referenced by rpmsqWaitUnregister().
| void* rpmsqThread | ( | void *(*)(void *arg) | start, | |
| void * | arg | |||
| ) |
Call a function in a thread.
| start | function | |
| arg | function argument |
Definition at line 583 of file rpmsq.c.
Referenced by fsmNext(), and rpmpsmNext().
| int rpmsqThreadEqual | ( | void * | thread | ) |
| pid_t rpmsqWait | ( | rpmsq | sq | ) |
Wait for child process to be reaped.
| sq | scriptlet queue element |
Definition at line 551 of file rpmsq.c.
References rpmsqElem::child, ME, rpmsqElem::reaped, rpmsqElem::reaper, rpmsqWaitUnregister(), and rpmsqElem::status.
Referenced by psmWait().
| static int rpmsqWaitUnregister | ( | rpmsq | sq | ) | [static] |
Wait for child process to be reaped, and unregister SIGCHLD handler.
| sq | scriptlet queue element |
Definition at line 485 of file rpmsq.c.
References rpmsqElem::child, ME, rpmsqElem::ms_scriptlets, rpmsqElem::mutex, rpmsqElem::op, rpmsqElem::pipes, rpmsqElem::reaped, rpmsqElem::reaper, rpmsqEnable(), rpmsqRemove(), rpmswEnter(), and rpmswExit().
Referenced by rpmsqWait().
| static void sigchld_cancel | ( | void * | arg | ) | [static] |
SIGCHLD cancellation handler.
Definition at line 611 of file rpmsq.c.
References DO_LOCK, DO_UNLOCK, errno, rpmsigTbl_sigchld, rpmsqEnable(), and SUB_REF.
Referenced by rpmsqExecve().
| int _rpmsq_debug = 0 |
| sigset_t rpmsqCaught |
Definition at line 266 of file rpmsq.c.
Referenced by rpmdbCheckSignals(), rpmdbCheckTerminate(), and signalsCaught().
Definition at line 196 of file rpmsq.c.
Referenced by rpmsqAction(), rpmsqEnable(), and rpmsqInsert().
1.5.2