ReactOS 0.4.16-dev-297-gc569aee
task.c File Reference
#include "corerror.h"
#include "mstask.h"
#include "wine/test.h"
Include dependency graph for task.c:

Go to the source code of this file.

Macros

#define COBJMACROS
 

Functions

static BOOL setup_task (void)
 
static void cleanup_task (void)
 
static LPCWSTR path_resolve_name (LPCWSTR base_name)
 
static void test_SetApplicationName_GetApplicationName (void)
 
static void test_CreateTrigger (void)
 
static void test_SetParameters_GetParameters (void)
 
static void test_SetComment_GetComment (void)
 
static void test_SetMaxRunTime_GetMaxRunTime (void)
 
static void test_SetAccountInformation_GetAccountInformation (void)
 
 START_TEST (task)
 

Variables

static ITaskSchedulertest_task_scheduler
 
static ITasktest_task
 
static const WCHAR empty [] = {0}
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file task.c.

Function Documentation

◆ cleanup_task()

static void cleanup_task ( void  )
static

Definition at line 50 of file task.c.

51{
52 ITask_Release(test_task);
53 ITaskScheduler_Release(test_task_scheduler);
54}
static ITaskScheduler * test_task_scheduler
Definition: task.c:27
static ITask * test_task
Definition: task.c:28

Referenced by test_CreateTrigger(), test_SetAccountInformation_GetAccountInformation(), test_SetApplicationName_GetApplicationName(), test_SetComment_GetComment(), test_SetMaxRunTime_GetMaxRunTime(), and test_SetParameters_GetParameters().

◆ path_resolve_name()

static LPCWSTR path_resolve_name ( LPCWSTR  base_name)
static

Definition at line 56 of file task.c.

57{
58 static WCHAR buffer[MAX_PATH];
59 int len;
60
61 len = SearchPathW(NULL, base_name, NULL, 0, NULL, NULL);
62 if (len == 0)
63 return base_name;
64 else if (len < MAX_PATH)
65 {
66 SearchPathW(NULL, base_name, NULL, MAX_PATH, buffer, NULL);
67 return buffer;
68 }
69 return NULL;
70}
#define NULL
Definition: types.h:112
#define MAX_PATH
Definition: compat.h:34
DWORD WINAPI SearchPathW(IN LPCWSTR lpPath OPTIONAL, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart OPTIONAL)
Definition: path.c:1298
GLuint buffer
Definition: glext.h:5915
GLenum GLsizei len
Definition: glext.h:6722
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by test_SetApplicationName_GetApplicationName().

◆ setup_task()

static BOOL setup_task ( void  )
static

Definition at line 31 of file task.c.

32{
34 const WCHAR task_name[] = {'T','e','s','t','i','n','g', 0};
35
36 hres = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER,
37 &IID_ITaskScheduler, (void **) &test_task_scheduler);
38 if(hres != S_OK)
39 return FALSE;
40 hres = ITaskScheduler_NewWorkItem(test_task_scheduler, task_name, &CLSID_CTask,
41 &IID_ITask, (IUnknown**)&test_task);
42 if(hres != S_OK)
43 {
44 ITaskScheduler_Release(test_task_scheduler);
45 return FALSE;
46 }
47 return TRUE;
48}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define S_OK
Definition: intsafe.h:52
HRESULT hres
Definition: protocol.c:465

Referenced by test_CreateTrigger(), test_SetAccountInformation_GetAccountInformation(), test_SetApplicationName_GetApplicationName(), test_SetComment_GetComment(), test_SetMaxRunTime_GetMaxRunTime(), and test_SetParameters_GetParameters().

◆ START_TEST()

START_TEST ( task  )

Definition at line 499 of file task.c.

500{
509}
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
static void test_SetComment_GetComment(void)
Definition: task.c:280
static void test_CreateTrigger(void)
Definition: task.c:182
static void test_SetMaxRunTime_GetMaxRunTime(void)
Definition: task.c:350
static void test_SetApplicationName_GetApplicationName(void)
Definition: task.c:72
static void test_SetAccountInformation_GetAccountInformation(void)
Definition: task.c:407
static void test_SetParameters_GetParameters(void)
Definition: task.c:210

