1 /* |
1 /* |
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
2 * Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). |
3 * All rights reserved. |
3 * All rights reserved. |
4 * This component and the accompanying materials are made available |
4 * This component and the accompanying materials are made available |
5 * under the terms of the License "Eclipse Public License v1.0" |
5 * under the terms of the License "Eclipse Public License v1.0" |
6 * which accompanies this distribution, and is available |
6 * which accompanies this distribution, and is available |
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
31 #include "talon_process.h" |
36 #include "talon_process.h" |
32 #include "sema.h" |
37 #include "sema.h" |
33 #include "buffer.h" |
38 #include "buffer.h" |
34 #include "../config.h" |
39 #include "../config.h" |
35 |
40 |
|
41 #ifdef HAS_GETCOMMANDLINE |
|
42 #include "chomp.h" |
|
43 #endif |
|
44 |
36 /* The output semaphore. */ |
45 /* The output semaphore. */ |
37 sbs_semaphore talon_sem; |
46 sbs_semaphore talon_sem; |
38 |
47 |
39 #define TALON_ATTEMPT_STRMAX 32 |
48 #define TALON_ATTEMPT_STRMAX 32 |
40 #define RECIPETAG_STRMAX 2048 |
49 #define RECIPETAG_STRMAX 2048 |
41 #define STATUS_STRMAX 100 |
50 #define STATUS_STRMAX 120 |
42 |
51 |
43 #define TALONDELIMITER '|' |
52 #define TALONDELIMITER '|' |
44 #define VARNAMEMAX 100 |
53 #define VARNAMEMAX 100 |
45 #define VARVALMAX 1024 |
54 #define VARVALMAX 1024 |
46 |
55 |
|
56 #define HOSTNAME_MAX 100 |
|
57 |
47 |
58 |
48 #include "log.h" |
59 #include "log.h" |
49 |
60 |
50 #ifdef HAS_MSVCRT |
61 #ifdef HAS_MSVCRT |
51 /* Make all output handling binary */ |
62 /* Make all output handling binary */ |
52 unsigned int _CRT_fmode = _O_BINARY; |
63 unsigned int _CRT_fmode = _O_BINARY; |
53 #endif |
64 #endif |
|
65 |
54 |
66 |
55 double getseconds(void) |
67 double getseconds(void) |
56 { |
68 { |
57 struct timeval tp; |
69 struct timeval tp; |
58 gettimeofday(&tp, NULL); |
70 gettimeofday(&tp, NULL); |
123 do { |
135 do { |
124 envvarname[e++] = *att; |
136 envvarname[e++] = *att; |
125 att++; |
137 att++; |
126 } while ( e < (VARNAMEMAX-1) && (isalnum(*att) || *att == '_')); |
138 } while ( e < (VARNAMEMAX-1) && (isalnum(*att) || *att == '_')); |
127 envvarname[e] = '\0'; |
139 envvarname[e] = '\0'; |
128 /* DEBUG(("envvarname: %s\n", envvarname)); */ |
140 /* DEBUG(("envvarname: %s\n", envvarname));*/ |
129 v = talon_getenv(envvarname); |
141 v = talon_getenv(envvarname); |
130 if (v) |
142 if (v) |
131 { |
143 { |
132 /* DEBUG((" value: %s\n", v)); */ |
144 /* DEBUG((" value: %s\n", v)); */ |
133 char *oldv=v; |
145 char *oldv=v; |
227 /* find the argument to -c then strip the talon related front section */ |
239 /* find the argument to -c then strip the talon related front section */ |
228 |
240 |
229 char *recipe = NULL; |
241 char *recipe = NULL; |
230 int talon_returncode = 0; |
242 int talon_returncode = 0; |
231 |
243 |
|
244 #ifdef HAS_WINSOCK2 |
|
245 WSADATA wsaData; |
|
246 |
|
247 WSAStartup(MAKEWORD(2,2), &wsaData); |
|
248 |
|
249 /* We ignore the result as we are only doing this to use gethostname |
|
250 and if that fails then leaving the host attribute blank is perfectly |
|
251 acceptable. |
|
252 */ |
|
253 |
|
254 #endif |
|
255 |
232 #ifdef HAS_GETCOMMANDLINE |
256 #ifdef HAS_GETCOMMANDLINE |
233 char *commandline= GetCommandLine(); |
257 char *commandline= GetCommandLine(); |
234 DEBUG(("talon: commandline: %s\n", commandline)); |
|
235 /* |
258 /* |
236 * The command line should be either, |
259 * The command line should be either, |
237 * talon -c "some shell commands" |
260 * talon -c "some shell commands" |
238 * or |
261 * or |
239 * talon shell_script_file |
262 * talon shell_script_file |
240 * |
263 * |
241 * talon could be an absolute path and may have a .exe extension. |
264 * talon could be an absolute path and may have a .exe extension. |
242 */ |
265 */ |
243 recipe = strstr(commandline, "-c"); |
266 |
|
267 |
|
268 recipe = chompCommand(commandline); |
244 if (recipe) |
269 if (recipe) |
245 { |
270 { |
246 /* there was a -c so extract the quoted commands */ |
271 /* there was a -c so extract the quoted commands */ |
247 |
272 |
248 while (*recipe != '"' && *recipe != '\0') |
|
249 recipe++; |
|
250 |
|
251 if (*recipe != '"') /* we found -c but no following quote */ |
|
252 { |
|
253 error("talon: error: unquoted recipe in shell call '%s'\n", commandline); |
|
254 return 1; |
|
255 } |
|
256 recipe++; |
|
257 |
|
258 int recipelen = strlen(recipe); |
273 int recipelen = strlen(recipe); |
259 if (recipelen > 0 && recipe[recipelen - 1] == '"') |
274 if (recipelen > 0 && recipe[recipelen - 1] == '"') |
260 recipe[recipelen - 1] = '\0'; /* remove trailing quote */ |
275 recipe[recipelen - 1] = '\0'; /* remove trailing quote */ |
261 } |
276 } |
262 else |
277 else |
334 loglevel=LOGDEBUG; |
349 loglevel=LOGDEBUG; |
335 free(debugstr); debugstr=NULL; |
350 free(debugstr); debugstr=NULL; |
336 } |
351 } |
337 |
352 |
338 DEBUG(("talon: recipe: %s\n", recipe)); |
353 DEBUG(("talon: recipe: %s\n", recipe)); |
|
354 |
|
355 /* Make sure that the agent's hostname can be put into the host attribute */ |
|
356 char hostname[HOSTNAME_MAX]; |
|
357 int hostresult=0; |
|
358 |
|
359 hostresult = gethostname(hostname, HOSTNAME_MAX-1); |
|
360 if (0 != hostresult) |
|
361 { |
|
362 DEBUG(("talon: failed to get hostname: %d\n", hostresult)); |
|
363 hostname[0] = '\0'; |
|
364 } |
|
365 |
|
366 talon_setenv("HOSTNAME", hostname); |
|
367 DEBUG(("talon: setenv: hostname: %s\n", hostname)); |
339 |
368 |
340 |
369 |
341 char varname[VARNAMEMAX]; |
370 char varname[VARNAMEMAX]; |
342 char varval[VARVALMAX]; |
371 char varval[VARVALMAX]; |
343 int dotagging = 0; |
372 int dotagging = 0; |
547 |
576 |
548 talon_returncode = p->returncode; |
577 talon_returncode = p->returncode; |
549 |
578 |
550 if (dotagging) |
579 if (dotagging) |
551 { |
580 { |
552 char *forcesuccessstr = force_success == 0 ? "" : " forcesuccess='FORCESUCCESS'"; |
581 char *flagsstr = force_success == 0 ? "" : " flags='FORCESUCCESS'"; |
|
582 char *reasonstr = "" ; |
|
583 |
|
584 if (p->causeofdeath == PROC_TIMEOUTDEATH) |
|
585 reasonstr = " reason='timeout'"; |
553 |
586 |
554 if (p->returncode != 0) |
587 if (p->returncode != 0) |
555 { |
588 { |
556 char *exitstr = retries > 0 ? "retry" : "failed"; |
589 char *exitstr = retries > 0 ? "retry" : "failed"; |
557 snprintf(status, STATUS_STRMAX - 1, "\n<status exit='%s' code='%d' attempt='%d'%s />", exitstr, p->returncode, attempt, forcesuccessstr ); |
590 snprintf(status, STATUS_STRMAX - 1, "\n<status exit='%s' code='%d' attempt='%d'%s%s />", exitstr, p->returncode, attempt, flagsstr, reasonstr ); |
558 } else { |
591 } else { |
559 snprintf(status, STATUS_STRMAX - 1, "\n<status exit='ok' attempt='%d'%s />", attempt, forcesuccessstr ); |
592 snprintf(status, STATUS_STRMAX - 1, "\n<status exit='ok' attempt='%d'%s%s />", attempt, flagsstr, reasonstr ); |
560 } |
593 } |
561 status[STATUS_STRMAX-1] = '\0'; |
594 status[STATUS_STRMAX-1] = '\0'; |
562 |
595 |
563 snprintf(timestat, STATUS_STRMAX - 1, "<time start='%.5f' elapsed='%.3f' />",start_time, end_time-start_time ); |
596 snprintf(timestat, STATUS_STRMAX - 1, "<time start='%.5f' elapsed='%.3f' />",start_time, end_time-start_time ); |
564 timestat[STATUS_STRMAX-1] = '\0'; |
597 timestat[STATUS_STRMAX-1] = '\0'; |