2010-05-25 11:14:06 +00:00
|
|
|
/*
|
|
|
|
* commandhelper.c: Auxiliary program for commandtest
|
|
|
|
*
|
2013-02-22 22:42:39 +00:00
|
|
|
* Copyright (C) 2010-2013 Red Hat, Inc.
|
2010-05-25 11:14:06 +00:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
2012-09-20 22:30:55 +00:00
|
|
|
* License along with this library. If not, see
|
2012-07-21 10:06:23 +00:00
|
|
|
* <http://www.gnu.org/licenses/>.
|
2010-05-25 11:14:06 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "internal.h"
|
2012-12-13 17:44:57 +00:00
|
|
|
#include "virutil.h"
|
2012-12-12 18:06:53 +00:00
|
|
|
#include "viralloc.h"
|
2011-07-19 18:32:58 +00:00
|
|
|
#include "virfile.h"
|
2012-03-29 09:50:00 +00:00
|
|
|
#include "testutils.h"
|
2013-05-03 12:52:21 +00:00
|
|
|
#include "virstring.h"
|
2012-03-29 09:50:00 +00:00
|
|
|
|
|
|
|
#ifndef WIN32
|
2010-05-25 11:14:06 +00:00
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
# define VIR_FROM_THIS VIR_FROM_NONE
|
2010-05-25 11:14:06 +00:00
|
|
|
|
|
|
|
static int envsort(const void *a, const void *b) {
|
|
|
|
const char *const*astrptr = a;
|
|
|
|
const char *const*bstrptr = b;
|
|
|
|
const char *astr = *astrptr;
|
|
|
|
const char *bstr = *bstrptr;
|
|
|
|
char *aeq = strchr(astr, '=');
|
|
|
|
char *beq = strchr(bstr, '=');
|
2013-05-03 12:52:21 +00:00
|
|
|
char *akey;
|
|
|
|
char *bkey;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
ignore_value(VIR_STRNDUP_QUIET(akey, astr, aeq - astr));
|
|
|
|
ignore_value(VIR_STRNDUP_QUIET(bkey, bstr, beq - bstr));
|
|
|
|
ret = strcmp(akey, bkey);
|
2012-02-02 23:16:43 +00:00
|
|
|
VIR_FREE(akey);
|
|
|
|
VIR_FREE(bkey);
|
2010-05-25 11:14:06 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char **argv) {
|
Convert 'int i' to 'size_t i' in tests/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i, n;
|
2013-07-11 11:22:20 +00:00
|
|
|
int open_max;
|
2010-05-25 11:14:06 +00:00
|
|
|
char **origenv;
|
|
|
|
char **newenv;
|
2011-04-29 17:14:23 +00:00
|
|
|
char *cwd;
|
2010-05-25 11:14:06 +00:00
|
|
|
FILE *log = fopen(abs_builddir "/commandhelper.log", "w");
|
|
|
|
|
|
|
|
if (!log)
|
|
|
|
goto error;
|
|
|
|
|
2013-05-21 07:53:48 +00:00
|
|
|
for (i = 1; i < argc; i++) {
|
2010-05-25 11:14:06 +00:00
|
|
|
fprintf(log, "ARG:%s\n", argv[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
origenv = environ;
|
|
|
|
n = 0;
|
|
|
|
while (*origenv != NULL) {
|
|
|
|
n++;
|
|
|
|
origenv++;
|
|
|
|
}
|
|
|
|
|
2013-07-04 10:20:21 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(newenv, n) < 0)
|
2013-02-22 22:42:39 +00:00
|
|
|
return EXIT_FAILURE;
|
2010-05-25 11:14:06 +00:00
|
|
|
|
|
|
|
origenv = environ;
|
|
|
|
n = i = 0;
|
|
|
|
while (*origenv != NULL) {
|
|
|
|
newenv[i++] = *origenv;
|
|
|
|
n++;
|
|
|
|
origenv++;
|
|
|
|
}
|
|
|
|
qsort(newenv, n, sizeof(newenv[0]), envsort);
|
|
|
|
|
2013-05-21 07:53:48 +00:00
|
|
|
for (i = 0; i < n; i++) {
|
2011-01-06 20:23:36 +00:00
|
|
|
/* Ignore the variables used to instruct the loader into
|
|
|
|
* behaving differently, as they could throw the tests off. */
|
|
|
|
if (!STRPREFIX(newenv[i], "LD_"))
|
|
|
|
fprintf(log, "ENV:%s\n", newenv[i]);
|
2010-05-25 11:14:06 +00:00
|
|
|
}
|
|
|
|
|
2013-07-11 11:22:20 +00:00
|
|
|
open_max = sysconf(_SC_OPEN_MAX);
|
|
|
|
if (open_max < 0)
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
for (i = 0; i < open_max; i++) {
|
2010-05-25 11:14:06 +00:00
|
|
|
int f;
|
|
|
|
int closed;
|
|
|
|
if (i == fileno(log))
|
|
|
|
continue;
|
|
|
|
closed = fcntl(i, F_GETFD, &f) == -1 &&
|
|
|
|
errno == EBADF;
|
|
|
|
if (!closed)
|
Convert 'int i' to 'size_t i' in tests/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
fprintf(log, "FD:%zu\n", i);
|
2010-05-25 11:14:06 +00:00
|
|
|
}
|
|
|
|
|
2010-12-15 17:23:32 +00:00
|
|
|
fprintf(log, "DAEMON:%s\n", getpgrp() == getsid(0) ? "yes" : "no");
|
2011-04-29 17:14:23 +00:00
|
|
|
if (!(cwd = getcwd(NULL, 0)))
|
2010-12-03 16:10:31 +00:00
|
|
|
return EXIT_FAILURE;
|
2011-04-29 17:14:23 +00:00
|
|
|
if (strlen(cwd) > strlen(".../commanddata") &&
|
2010-05-25 11:14:06 +00:00
|
|
|
STREQ(cwd + strlen(cwd) - strlen("/commanddata"), "/commanddata"))
|
|
|
|
strcpy(cwd, ".../commanddata");
|
|
|
|
fprintf(log, "CWD:%s\n", cwd);
|
2011-04-29 17:14:23 +00:00
|
|
|
VIR_FREE(cwd);
|
2010-05-25 11:14:06 +00:00
|
|
|
|
|
|
|
VIR_FORCE_FCLOSE(log);
|
|
|
|
|
2012-05-31 21:50:07 +00:00
|
|
|
if (argc > 1 && STREQ(argv[1], "--close-stdin")) {
|
|
|
|
if (freopen("/dev/null", "r", stdin) != stdin)
|
|
|
|
goto error;
|
|
|
|
usleep(100*1000);
|
|
|
|
}
|
|
|
|
|
2010-05-25 11:14:06 +00:00
|
|
|
char buf[1024];
|
|
|
|
ssize_t got;
|
|
|
|
|
|
|
|
fprintf(stdout, "BEGIN STDOUT\n");
|
|
|
|
fflush(stdout);
|
|
|
|
fprintf(stderr, "BEGIN STDERR\n");
|
|
|
|
fflush(stderr);
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
got = read(STDIN_FILENO, buf, sizeof(buf));
|
|
|
|
if (got < 0)
|
|
|
|
goto error;
|
|
|
|
if (got == 0)
|
|
|
|
break;
|
|
|
|
if (safewrite(STDOUT_FILENO, buf, got) != got)
|
|
|
|
goto error;
|
|
|
|
if (safewrite(STDERR_FILENO, buf, got) != got)
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(stdout, "END STDOUT\n");
|
|
|
|
fflush(stdout);
|
|
|
|
fprintf(stderr, "END STDERR\n");
|
|
|
|
fflush(stderr);
|
|
|
|
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
|
|
|
|
error:
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
2012-03-29 09:50:00 +00:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
int
|
|
|
|
main(void)
|
|
|
|
{
|
|
|
|
return EXIT_AM_SKIP;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|