◆ test_CreateTrigger()

static void test_CreateTrigger ( void  )
static

Definition at line 182 of file task.c.

183{
184 BOOL setup;
188
189 setup = setup_task();
190 ok(setup, "Failed to setup test_task\n");
191 if (!setup)
192 {
193 skip("Failed to create task. Skipping tests.\n");
194 return;
195 }
196
197 hres = ITask_CreateTrigger(test_task, &trigger_index, &test_trigger);
198 ok(hres == S_OK, "Failed to create trigger: 0x%08x\n", hres);
199 if (hres != S_OK)
200 {
201 cleanup_task();
202 return;
203 }
204
205 ITaskTrigger_Release(test_trigger);
206 cleanup_task();
207 return;
208}
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned short WORD
Definition: ntddk_ex.h:93
static BOOL setup_task(void)
Definition: task.c:31
static void cleanup_task(void)
Definition: task.c:50
static WORD trigger_index
Definition: task_trigger.c:31
static ITaskTrigger * test_trigger
Definition: task_trigger.c:30
static BOOL setup(void)
Definition: enum_files.c:97

Referenced by START_TEST().

◆ test_SetAccountInformation_GetAccountInformation()

static void test_SetAccountInformation_GetAccountInformation ( void  )
static

Definition at line 407 of file task.c.

408{
409 BOOL setup;
411 LPWSTR account_name;
412 const WCHAR dummy_account_name[] = {'N', 'o', 'S', 'u', 'c', 'h',
413 'A', 'c', 'c', 'o', 'u', 'n', 't', 0};
414 const WCHAR dummy_account_name_b[] = {'N', 'o', 'S', 'u', 'c', 'h',
415 'A', 'c', 'c', 'o', 'u', 'n', 't', 'B', 0};
416
417 setup = setup_task();
418 ok(setup, "Failed to setup test_task\n");
419 if (!setup)
420 {
421 skip("Failed to create task. Skipping tests.\n");
422 return;
423 }
424
425 /* Get account information before it is set */
426 hres = ITask_GetAccountInformation(test_task, &account_name);
427 /* WinXP returns HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND): 0x80070002 but
428 * Win2K returns SCHED_E_CANNOT_OPEN_TASK: 0x8004130d
429 * Win9x doesn't support security services */
431 {
432 win_skip("Security services are not supported\n");
433 cleanup_task();
434 return;
435 }
438 "Unset account name generated: 0x%08x\n", hres);
439
440 /* Attempt to set to a dummy account without a password */
441 /* This test passes on WinXP but fails on Win2K */
442 hres = ITask_SetAccountInformation(test_task, dummy_account_name, NULL);
443 ok(hres == S_OK,
444 "Failed setting dummy account with no password: %08x\n", hres);
445 hres = ITask_GetAccountInformation(test_task, &account_name);
446 ok(hres == S_OK ||
449 hres == 0x200), /* win2k */
450 "GetAccountInformation failed: %08x\n", hres);
451 if (hres == S_OK)
452 {
453 ok(!lstrcmpW(account_name, dummy_account_name),
454 "Got %s, expected %s\n", wine_dbgstr_w(account_name),
455 wine_dbgstr_w(dummy_account_name));
456 CoTaskMemFree(account_name);
457 }
458
459 /* Attempt to set to a dummy account with a (invalid) password */
460 /* This test passes on WinXP but fails on Win2K */
461 hres = ITask_SetAccountInformation(test_task, dummy_account_name_b,
462 dummy_account_name_b);
463 ok(hres == S_OK,
464 "Failed setting dummy account with password: %08x\n", hres);
465 hres = ITask_GetAccountInformation(test_task, &account_name);
466 ok(hres == S_OK ||
469 hres == 0x200), /* win2k */
470 "GetAccountInformation failed: %08x\n", hres);
471 if (hres == S_OK)
472 {
473 ok(!lstrcmpW(account_name, dummy_account_name_b),
474 "Got %s, expected %s\n", wine_dbgstr_w(account_name),
475 wine_dbgstr_w(dummy_account_name_b));
476 CoTaskMemFree(account_name);
477 }
478
479 /* Attempt to set to the local system account */
480 hres = ITask_SetAccountInformation(test_task, empty, NULL);
481 ok(hres == S_OK, "Failed setting system account: %08x\n", hres);
482 hres = ITask_GetAccountInformation(test_task, &account_name);
483 ok(hres == S_OK ||
486 hres == 0x200), /* win2k */
487 "GetAccountInformation failed: %08x\n", hres);
488 if (hres == S_OK)
489 {
490 ok(!lstrcmpW(account_name, empty),
491 "Got %s, expected empty string\n", wine_dbgstr_w(account_name));
492 CoTaskMemFree(account_name);
493 }
494
495 cleanup_task();
496 return;
497}
#define broken(x)
Definition: atltest.h:178
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4243
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
#define wine_dbgstr_w
Definition: kernel32.h:34
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static const WCHAR empty[]
Definition: task.c:29
#define win_skip
Definition: test.h:163
#define SCHED_E_SERVICE_NOT_RUNNING
Definition: winerror.h:2435
#define SCHED_E_NO_SECURITY_SERVICES
Definition: winerror.h:2432
#define SCHED_E_CANNOT_OPEN_TASK
Definition: winerror.h:2427
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by START_TEST().

