From: Vijay Kiran Kamuju infyquest@gmail.com
--- programs/schtasks/schtasks.c | 109 +++++++++++++++++++++++------ programs/schtasks/tests/schtasks.c | 24 +++++-- 2 files changed, 106 insertions(+), 27 deletions(-)
diff --git a/programs/schtasks/schtasks.c b/programs/schtasks/schtasks.c index 10f17d7601b..bb52e7e7bc0 100644 --- a/programs/schtasks/schtasks.c +++ b/programs/schtasks/schtasks.c @@ -194,13 +194,14 @@ static int change_command(int argc, WCHAR *argv[])
static int create_command(int argc, WCHAR *argv[]) { - const WCHAR *task_name = NULL, *xml_file = NULL; + const WCHAR *task_name = NULL, *xml_file = NULL, *task_run = NULL, *schedule = NULL; ITaskFolder *root = NULL; LONG flags = TASK_CREATE; IRegisteredTask *task; VARIANT empty; BSTR str, xml; HRESULT hres; + BOOL xml_mode = FALSE, tr_mode = FALSE;
while (argc) { if (!wcsicmp(argv[0], L"/xml")) { @@ -215,6 +216,7 @@ static int create_command(int argc, WCHAR *argv[]) }
xml_file = argv[1]; + xml_mode = TRUE; argc -= 2; argv += 2; } else if (!wcsicmp(argv[0], L"/tn")) { @@ -231,6 +233,48 @@ static int create_command(int argc, WCHAR *argv[]) task_name = argv[1]; argc -= 2; argv += 2; + } else if (!wcsicmp(argv[0], L"/tr")) { + if (argc < 2 || !wcsncmp(argv[1], L"/", 1)) { + ERR("Missing /tr value\n"); + return E_FAIL; + } + + if (task_run) { + ERR("Duplicated /tr argument\n"); + return E_FAIL; + } + + FIXME("Unsupported /tr option %s\n", debugstr_w(argv[1])); + task_run = argv[1]; + tr_mode = TRUE; + argc -= 2; + argv += 2; + } else if (!wcsicmp(argv[0], L"/sc")) { + if (argc < 2 || !wcsncmp(argv[1], L"/", 1)) { + ERR("Missing /sc value\n"); + return E_FAIL; + } + + if (schedule) { + ERR("Duplicated /sc argument\n"); + return E_FAIL; + } + + FIXME("Unsupported /sc option %s\n", debugstr_w(argv[1])); + schedule = argv[1]; + tr_mode = TRUE; + argc -= 2; + argv += 2; + } else if (!wcsicmp(argv[0], L"/rl")) { + if (argc < 2 || !wcsncmp(argv[1], L"/", 1)) { + ERR("Missing /rl value\n"); + return E_FAIL; + } + + FIXME("Unsupported /rl option %s\n", debugstr_w(argv[1])); + tr_mode = TRUE; + argc -= 2; + argv += 2; } else if (!wcsicmp(argv[0], L"/f")) { flags = TASK_CREATE_OR_UPDATE; argc--; @@ -255,33 +299,54 @@ static int create_command(int argc, WCHAR *argv[]) return E_FAIL; }
- if (!xml_file) { - ERR("Missing /xml argument\n"); - return E_FAIL; - } + if (xml_mode) { + if (tr_mode) { + ERR("/xml option can only be used with /ru /f /tn\n"); + return E_FAIL; + }
- xml = read_file_to_bstr(xml_file); - if (!xml) - return E_FAIL; + if (!xml_file) { + ERR("Missing /xml argument\n"); + return E_FAIL; + }
- root = get_tasks_root_folder(); - if (!root) { + xml = read_file_to_bstr(xml_file); + if (!xml) + return 1; + + root = get_tasks_root_folder(); + if (!root) { + SysFreeString(xml); + return 1; + } + + V_VT(&empty) = VT_EMPTY; + str = SysAllocString(task_name); + hres = ITaskFolder_RegisterTask(root, str, xml, flags, empty, empty, + TASK_LOGON_NONE, empty, &task); + SysFreeString(str); SysFreeString(xml); - return 1; + ITaskFolder_Release(root); + if (FAILED(hres)) + return 1; + + IRegisteredTask_Release(task); + return 0; }
- V_VT(&empty) = VT_EMPTY; - str = SysAllocString(task_name); - hres = ITaskFolder_RegisterTask(root, str, xml, flags, empty, empty, - TASK_LOGON_NONE, empty, &task); - SysFreeString(str); - SysFreeString(xml); - ITaskFolder_Release(root); - if (FAILED(hres)) - return 1; + if (tr_mode) { + if (!task_run) { + ERR("Missing /tr argument\n"); + return E_FAIL; + }
- IRegisteredTask_Release(task); - return 0; + if (!schedule) { + ERR("Missing /sc argument\n"); + return E_FAIL; + } + return 0; + } + return E_FAIL; }
static int delete_command(int argc, WCHAR *argv[]) diff --git a/programs/schtasks/tests/schtasks.c b/programs/schtasks/tests/schtasks.c index 8323fe5fd86..ccd8d018d4b 100644 --- a/programs/schtasks/tests/schtasks.c +++ b/programs/schtasks/tests/schtasks.c @@ -32,6 +32,7 @@ static ITaskFolder *root; typedef struct _schtask_test { const char *cmd; DWORD expect; + BOOL todo; } schtask_test;
static const char xml_a[] = @@ -97,8 +98,9 @@ static BOOL check_win_version(int min_major, int min_minor) } #define is_win10_plus() check_win_version(10, 0)
-#define run_command(a, e) _run_command(__LINE__, a, e) -static BOOL _run_command(unsigned line, const char *cmd, DWORD expected) +#define run_command(a, e) _run_command(__LINE__, a, e, FALSE) +#define run_command_todo(a, e) _run_command(__LINE__, a, e, TRUE) +static BOOL _run_command(unsigned line, const char *cmd, DWORD expected, BOOL todo) { STARTUPINFOA si = {sizeof(STARTUPINFOA)}; PROCESS_INFORMATION pi; @@ -128,7 +130,10 @@ static BOOL _run_command(unsigned line, const char *cmd, DWORD expected) CloseHandle(pi.hThread); CloseHandle(pi.hProcess);
- ok_(__FILE__,line)(ret == expected, "Expected %lu, got = %lu\n", expected, ret); + if (todo) + todo_wine ok_(__FILE__,line)(ret == expected, "Expected %lu, got = %lu\n", expected, ret); + else + ok_(__FILE__,line)(ret == expected, "Expected %lu, got = %lu\n", expected, ret); return r; }
@@ -215,7 +220,10 @@ static void run_command_list(schtask_test *cmdlist, int len)
for (i = 0; i < len; i++) { - run_command(cmdlist[i].cmd, cmdlist[i].expect); + if (cmdlist[i].todo) + run_command_todo(cmdlist[i].cmd, cmdlist[i].expect); + else + run_command(cmdlist[i].cmd, cmdlist[i].expect); } }
@@ -235,11 +243,17 @@ START_TEST(schtasks) { "/create /xml test.xml /tn wine\winetest /xml", E_FAIL }, { "/create /xml test.xml /tn wine\winetest /tn test", E_FAIL }, { "/create /xml test.xml /tn wine\winetest /xml empty.xml", E_FAIL }, + { "/create /xml test.xml /tn wine\winetest /tr c:\windows\hh.exe", E_FAIL }, { "/change /tn wine\winetest /enable", 0 }, { "/create /xml test.xml /f /tn wine\winetest", 0 }, { "/create /xml test.xml /tn wine\winetest", 1 }, + { "/create /xml test.xml /f /tn wine\winetest /tr c:\windows\hh.exe", E_FAIL }, { "/Delete /f /tn wine\winetest", 0 }, - { "/create /tn wine\winetest", E_FAIL } }; + { "/create /tn wine\winetest", E_FAIL }, + { "/create /tn wine\winetest /tr c:\windows\hh.exe", E_FAIL, FALSE }, + { "/create /tn wine\winetest /tr c:\windows\hh.exe /sc wine", E_FAIL }, + { "/create /tn wine\winetest /tr c:\windows\hh.exe /sc daily", 0, TRUE }, + { "/DELETE /f /tn wine\winetest", 0, TRUE } }; static WCHAR wineW[] = L"\wine"; static WCHAR wine_testW[] = L"\wine\test"; DWORD r;