summaryrefslogtreecommitdiff
blob: 97b27bf5f2b97d4b33e1b774ac7fb05cfa52d64a (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
Index: openrc-0.4.3/sh/runscript.sh.in
===================================================================
--- openrc-0.4.3.orig/sh/runscript.sh.in
+++ openrc-0.4.3/sh/runscript.sh.in
@@ -45,6 +45,31 @@ describe()
 	done
 }
 
+# Report status
+status()
+{
+	if service_stopping; then
+		ewarn "status: stopping"
+		return 4
+	elif service_starting; then
+		ewarn "status: starting"
+		return 8
+	elif service_inactive; then
+		ewarn "status: inactive"
+		return 16
+	elif service_started; then
+		if service_crashed; then
+			eerror "status: crashed"
+			return 32
+		fi
+		einfo "status: started"
+		return 0
+	else
+		einfo "status: stopped"
+		return 1
+	fi
+}
+
 # Template start / stop functions
 start()
 {
@@ -134,7 +159,7 @@ unset _f
 
 while [ -n "$1" ]; do
 	# See if we have the required function and run it
-	for _cmd in describe start stop ${extra_commands:-${opts}} \
+	for _cmd in describe start stop status ${extra_commands:-${opts}} \
 		${extra_started_commands}; do
 		if [ "${_cmd}" = "$1" ]; then
 			if [ "$(command -v "$1")" = "$1" ]; then
Index: openrc-0.4.3/src/rc/Makefile
===================================================================
--- openrc-0.4.3.orig/src/rc/Makefile
+++ openrc-0.4.3/src/rc/Makefile
@@ -18,7 +18,7 @@ RC_BINLINKS=	einfon einfo ewarnn ewarn e
 		service_starting service_started \
 		service_stopping service_stopped \
 		service_inactive service_wasinactive \
-		service_hotplugged service_started_daemon \
+		service_hotplugged service_started_daemon service_crashed \
 		checkpath fstabinfo mountinfo rc-depend \
 		service_get_value service_set_value get_options save_options \
 		shell_var is_newer_than is_older_than
Index: openrc-0.4.3/src/rc/rc-applets.c
===================================================================
--- openrc-0.4.3.orig/src/rc/rc-applets.c
+++ openrc-0.4.3/src/rc/rc-applets.c
@@ -295,6 +295,10 @@ static int do_service(int argc, char **a
 		}
 		ok = rc_service_started_daemon(service, exec, NULL, idx);
 			
+	} else if (strcmp(applet, "service_crashed") == 0) {
+		ok = (_rc_can_find_pids() &&
+				rc_service_daemons_crashed(service) &&
+				errno != EACCES);
 	} else
 		eerrorx("%s: unknown applet", applet);
 
Index: openrc-0.4.3/src/rc/runscript.c
===================================================================
--- openrc-0.4.3.orig/src/rc/runscript.c
+++ openrc-0.4.3/src/rc/runscript.c
@@ -412,11 +412,10 @@ write_prefix(const char *buffer, size_t 
 	return ret;
 }
 
-static bool
+static int
 svc_exec(const char *arg1, const char *arg2)
 {
-	bool execok;
-	int fdout = fileno(stdout);
+	int ret, fdout = fileno(stdout);
 	struct termios tt;
 	struct winsize ws;
 	int i;
@@ -527,13 +526,13 @@ svc_exec(const char *arg1, const char *a
 		master_tty = -1;
 	}
 
-	execok = rc_waitpid(service_pid) == 0 ? true : false;
-	if (!execok && errno == ECHILD)
+	ret = WEXITSTATUS(rc_waitpid(service_pid));
+	if (ret != 0 && errno == ECHILD)
 		/* killall5 -9 could cause this */
-		execok = true;
+		ret = 0;
 	service_pid = 0;
 
-	return execok;
+	return ret;
 }
 
 static bool
@@ -881,7 +880,7 @@ svc_start(bool deps)
 		setenv("IN_BACKGROUND", ibsave, 1);
 	hook_out = RC_HOOK_SERVICE_START_DONE;
 	rc_plugin_run(RC_HOOK_SERVICE_START_NOW, applet);
-	started = svc_exec("start", NULL);
+	started = (svc_exec("start", NULL) == 0);
 	if (ibsave)
 		unsetenv("IN_BACKGROUND");
 
@@ -1058,7 +1057,7 @@ svc_stop(bool deps)
 		setenv("IN_BACKGROUND", ibsave, 1);
 	hook_out = RC_HOOK_SERVICE_STOP_DONE;
 	rc_plugin_run(RC_HOOK_SERVICE_STOP_NOW, applet);
-	stopped = svc_exec("stop", NULL);
+	stopped = (svc_exec("stop", NULL) == 0);
 	if (ibsave)
 		unsetenv("IN_BACKGROUND");
 
@@ -1383,10 +1382,10 @@ runscript(int argc, char **argv)
 			rc_stringlist_free(services);
 			services = NULL;
 		} else if (strcmp (optarg, "status") == 0) {
-			RC_SERVICE r = svc_status();
-			retval = (int) r;
-			if (retval & RC_SERVICE_STARTED)
-				retval = 0;
+			save = prefix;
+			eprefix(NULL);
+			prefix = NULL;
+			retval = svc_exec("status", NULL);
 		} else {
 			if (strcmp(optarg, "conditionalrestart") == 0 ||
 			    strcmp(optarg, "condrestart") == 0)