schedsvc: Also watch for job file modifications.
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
c130ec5678
commit
f7d1e16183
|
@ -269,15 +269,12 @@ static BOOL load_job_data(const char *data, DWORD size, AT_ENUM *info)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_job(const WCHAR *name)
|
static BOOL load_job(const WCHAR *name, AT_ENUM *info)
|
||||||
{
|
{
|
||||||
HANDLE file, mapping;
|
HANDLE file, mapping;
|
||||||
DWORD size, try;
|
DWORD size, try;
|
||||||
void *data;
|
void *data;
|
||||||
struct job_t *job;
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
job = heap_alloc_zero(sizeof(*job));
|
|
||||||
if (!job) return;
|
|
||||||
|
|
||||||
try = 1;
|
try = 1;
|
||||||
for (;;)
|
for (;;)
|
||||||
|
@ -304,14 +301,7 @@ void add_job(const WCHAR *name)
|
||||||
data = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
|
data = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
|
||||||
if (data)
|
if (data)
|
||||||
{
|
{
|
||||||
if (load_job_data(data, size, &job->info))
|
ret = load_job_data(data, size, 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);
|
|
||||||
}
|
|
||||||
UnmapViewOfFile(data);
|
UnmapViewOfFile(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,11 +310,39 @@ void add_job(const WCHAR *name)
|
||||||
break;
|
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);
|
free_job(job);
|
||||||
heap_free(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)
|
static BOOL write_signature(HANDLE hfile)
|
||||||
|
@ -523,12 +541,32 @@ void remove_job(const WCHAR *name)
|
||||||
if (job)
|
if (job)
|
||||||
{
|
{
|
||||||
list_remove(&job->entry);
|
list_remove(&job->entry);
|
||||||
heap_free(job->name);
|
free_job(job);
|
||||||
heap_free(job);
|
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&at_job_list_section);
|
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)
|
DWORD __cdecl NetrJobAdd(ATSVC_HANDLE server_name, AT_INFO *info, DWORD *jobid)
|
||||||
{
|
{
|
||||||
WCHAR windir[MAX_PATH];
|
WCHAR windir[MAX_PATH];
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
void schedsvc_auto_start(void) DECLSPEC_HIDDEN;
|
void schedsvc_auto_start(void) DECLSPEC_HIDDEN;
|
||||||
void add_job(const WCHAR *name) DECLSPEC_HIDDEN;
|
void add_job(const WCHAR *name) DECLSPEC_HIDDEN;
|
||||||
void remove_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)
|
static inline WCHAR *heap_strdupW(const WCHAR *src)
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,7 +78,8 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
|
||||||
memset(&info, 0, sizeof(info));
|
memset(&info, 0, sizeof(info));
|
||||||
|
|
||||||
ret = ReadDirectoryChangesW(htasks, &info, sizeof(info), FALSE,
|
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;
|
if (!ret) break;
|
||||||
|
|
||||||
events[0] = done_event;
|
events[0] = done_event;
|
||||||
|
@ -106,6 +107,15 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
|
||||||
remove_job(path);
|
remove_job(path);
|
||||||
break;
|
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:
|
default:
|
||||||
FIXME("%s: action %#x not handled\n", debugstr_w(info.data.FileName), info.data.Action);
|
FIXME("%s: action %#x not handled\n", debugstr_w(info.data.FileName), info.data.Action);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue