[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