
On 15.03.2012 10:13, Osier Yang wrote:
Detects the file type of source path if no "--sourcetype" and "driver" is specified, instead of always set the disk type as "block".
And previous "virCommandOptString" ensures "source" is not NULL, remove the conditional checking. --- tools/virsh.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c index d45a4c9..3b845ac 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -14428,6 +14428,7 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd) const char *stype = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; char *xml; + struct stat st;
if (!vshConnectionUsability(ctl, ctl->conn)) goto cleanup; @@ -14458,8 +14459,12 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd) }
if (!stype) { - if (driver && (STREQ(driver, "file") || STREQ(driver, "tap"))) + if (driver && (STREQ(driver, "file") || STREQ(driver, "tap"))) { isFile = true; + } else { + if (!stat(source, &st)) + isFile = S_ISREG(st.st_mode) ? true : false;
I think S_ISREG() would be sufficient here. But that's just cosmetic.
+ } } else if (STREQ(stype, "file")) { isFile = true; } else if (STRNEQ(stype, "block")) { @@ -14497,10 +14502,9 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd) if (driver || subdriver || cache) virBufferAddLit(&buf, "/>\n");
- if (source) - virBufferAsprintf(&buf, " <source %s='%s'/>\n", - (isFile) ? "file" : "dev", - source); + virBufferAsprintf(&buf, " <source %s='%s'/>\n", + (isFile) ? "file" : "dev", + source); virBufferAsprintf(&buf, " <target dev='%s'/>\n", target); if (mode) virBufferAsprintf(&buf, " <%s/>\n", mode);
However this looks bad. As written in commend just below virCommandOptString(, source): /* Allow empty string as a placeholder that implies no source, for * use in adding a cdrom drive with no disk. */ if (!*source) source = NULL; That means: virsh attach-disk <domain> "" dummy make source NULL. Therefore you want to check source != NULL in the first chunk too (okay, not as strict as here, since passing NULL to stat() makes it fail, but it's clean coding style what matters too). Michal