[PATCH] programs/services: Start service dependencies.
Dmitry Timoshkov
dmitry at baikal.ru
Mon Jul 4 09:23:33 CDT 2022
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
programs/services/services.c | 39 +++++++++++++++++++++++++++++++++++-
1 file changed, 38 insertions(+), 1 deletion(-)
diff --git a/programs/services/services.c b/programs/services/services.c
index 2edc02d300c..08b7488473b 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -1190,12 +1190,49 @@ static DWORD process_send_start_message(struct process_entry *process, BOOL shar
return result;
}
+static DWORD start_service_deps(struct service_entry *service)
+{
+ struct service_entry *entry;
+ LPWSTR name;
+ DWORD err;
+
+ if (!service->dependOnServices)
+ return ERROR_SUCCESS;
+
+ for (name = service->dependOnServices; *name; name += lstrlenW(name) + 1)
+ {
+ entry = scmdatabase_find_service(service->db, name);
+ if (!entry)
+ {
+ WINE_ERR("Service %s depends on %s which doesn't exist\n", debugstr_w(service->name), debugstr_w(name));
+ return ERROR_SERVICE_DEPENDENCY_DELETED;
+ }
+
+ err = service_start(entry, 0, NULL);
+ if (err != ERROR_SUCCESS && err != ERROR_SERVICE_ALREADY_RUNNING)
+ {
+ WINE_FIXME("Dependent on service %s failed to start: %lu\n",
+ wine_dbgstr_w(entry->name), err);
+ return ERROR_SERVICE_DEPENDENCY_FAIL;
+ }
+ }
+
+ return ERROR_SUCCESS;
+}
+
DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *service_argv)
{
struct process_entry *process = NULL;
BOOL shared_process;
DWORD err;
+ err = start_service_deps(service);
+ if (err != ERROR_SUCCESS)
+ {
+ WINE_TRACE("returning %lu\n", err);
+ return err;
+ }
+
err = service_start_process(service, &process, &shared_process);
if (err == ERROR_SUCCESS)
{
@@ -1221,7 +1258,7 @@ DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *
release_process(process);
}
- WINE_TRACE("returning %ld\n", err);
+ WINE_TRACE("returning %lu\n", err);
return err;
}
--
2.36.1
More information about the wine-devel
mailing list