[PATCH] schedsvc: Also watch for job file modifications.

Dmitry Timoshkov dmitry at baikal.ru
Thu May 3 22:39:26 CDT 2018


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/schedsvc/atsvc.c            | 74 ++++++++++++++++++++++++++++++----------
 dlls/schedsvc/schedsvc_private.h |  1 +
 dlls/schedsvc/svc_main.c         | 12 ++++++-
 3 files changed, 68 insertions(+), 19 deletions(-)

diff --git a/dlls/schedsvc/atsvc.c b/dlls/schedsvc/atsvc.c
index e7e59a4c0a..53a18fd682 100644
--- a/dlls/schedsvc/atsvc.c
+++ b/dlls/schedsvc/atsvc.c
@@ -269,15 +269,12 @@ static BOOL load_job_data(const char *data, DWORD size, AT_ENUM *info)
     return TRUE;
 }
 
-void add_job(const WCHAR *name)
+static BOOL load_job(const WCHAR *name, AT_ENUM *info)
 {
     HANDLE file, mapping;
     DWORD size, try;
     void *data;
-    struct job_t *job;
-
-    job = heap_alloc_zero(sizeof(*job));
-    if (!job) return;
+    BOOL ret = FALSE;
 
     try = 1;
     for (;;)
@@ -304,14 +301,7 @@ void add_job(const WCHAR *name)
         data = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
         if (data)
         {
-            if (load_job_data(data, size, &job->info))
-            {
-                EnterCriticalSection(&at_job_list_section);
-                job->name = heap_strdupW(name);
-                job->info.JobId = current_jobid++;
-                list_add_tail(&at_job_list, &job->entry);
-                LeaveCriticalSection(&at_job_list_section);
-            }
+            ret = load_job_data(data, size, info);
             UnmapViewOfFile(data);
         }
 
@@ -320,11 +310,39 @@ void add_job(const WCHAR *name)
         break;
     }
 
-    if (!job->info.JobId)
+    return ret;
+}
+
+static void free_job_info(AT_ENUM *info)
+{
+    heap_free(info->Command);
+}
+
+static void free_job(struct job_t *job)
+{
+    free_job_info(&job->info);
+    heap_free(job->name);
+    heap_free(job);
+}
+
+void add_job(const WCHAR *name)
+{
+    struct job_t *job;
+
+    job = heap_alloc_zero(sizeof(*job));
+    if (!job) return;
+
+    if (!load_job(name, &job->info))
     {
-        heap_free(job->info.Command);
-        heap_free(job);
+        free_job(job);
+        return;
     }
+
+    EnterCriticalSection(&at_job_list_section);
+    job->name = heap_strdupW(name);
+    job->info.JobId = current_jobid++;
+    list_add_tail(&at_job_list, &job->entry);
+    LeaveCriticalSection(&at_job_list_section);
 }
 
 static BOOL write_signature(HANDLE hfile)
@@ -523,12 +541,32 @@ void remove_job(const WCHAR *name)
     if (job)
     {
         list_remove(&job->entry);
-        heap_free(job->name);
-        heap_free(job);
+        free_job(job);
     }
     LeaveCriticalSection(&at_job_list_section);
 }
 
+void modify_job(const WCHAR *name)
+{
+    AT_ENUM info;
+
+    if (load_job(name, &info))
+    {
+        struct job_t *job;
+
+        EnterCriticalSection(&at_job_list_section);
+        job = find_job(0, name);
+        if (job)
+        {
+            free_job_info(&job->info);
+            job->info = info;
+        }
+        else
+            free_job_info(&info);
+        LeaveCriticalSection(&at_job_list_section);
+    }
+}
+
 DWORD __cdecl NetrJobAdd(ATSVC_HANDLE server_name, AT_INFO *info, DWORD *jobid)
 {
     WCHAR windir[MAX_PATH];
diff --git a/dlls/schedsvc/schedsvc_private.h b/dlls/schedsvc/schedsvc_private.h
index 215bba003e..c0aa188fda 100644
--- a/dlls/schedsvc/schedsvc_private.h
+++ b/dlls/schedsvc/schedsvc_private.h
@@ -25,6 +25,7 @@
 void schedsvc_auto_start(void) DECLSPEC_HIDDEN;
 void add_job(const WCHAR *name) DECLSPEC_HIDDEN;
 void remove_job(const WCHAR *name) DECLSPEC_HIDDEN;
+void modify_job(const WCHAR *name) DECLSPEC_HIDDEN;
 
 static inline WCHAR *heap_strdupW(const WCHAR *src)
 {
diff --git a/dlls/schedsvc/svc_main.c b/dlls/schedsvc/svc_main.c
index fb7732c1d9..ba8de0430f 100644
--- a/dlls/schedsvc/svc_main.c
+++ b/dlls/schedsvc/svc_main.c
@@ -78,7 +78,8 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
         memset(&info, 0, sizeof(info));
 
         ret = ReadDirectoryChangesW(htasks, &info, sizeof(info), FALSE,
-                                    FILE_NOTIFY_CHANGE_FILE_NAME, NULL, &ov, NULL);
+                                    FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE,
+                                    NULL, &ov, NULL);
         if (!ret) break;
 
         events[0] = done_event;
@@ -106,6 +107,15 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
             remove_job(path);
             break;
 
+        case FILE_ACTION_MODIFIED:
+            TRACE("FILE_ACTION_MODIFIED %s\n", debugstr_w(info.data.FileName));
+
+            GetWindowsDirectoryW(path, MAX_PATH);
+            lstrcatW(path, tasksW);
+            lstrcatW(path, info.data.FileName);
+            modify_job(path);
+            break;
+
         default:
             FIXME("%s: action %#x not handled\n", debugstr_w(info.data.FileName), info.data.Action);
             break;
-- 
2.16.3




More information about the wine-devel mailing list