From: Vijay Kiran Kamuju infyquest@gmail.com
--- programs/schtasks/schtasks.c | 109 +++++++++++++++++++++++------ programs/schtasks/tests/schtasks.c | 22 +++++- 2 files changed, 107 insertions(+), 24 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 e896449fa32..248dd1b8c1e 100644 --- a/programs/schtasks/tests/schtasks.c +++ b/programs/schtasks/tests/schtasks.c @@ -269,20 +269,38 @@ START_TEST(schtasks) r = run_command("schtasks /create /xml test.xml /tn wine\winetest /xml empty.xml"); ok(r == E_FAIL, "r = %lx\n", r); /* duplicate arguments */
+ r = run_command("schtasks /create /xml test.xml /tn wine\winetest /tr c:\windows\hh.exe"); + ok(r == E_FAIL, "r = %lu\n", r); + r = run_command("schtasks /change /tn wine\winetest /enable"); ok(r == 0, "r = %lu\n", r);
r = run_command("schtasks /create /xml test.xml /f /tn wine\winetest"); ok(r == 0, "r = %lu\n", r); /* task already exists, but /f argument provided */
+ r = run_command("schtasks /create /xml test.xml /f /tn wine\winetest /tr c:\windows\hh.exe"); + ok(r == E_FAIL, "r = %lu\n", r); /* tr argument provided along with xml argument */ + r = run_command("schtasks /create /xml test.xml /tn wine\winetest"); ok(r == 1, "r = %lu\n", r); /* task already exists */
+ r = run_command("schtasks /Delete /f /tn wine\winetest"); + ok(r == 0, "r = %lu\n", r); + r = run_command("schtasks /create /tn wine\winetest"); ok(r == E_FAIL, "r = %lx\n", r); /* missing arguments */
- r = run_command("schtasks /Delete /f /tn wine\winetest"); - ok(r == 0, "r = %lu\n", r); + r = run_command("schtasks /create /tn wine\winetest /tr c:\windows\hh.exe"); + ok(r == E_FAIL, "r = %lx\n", r); /* missing arguments */ + + r = run_command("schtasks /create /tn wine\winetest /tr c:\windows\hh.exe /sc wine"); + ok(r == E_FAIL, "r = %lx\n", r); /* invalid schedule */ + + r = run_command("schtasks /create /tn wine\winetest /tr c:\windows\hh.exe /sc daily"); + todo_wine ok(r == 0, "r = %lx\n", r); /* daily schedule */ + + r = run_command("schtasks /DELETE /f /tn wine\winetest"); + todo_wine ok(r == 0, "r = %lu\n", r);
r = DeleteFileA("test.xml"); ok(r, "DeleteFileA failed: %lu\n", GetLastError());