◆ test_SetApplicationName_GetApplicationName()

static void test_SetApplicationName_GetApplicationName ( void  )
static

Definition at line 72 of file task.c.

73{
74 BOOL setup;
76 LPWSTR stored_name;
77 LPCWSTR full_name;
78 const WCHAR non_application_name[] = {'N','o','S','u','c','h',
79 'A','p','p','l','i','c','a','t','i','o','n', 0};
80 const WCHAR notepad_exe[] = {
81 'n','o','t','e','p','a','d','.','e','x','e', 0};
82 const WCHAR notepad[] = {'n','o','t','e','p','a','d', 0};
83
84 setup = setup_task();
85 ok(setup, "Failed to setup test_task\n");
86 if (!setup)
87 {
88 skip("Failed to create task. Skipping tests.\n");
89 return;
90 }
91
92 /* Attempt getting before setting application name */
93 hres = ITask_GetApplicationName(test_task, &stored_name);
94 ok(hres == S_OK, "GetApplicationName failed: %08x\n", hres);
95 if (hres == S_OK)
96 {
97 ok(!lstrcmpiW(stored_name, empty),
98 "Got %s, expected empty string\n", wine_dbgstr_w(stored_name));
99 CoTaskMemFree(stored_name);
100 }
101
102 /* Set application name to a nonexistent application and then get
103 * the application name that is actually stored */
104 hres = ITask_SetApplicationName(test_task, non_application_name);
105 ok(hres == S_OK, "Failed setting name %s: %08x\n",
106 wine_dbgstr_w(non_application_name), hres);
107 hres = ITask_GetApplicationName(test_task, &stored_name);
108 ok(hres == S_OK, "GetApplicationName failed: %08x\n", hres);
109 if (hres == S_OK)
110 {
111 full_name = path_resolve_name(non_application_name);
112 ok(!lstrcmpiW(stored_name, full_name), "Got %s, expected %s\n",
113 wine_dbgstr_w(stored_name), wine_dbgstr_w(full_name));
114 CoTaskMemFree(stored_name);
115 }
116
117 /* Set a valid application name with program type extension and then
118 * get the stored name */
119 hres = ITask_SetApplicationName(test_task, notepad_exe);
120 ok(hres == S_OK, "Failed setting name %s: %08x\n",
121 wine_dbgstr_w(notepad_exe), hres);
122 hres = ITask_GetApplicationName(test_task, &stored_name);
123 ok(hres == S_OK, "GetApplicationName failed: %08x\n", hres);
124 if (hres == S_OK)
125 {
126 full_name = path_resolve_name(notepad_exe);
127 ok(!lstrcmpiW(stored_name, full_name), "Got %s, expected %s\n",
128 wine_dbgstr_w(stored_name), wine_dbgstr_w(full_name));
129 CoTaskMemFree(stored_name);
130 }
131
132 /* Set a valid application name without program type extension and
133 * then get the stored name */
134 hres = ITask_SetApplicationName(test_task, notepad);
135 ok(hres == S_OK, "Failed setting name %s: %08x\n", wine_dbgstr_w(notepad), hres);
136 hres = ITask_GetApplicationName(test_task, &stored_name);
137 ok(hres == S_OK, "GetApplicationName failed: %08x\n", hres);
138 if (hres == S_OK)
139 {
140 full_name = path_resolve_name(notepad_exe); /* XP SP1 appends .exe */
141 if (lstrcmpiW(stored_name, full_name) != 0)
142 {
143 full_name = path_resolve_name(notepad);
144 ok(!lstrcmpiW(stored_name, full_name), "Got %s, expected %s\n",
145 wine_dbgstr_w(stored_name), wine_dbgstr_w(full_name));
146 }
147 CoTaskMemFree(stored_name);
148 }
149
150 /* After having a valid application name set, set application the name
151 * to a nonexistent application and then get the name that is
152 * actually stored */
153 hres = ITask_SetApplicationName(test_task, non_application_name);
154 ok(hres == S_OK, "Failed setting name %s: %08x\n",
155 wine_dbgstr_w(non_application_name), hres);
156 hres = ITask_GetApplicationName(test_task, &stored_name);
157 ok(hres == S_OK, "GetApplicationName failed: %08x\n", hres);
158 if (hres == S_OK)
159 {
160 full_name = path_resolve_name(non_application_name);
161 ok(!lstrcmpiW(stored_name, full_name), "Got %s, expected %s\n",
162 wine_dbgstr_w(stored_name), wine_dbgstr_w(full_name));
163 CoTaskMemFree(stored_name);
164 }
165
166 /* Clear application name */
167 hres = ITask_SetApplicationName(test_task, empty);
168 ok(hres == S_OK, "Failed setting name %s: %08x\n", wine_dbgstr_w(empty), hres);
169 hres = ITask_GetApplicationName(test_task, &stored_name);
170 ok(hres == S_OK, "GetApplicationName failed: %08x\n", hres);
171 if (hres == S_OK)
172 {
173 ok(!lstrcmpiW(stored_name, empty),
174 "Got %s, expected empty string\n", wine_dbgstr_w(stored_name));
175 CoTaskMemFree(stored_name);
176 }
177
178 cleanup_task();
179 return;
180}
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4262
static LPCWSTR path_resolve_name(LPCWSTR base_name)
Definition: task.c:56
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by START_TEST().

