
On 03/15/2012 05:12 PM, Michal Privoznik wrote:
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;
Oh, yes, I didn't notice the comments. Osier