242
NeedsEscape(char c, BOOLEAN inDouble)
243
// Solaris treats ^ like |
269
// Solaris treats ^ like |
256
AppendStringEscaped(StringBuffer* buffer, const char* str, int length)
283
AppendStringEscaped(StringBuffer* buffer, const char* str, int length, BOOLEAN inDouble)
258
285
CENTERROR ceError = CENTERROR_SUCCESS;
290
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\"'));
293
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\''));
261
295
for (i = 0; str[i] && (length == -1 || i < (unsigned int) length); i++)
263
if (NeedsEscape(str[i]))
264
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\\'));
265
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, str[i]));
299
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\''));
300
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\\'));
301
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\''));
302
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\''));
306
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, str[i]));
310
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\''));
314
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\"'));
285
AppendVariable(Command* result, struct CTShellVar* var)
334
AppendVariable(Command* result, struct CTShellVar* var, BOOLEAN inDouble)
287
336
CENTERROR ceError = CENTERROR_SUCCESS;
288
337
char* str = NULL;
299
348
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppend(&result->buffer, str));
302
BAIL_ON_CENTERIS_ERROR(ceError = AppendStringEscaped(&result->buffer, var->value.string, -1));
351
BAIL_ON_CENTERIS_ERROR(ceError = AppendStringEscaped(&result->buffer, var->value.string, -1, inDouble));
305
354
for (ptr = var->value.array; *ptr; ptr++)
308
357
BAIL_ON_CENTERIS_ERROR(ceError =
309
358
CTStringBufferAppendChar(&result->buffer, ' '));
311
BAIL_ON_CENTERIS_ERROR(ceError = AppendStringEscaped(&result->buffer, *ptr, -1));
360
BAIL_ON_CENTERIS_ERROR(ceError = AppendStringEscaped(&result->buffer, *ptr, -1, inDouble));
384
436
unsigned int i, length;
385
437
char* variable = NULL;
386
438
StringBuffer* buffer = &result->buffer;
439
BOOLEAN inDouble = FALSE;
388
441
for (i = 0; format[i]; i++)
390
443
switch (format[i])
446
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, format[i]));
447
inDouble = !inDouble;
393
450
length = QuoteLength(format, i);
394
BAIL_ON_CENTERIS_ERROR(ceError = AppendStringEscaped(buffer, format+i+1, length-2));
451
BAIL_ON_CENTERIS_ERROR(ceError = AppendStringEscaped(buffer, format+i+1, length-2, inDouble));
399
if (NeedsEscape(format[i]))
456
if (NeedsEscape(format[i], inDouble))
400
457
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\\'));
401
458
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, format[i]));
406
463
BAIL_ON_CENTERIS_ERROR(ceError =
407
464
AppendVariable(result,
408
465
lwg_hash_table_lookup(result->variables,
409
(void*) (variable+1))));
466
(void*) (variable+1)),
469
CT_SAFE_FREE_STRING(variable);
413
472
// Characters to pass through unmodified to the shell
427
485
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, format[i]));
430
if (NeedsEscape(format[i]))
488
if (NeedsEscape(format[i], inDouble))
431
489
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, '\\'));
432
490
BAIL_ON_CENTERIS_ERROR(ceError = CTStringBufferAppendChar(buffer, format[i]));
442
ExecuteShellCommand(Command* command)
500
ExecuteShellCommand(char * const envp[], Command* command)
444
502
CENTERROR ceError = CENTERROR_SUCCESS;
447
// fprintf(stderr, "CTShell: %s\n", command->buffer.data);
470
execl("/bin/sh", (const char*) "sh", (const char*) "-c", (const char*) command->buffer.data, (const char*) NULL);
471
// If we are still here, die horribly
527
execle("/bin/sh", (const char*) "sh", (const char*) "-c", (const char*) command->buffer.data, (const char*) NULL, envp);
529
execl("/bin/sh", (const char*) "sh", (const char*) "-c", (const char*) command->buffer.data, (const char*) NULL);
555
if (waitpid(pid, &status, 0) != pid || status)
558
BAIL_ON_CENTERIS_ERROR(ceError = CENTERROR_COMMAND_FAILED);
560
BAIL_ON_CENTERIS_ERROR(ceError = CTMapSystemError(errno));
616
wpid = waitpid(pid, &status, 0);
617
} while (wpid != pid && errno == EINTR);
619
BAIL_ON_CENTERIS_ERROR(ceError = CTMapSystemError(errno));
621
BAIL_ON_CENTERIS_ERROR(ceError = CENTERROR_COMMAND_FAILED);
629
CTShellEx(char * const envp[], const char* format, ...)
631
CENTERROR ceError = CENTERROR_SUCCESS;
632
unsigned int numvars = 0;
636
va_start(ap, format);
638
BAIL_ON_CENTERIS_ERROR(ceError = CommandConstruct(&command));
639
BAIL_ON_CENTERIS_ERROR(ceError = CountVariables(format, &numvars));
640
BAIL_ON_CENTERIS_ERROR(ceError = BuildVariableTable(numvars, ap, &command.variables));
641
BAIL_ON_CENTERIS_ERROR(ceError = ConstructShellCommand(format, &command));
642
BAIL_ON_CENTERIS_ERROR(ceError = ExecuteShellCommand(envp, &command));
647
CommandDestroy(&command);
569
653
CTShell(const char* format, ...)
571
655
CENTERROR ceError = CENTERROR_SUCCESS;
578
662
BAIL_ON_CENTERIS_ERROR(ceError = CommandConstruct(&command));
579
663
BAIL_ON_CENTERIS_ERROR(ceError = CountVariables(format, &numvars));
580
BAIL_ON_CENTERIS_ERROR(ceError = BuildVariableTable(numvars, ap, &command.variables));
664
BAIL_ON_CENTERIS_ERROR(ceError = BuildVariableTable(numvars, ap,
665
&command.variables));
581
666
BAIL_ON_CENTERIS_ERROR(ceError = ConstructShellCommand(format, &command));
582
BAIL_ON_CENTERIS_ERROR(ceError = ExecuteShellCommand(&command));
667
BAIL_ON_CENTERIS_ERROR(ceError = ExecuteShellCommand(NULL, &command));