◆ test_SetComment_GetComment()

static void test_SetComment_GetComment ( void  )
static

Definition at line 280 of file task.c.

281{
282 BOOL setup;
285 const WCHAR comment_a[] = {'C','o','m','m','e','n','t','.', 0};
286 const WCHAR comment_b[] = {'L','o','n','g','e','r',' ',
287 'c','o','m','m','e','n','t','.', 0};
288
289 setup = setup_task();
290 ok(setup, "Failed to setup test_task\n");
291 if (!setup)
292 {
293 skip("Failed to create task. Skipping tests.\n");
294 return;
295 }
296
297 /* Get comment before setting it*/
298 hres = ITask_GetComment(test_task, &comment);
299 ok(hres == S_OK, "GetComment failed: %08x\n", hres);
300 if (hres == S_OK)
301 {
303 "Got %s, expected empty string\n", wine_dbgstr_w(comment));
305 }
306
307 /* Set comment to a simple string */
308 hres = ITask_SetComment(test_task, comment_a);
309 ok(hres == S_OK, "Failed setting comment %s: %08x\n",
310 wine_dbgstr_w(comment_a), hres);
311 hres = ITask_GetComment(test_task, &comment);
312 ok(hres == S_OK, "GetComment failed: %08x\n", hres);
313 if (hres == S_OK)
314 {
315 ok(!lstrcmpW(comment, comment_a), "Got %s, expected %s\n",
316 wine_dbgstr_w(comment), wine_dbgstr_w(comment_a));
318 }
319
320 /* Update comment to a different simple string */
321 hres = ITask_SetComment(test_task, comment_b);
322 ok(hres == S_OK, "Failed setting comment %s: %08x\n",
323 wine_dbgstr_w(comment_b), hres);
324 hres = ITask_GetComment(test_task, &comment);
325 ok(hres == S_OK, "GetComment failed: %08x\n", hres);
326 if (hres == S_OK)
327 {
328 ok(!lstrcmpW(comment, comment_b), "Got %s, expected %s\n",
329 wine_dbgstr_w(comment), wine_dbgstr_w(comment_b));
331 }
332
333 /* Clear comment */
334 hres = ITask_SetComment(test_task, empty);
335 ok(hres == S_OK, "Failed setting comment %s: %08x\n",
337 hres = ITask_GetComment(test_task, &comment);
338 ok(hres == S_OK, "GetComment failed: %08x\n", hres);
339 if (hres == S_OK)
340 {
342 "Got %s, expected empty string\n", wine_dbgstr_w(comment));
344 }
345
346 cleanup_task();
347 return;
348}
#define comment(fmt, arg1)
Definition: rebar.c:847

