blob: b82498def7fdd4c3c8f0b43157a5efd7243afdee (
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
/**
* @file command.c
* @author Joe Wingbermuehle
* @date 2004-2006
*
* @brief Handle running startup, shutdown, and restart commands.
*
*/
#include "jwm.h"
#include "command.h"
#include "root.h"
#include "misc.h"
#include "main.h"
/** Structure to represent a list of commands. */
typedef struct CommandNode {
char *command; /**< The command. */
struct CommandNode *next; /**< The next command in the list. */
} CommandNode;
static CommandNode *startupCommands;
static CommandNode *shutdownCommands;
static CommandNode *restartCommands;
static void RunCommands(CommandNode *commands);
static void ReleaseCommands(CommandNode **commands);
static void AddCommand(CommandNode **commands, const char *command);
/** Initialize the command lists. */
void InitializeCommands() {
startupCommands = NULL;
shutdownCommands = NULL;
restartCommands = NULL;
}
/** Process startup/restart commands. */
void StartupCommands() {
if(isRestarting) {
RunCommands(restartCommands);
} else {
RunCommands(startupCommands);
}
}
/** Process shutdown commands. */
void ShutdownCommands() {
if(!shouldRestart) {
RunCommands(shutdownCommands);
}
}
/** Destroy the command lists. */
void DestroyCommands() {
ReleaseCommands(&startupCommands);
ReleaseCommands(&shutdownCommands);
ReleaseCommands(&restartCommands);
}
/** Run the commands in a command list. */
void RunCommands(CommandNode *commands) {
CommandNode *cp;
for(cp = commands; cp; cp = cp->next) {
RunCommand(cp->command);
}
}
/** Release a command list. */
void ReleaseCommands(CommandNode **commands) {
CommandNode *cp;
Assert(commands);
while(*commands) {
cp = (*commands)->next;
Release((*commands)->command);
Release(*commands);
*commands = cp;
}
}
/** Add a command to a command list. */
void AddCommand(CommandNode **commands, const char *command) {
CommandNode *cp;
Assert(commands);
if(!command) {
return;
}
cp = Allocate(sizeof(CommandNode));
cp->next = *commands;
*commands = cp;
cp->command = CopyString(command);
}
/** Add a startup command. */
void AddStartupCommand(const char *command) {
AddCommand(&startupCommands, command);
}
/** Add a shutdown command. */
void AddShutdownCommand(const char *command) {
AddCommand(&shutdownCommands, command);
}
/** Add a restart command. */
void AddRestartCommand(const char *command) {
AddCommand(&restartCommands, command);
}
|