]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
tools: fix regression passing command with virt-login-shell
authorDaniel P. Berrangé <berrange@redhat.com>
Fri, 27 Sep 2019 16:18:24 +0000 (17:18 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Mon, 30 Sep 2019 11:08:30 +0000 (12:08 +0100)
It is documented that a command to run inside the container can be
passed with the -c arg.

  virt-login-shell -c "ls -l /"

This fixes

  commit 4feeb2d986b98013ebfb1d41ab6b9007b6cce6e2
  Author: Daniel P. Berrangé <berrange@redhat.com>
  Date:   Thu Aug 1 10:58:31 2019 +0100

    tools: split virt-login-shell into two binaries

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
cfg.mk
tools/virt-login-shell.c

diff --git a/cfg.mk b/cfg.mk
index 3731a2830bb6ecaafe00619b422188645c68739f..3eae469165f86bc3274c3611dd6318b995f9e939 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -1353,4 +1353,4 @@ exclude_file_name_regexp--sc_prohibit_dirent_d_type = \
   ^(src/util/vircgroup.c)$
 
 exclude_file_name_regexp--sc_prohibit_strcmp = \
-  ^(tools/nss/libvirt_nss.*\.c)
+  ^(tools/nss/libvirt_nss.*\.c|tools/virt-login-shell\.c)
index f92cc0a74912423a14cf0032410a8577f250ac8f..7d1e0ccc8a359d360767c2e19b1dfaa011f71ea4 100644 (file)
 int main(int argc, char **argv) {
     char uidstr[INT_BUFSIZE_BOUND(uid_t)];
     char gidstr[INT_BUFSIZE_BOUND(gid_t)];
-    const char *const newargv[] = {
-        LIBEXECDIR "/virt-login-shell-helper",
-        uidstr,
-        gidstr,
-        NULL,
-    };
+    const char * newargv[6];
+    size_t nargs = 0;
     char *newenv[] = {
         NULL,
         NULL,
@@ -60,10 +56,23 @@ int main(int argc, char **argv) {
         exit(EXIT_FAILURE);
     }
 
-    if (argc != 1) {
-        fprintf(stderr, "%s: no arguments expected\n", argv[0]);
+    newargv[nargs++] = LIBEXECDIR "/virt-login-shell-helper";
+    if (argc == 3) {
+        if (strcmp(argv[1], "-c") != 0) {
+            fprintf(stderr, "%s: syntax: %s [-c CMDSTR]\n", argv[0], argv[0]);
+            exit(EXIT_FAILURE);
+        }
+        newargv[nargs++] = argv[1];
+        newargv[nargs++] = argv[2];
+    } else if (argc != 1) {
+        fprintf(stderr, "%s: syntax: %s [-c CMDSTR]\n", argv[0], argv[0]);
         exit(EXIT_FAILURE);
     }
+    newargv[nargs++] = uidstr;
+    newargv[nargs++] = gidstr;
+    newargv[nargs++] = NULL;
+
+    assert(nargs <= (sizeof(newargv)/sizeof(newargv[0])));
 
     if (term &&
         asprintf(&(newenv[0]), "TERM=%s", term) < 0) {