Referenced by START_TEST().

◆ test_SetMaxRunTime_GetMaxRunTime()

static void test_SetMaxRunTime_GetMaxRunTime ( void  )
static

Definition at line 350 of file task.c.

351{
352 BOOL setup;
354 DWORD max_run_time;
355
356 setup = setup_task();
357 ok(setup, "Failed to setup test_task\n");
358 if (!setup)
359 {
360 skip("Failed to create task. Skipping tests.\n");
361 return;
362 }
363
364 /* Default time is 3 days:
365 * 3 days * 24 hours * 60 minutes * 60 seconds * 1000 ms = 259200000 */
366 max_run_time = 0;
367 hres = ITask_GetMaxRunTime(test_task, &max_run_time);
368 ok(hres == S_OK, "Failed to get max runtime: 0x%08x\n", hres);
369 ok(max_run_time == 259200000, "Expected 259200000: %d\n", max_run_time);
370
371 /* Basic set test */
372 max_run_time = 0;
373 hres = ITask_SetMaxRunTime(test_task, 1234);
374 ok(hres == S_OK, "Failed to set max runtime: 0x%08x\n", hres);
375 hres = ITask_GetMaxRunTime(test_task, &max_run_time);
376 ok(hres == S_OK, "Failed to get max runtime: 0x%08x\n", hres);
377 ok(max_run_time == 1234, "Expected 1234: %d\n", max_run_time);
378
379 /* Verify that time can be set to zero */
380 max_run_time = 1;
381 hres = ITask_SetMaxRunTime(test_task, 0);
382 ok(hres == S_OK, "Failed to set max runtime: 0x%08x\n", hres);
383 hres = ITask_GetMaxRunTime(test_task, &max_run_time);
384 ok(hres == S_OK, "Failed to get max runtime: 0x%08x\n", hres);
385 ok(max_run_time == 0, "Expected 0: %d\n", max_run_time);
386
387 /* Check resolution by setting time to one */
388 max_run_time = 0;
389 hres = ITask_SetMaxRunTime(test_task, 1);
390 ok(hres == S_OK, "Failed to set max runtime: 0x%08x\n", hres);
391 hres = ITask_GetMaxRunTime(test_task, &max_run_time);
392 ok(hres == S_OK, "Failed to get max runtime: 0x%08x\n", hres);
393 ok(max_run_time == 1, "Expected 1: %d\n", max_run_time);
394
395 /* Verify that time can be set to INFINITE */
396 max_run_time = 0;
397 hres = ITask_SetMaxRunTime(test_task, INFINITE);
398 ok(hres == S_OK, "Failed to set max runtime: 0x%08x\n", hres);
399 hres = ITask_GetMaxRunTime(test_task, &max_run_time);
400 ok(hres == S_OK, "Failed to get max runtime: 0x%08x\n", hres);
401 ok(max_run_time == INFINITE, "Expected INFINITE: %d\n", max_run_time);
402
403 cleanup_task();
404 return;
405}
#define INFINITE
Definition: serial.h:102
unsigned long DWORD
Definition: ntddk_ex.h:95

