[libvirt] [PATCH 2/2] Try stdin for input when no file is specified

Michael Williams spacex at mspacex.net
Tue Jun 14 03:39:29 UTC 2011


Modify virFileReadAll to check for redirected stdin input when
no file is specified.  This means that not every file argument
needs to be required.

Signed-off-by: Michael Williams <mspacex at gmail.com>
---
 src/util/util.c |   10 +++++-
 tools/virsh.c   |   99
+++++++++++++++++++++++++++++++++++--------------------
 2 files changed, 72 insertions(+), 37 deletions(-)

diff --git a/src/util/util.c b/src/util/util.c
index 554d68e..84b3ae5 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -445,7 +445,15 @@ int virFileReadAll(const char *path, int maxlen,
char **buf)
 {
     int fd;
 -    if (strcmp(path,"-") == 0)
+    if (!path) {
+        if (isatty(fileno(stdin))) {
+            virReportSystemError(EINVAL, "%s", _("Missing <file>
argument"));
+            return -1;
+	} else
+	    path = "-";
+    }
+
+    if (strcmp(path,"-") == 0)      	fd = fileno(stdin);
     else
         fd = open(path, O_RDONLY);
diff --git a/tools/virsh.c b/tools/virsh.c
index 76478dc..5b90b72 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -1248,7 +1248,7 @@ static const vshCmdInfo info_create[] = {
 };
  static const vshCmdOptDef opts_create[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML
domain description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML domain
description")},
 #ifndef WIN32
     {"console", VSH_OT_BOOL, 0, N_("attach to console after creation")},
 #endif
@@ -1271,8 +1271,10 @@ cmdCreate(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -1308,7 +1310,7 @@ static const vshCmdInfo info_define[] = {
 };
  static const vshCmdOptDef opts_define[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML
domain description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML domain
description")},
     {NULL, 0, 0, NULL}
 };
 @@ -1323,8 +1325,10 @@ cmdDefine(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -3801,7 +3805,7 @@ static const vshCmdInfo info_domxmlfromnative[] = {
  static const vshCmdOptDef opts_domxmlfromnative[] = {
     {"format", VSH_OT_DATA, VSH_OFLAG_REQ, N_("source config data
format")},
-    {"config", VSH_OT_DATA, VSH_OFLAG_REQ, N_("config data file to
import from")},
+    {"config", VSH_OT_DATA, 0, N_("config data file to import from")},
     {NULL, 0, 0, NULL}
 };
 @@ -3847,7 +3851,7 @@ static const vshCmdInfo info_domxmltonative[] = {
  static const vshCmdOptDef opts_domxmltonative[] = {
     {"format", VSH_OT_DATA, VSH_OFLAG_REQ, N_("target config data type
format")},
-    {"xml", VSH_OT_DATA, VSH_OFLAG_REQ, N_("xml data file to export
from")},
+    {"xml", VSH_OT_DATA, 0, N_("xml data file to export from")},
     {NULL, 0, 0, NULL}
 };
 @@ -4447,8 +4451,10 @@ cmdNetworkCreate(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -4478,7 +4484,7 @@ static const vshCmdInfo info_network_define[] = {
 };
  static const vshCmdOptDef opts_network_define[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML
network description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML network
description")},
     {NULL, 0, 0, NULL}
 };
 @@ -5249,7 +5255,7 @@ static const vshCmdInfo info_interface_define[] = {
 };
  static const vshCmdOptDef opts_interface_define[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML
interface description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML interface
description")},
     {NULL, 0, 0, NULL}
 };
 @@ -5264,8 +5270,10 @@ cmdInterfaceDefine(vshControl *ctl, const vshCmd
*cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -5494,7 +5502,7 @@ static const vshCmdInfo info_nwfilter_define[] = {
 };
  static const vshCmdOptDef opts_nwfilter_define[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML
network filter description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML network filter
description")},
     {NULL, 0, 0, NULL}
 };
 @@ -5509,8 +5517,10 @@ cmdNWFilterDefine(vshControl *ctl, const vshCmd
*cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -5832,7 +5842,7 @@ static const vshCmdInfo info_pool_create[] = {
 };
  static const vshCmdOptDef opts_pool_create[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ,
+    {"file", VSH_OT_DATA, 0,
      N_("file containing an XML pool description")},
     {NULL, 0, 0, NULL}
 };
@@ -5848,8 +5858,10 @@ cmdPoolCreate(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -5882,7 +5894,7 @@ static const vshCmdInfo info_node_device_create[] = {
 };
  static const vshCmdOptDef opts_node_device_create[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ,
+    {"file", VSH_OT_DATA, 0,
      N_("file containing an XML description of the device")},
     {NULL, 0, 0, NULL}
 };
@@ -5898,8 +5910,10 @@ cmdNodeDeviceCreate(vshControl *ctl, const vshCmd
*cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -6092,7 +6106,7 @@ static const vshCmdInfo info_pool_define[] = {
 };
  static const vshCmdOptDef opts_pool_define[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML
pool description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML pool
description")},
     {NULL, 0, 0, NULL}
 };
 @@ -6107,8 +6121,10 @@ cmdPoolDefine(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -7338,7 +7354,7 @@ static const vshCmdInfo info_vol_create[] = {
  static const vshCmdOptDef opts_vol_create[] = {
     {"pool", VSH_OT_DATA, VSH_OFLAG_REQ, N_("pool name")},
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML vol
description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML vol description")},
     {NULL, 0, 0, NULL}
 };
 @@ -7358,7 +7374,8 @@ cmdVolCreate(vshControl *ctl, const vshCmd *cmd)
                                            VSH_BYNAME)))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0) {
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         virStoragePoolFree(pool);
         return false;
     }
@@ -7395,7 +7412,7 @@ static const vshCmdInfo info_vol_create_from[] = {
  static const vshCmdOptDef opts_vol_create_from[] = {
     {"pool", VSH_OT_DATA, VSH_OFLAG_REQ, N_("pool name")},
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML vol
description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML vol description")},
     {"vol", VSH_OT_DATA, VSH_OFLAG_REQ, N_("input vol name or key")},
     {"inputpool", VSH_OT_STRING, 0, N_("pool name or uuid of the input
volume's pool")},
     {NULL, 0, 0, NULL}
@@ -7416,7 +7433,8 @@ cmdVolCreateFrom(vshControl *ctl, const vshCmd *cmd)
     if (!(pool = vshCommandOptPoolBy(ctl, cmd, "pool", NULL, VSH_BYNAME)))
         goto cleanup;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0) {
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         goto cleanup;
     }
 @@ -7570,7 +7588,7 @@ static const vshCmdInfo info_vol_upload[] = {
  static const vshCmdOptDef opts_vol_upload[] = {
     {"vol", VSH_OT_DATA, VSH_OFLAG_REQ, N_("vol name, key or path")},
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file")},
+    {"file", VSH_OT_DATA, 0, N_("file")},
     {"pool", VSH_OT_STRING, 0, N_("pool name or uuid")},
     {"offset", VSH_OT_INT, 0, N_("volume offset to upload to") },
     {"length", VSH_OT_INT, 0, N_("amount of data to upload") },
@@ -7670,7 +7688,7 @@ static const vshCmdInfo info_vol_download[] = {
  static const vshCmdOptDef opts_vol_download[] = {
     {"vol", VSH_OT_DATA, VSH_OFLAG_REQ, N_("vol name, key or path")},
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file")},
+    {"file", VSH_OT_DATA, 0, N_("file")},
     {"pool", VSH_OT_STRING, 0, N_("pool name or uuid")},
     {"offset", VSH_OT_INT, 0, N_("volume offset to download from") },
     {"length", VSH_OT_INT, 0, N_("amount of data to download") },
@@ -8380,7 +8398,7 @@ static const vshCmdInfo info_secret_define[] = {
 };
  static const vshCmdOptDef opts_secret_define[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing secret
attributes in XML")},
+    {"file", VSH_OT_DATA, 0, N_("file containing secret attributes in
XML")},
     {NULL, 0, 0, NULL}
 };
 @@ -8395,8 +8413,10 @@ cmdSecretDefine(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -9325,7 +9345,7 @@ static const vshCmdInfo info_attach_device[] = {
  static const vshCmdOptDef opts_attach_device[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
-    {"file",   VSH_OT_DATA, VSH_OFLAG_REQ, N_("XML file")},
+    {"file",   VSH_OT_DATA, 0, N_("XML file")},
     {"persistent", VSH_OT_BOOL, 0, N_("persist device attachment")},
     {NULL, 0, 0, NULL}
 };
@@ -9345,7 +9365,8 @@ cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0) {
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         virDomainFree(dom);
         return false;
     }
@@ -9390,7 +9411,7 @@ static const vshCmdInfo info_detach_device[] = {
  static const vshCmdOptDef opts_detach_device[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
-    {"file",   VSH_OT_DATA, VSH_OFLAG_REQ, N_("XML file")},
+    {"file",   VSH_OT_DATA, 0, N_("XML file")},
     {"persistent", VSH_OT_BOOL, 0, N_("persist device detachment")},
     {NULL, 0, 0, NULL}
 };
@@ -9410,7 +9431,8 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0) {
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         virDomainFree(dom);
         return false;
     }
@@ -9455,7 +9477,7 @@ static const vshCmdInfo info_update_device[] = {
  static const vshCmdOptDef opts_update_device[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
-    {"file",   VSH_OT_DATA, VSH_OFLAG_REQ, N_("XML file")},
+    {"file",   VSH_OT_DATA, 0, N_("XML file")},
     {"persistent", VSH_OT_BOOL, 0, N_("persist device update")},
     {"force",  VSH_OT_BOOL, 0, N_("force device update")},
     {NULL, 0, 0, NULL}
@@ -9476,7 +9498,8 @@ cmdUpdateDevice(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0) {
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         virDomainFree(dom);
         return false;
     }
@@ -10042,7 +10065,7 @@ static const vshCmdInfo info_cpu_compare[] = {
 };
  static const vshCmdOptDef opts_cpu_compare[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML CPU
description")},
+    {"file", VSH_OT_DATA, 0, N_("file containing an XML CPU description")},
     {NULL, 0, 0, NULL}
 };
 @@ -10057,8 +10080,10 @@ cmdCPUCompare(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
@@ -10104,7 +10129,7 @@ static const vshCmdInfo info_cpu_baseline[] = {
 };
  static const vshCmdOptDef opts_cpu_baseline[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing XML CPU
descriptions")},
+    {"file", VSH_OT_DATA, 0, N_("file containing XML CPU descriptions")},
     {NULL, 0, 0, NULL}
 };
 @@ -10128,8 +10153,10 @@ cmdCPUBaseline(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
 -    if (vshCommandOptString(cmd, "file", &from) <= 0)
+    if (vshCommandOptString(cmd, "file", &from) < 0) {
+        vshError(ctl, "%s", _("malformed xml argument"));
         return false;
+    }
      if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return false;
-- 
1.7.3.4




More information about the libvir-list mailing list