Referenced by START_TEST().

◆ test_SetParameters_GetParameters()

static void test_SetParameters_GetParameters ( void  )
static

Definition at line 210 of file task.c.

211{
212 BOOL setup;
214 LPWSTR parameters;
215 const WCHAR parameters_a[] = {'f','o','o','.','t','x','t', 0};
216 const WCHAR parameters_b[] = {'f','o','o','.','t','x','t',' ',
217 'b','a','r','.','t','x','t', 0};
218
219 setup = setup_task();
220 ok(setup, "Failed to setup test_task\n");
221 if (!setup)
222 {
223 skip("Failed to create task. Skipping tests.\n");
224 return;
225 }
226
227 /* Get parameters before setting them */
228 hres = ITask_GetParameters(test_task, &parameters);
229 ok(hres == S_OK, "GetParameters failed: %08x\n", hres);
230 if (hres == S_OK)
231 {
232 ok(!lstrcmpW(parameters, empty),
233 "Got %s, expected empty string\n", wine_dbgstr_w(parameters));
234 CoTaskMemFree(parameters);
235 }
236
237 /* Set parameters to a simple string */
238 hres = ITask_SetParameters(test_task, parameters_a);
239 ok(hres == S_OK, "Failed setting parameters %s: %08x\n",
240 wine_dbgstr_w(parameters_a), hres);
241 hres = ITask_GetParameters(test_task, &parameters);
242 ok(hres == S_OK, "GetParameters failed: %08x\n", hres);
243 if (hres == S_OK)
244 {
245 ok(!lstrcmpW(parameters, parameters_a), "Got %s, expected %s\n",
246 wine_dbgstr_w(parameters), wine_dbgstr_w(parameters_a));
247 CoTaskMemFree(parameters);
248 }
249
250 /* Update parameters to a different simple string */
251 hres = ITask_SetParameters(test_task, parameters_b);
252 ok(hres == S_OK, "Failed setting parameters %s: %08x\n",
253 wine_dbgstr_w(parameters_b), hres);
254 hres = ITask_GetParameters(test_task, &parameters);
255 ok(hres == S_OK, "GetParameters failed: %08x\n", hres);
256 if (hres == S_OK)
257 {
258 ok(!lstrcmpW(parameters, parameters_b), "Got %s, expected %s\n",
259 wine_dbgstr_w(parameters), wine_dbgstr_w(parameters_b));
260 CoTaskMemFree(parameters);
261 }
262
263 /* Clear parameters */
264 hres = ITask_SetParameters(test_task, empty);
265 ok(hres == S_OK, "Failed setting parameters %s: %08x\n",
267 hres = ITask_GetParameters(test_task, &parameters);
268 ok(hres == S_OK, "GetParameters failed: %08x\n", hres);
269 if (hres == S_OK)
270 {
271 ok(!lstrcmpW(parameters, empty),
272 "Got %s, expected empty string\n", wine_dbgstr_w(parameters));
273 CoTaskMemFree(parameters);
274 }
275
276 cleanup_task();
277 return;
278}

Referenced by START_TEST().

Variable Documentation

◆ empty

◆ test_task

◆ test_task_scheduler

ITaskScheduler* test_task_scheduler
static

Definition at line 27 of file task.c.

Referenced by cleanup_task(), and setup_task().