On Fri, Sep 05, 2008 at 11:17:27PM -0400, Cole Robinson wrote:
static int
virStorageBackendDiskDeleteVol(virConnectPtr conn,
- virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
- virStorageVolDefPtr vol ATTRIBUTE_UNUSED,
+ virStoragePoolObjPtr pool,
+ virStorageVolDefPtr vol,
unsigned int flags ATTRIBUTE_UNUSED)
{
- /* delete a partition */
- virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
- _("Disk pools are not yet supported"));
- return -1;
+ char *part_num = NULL;
+ int n;
+ char devpath[PATH_MAX];
+ char *devname, *srcname;
+
+ if ((n = readlink(vol->target.path, devpath, sizeof(devpath))) < 0 &&
+ errno != EINVAL) {
+ virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("Couldn't read volume target path '%s'.
%s"),
+ vol->target.path, strerror(errno));
+ return -1;
+ } else if (n <= 0) {
+ strncpy(devpath, vol->target.path, PATH_MAX);
+ } else {
+ devpath[n] = '\0';
+ }
+
+ devname = basename(devpath);
+ srcname = basename(pool->def->source.devices[0].path);
This seems to leak the two strings and not check for errors. That
would need to be fixed before being commited IMHO
+ DEBUG("devname=%s, srcname=%s", devname, srcname);
+
+ if (!STRPREFIX(devname, srcname)) {
+ virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("Volume path '%s' did not start with parent
"
+ "pool source device name."), devname);
+ return -1;
+ }
+
+ part_num = devname + strlen(srcname);
+
+ if (!part_num) {
+ virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse partition number from target "
+ "'%s'"), devname);
+ return -1;
+ }
+
+ /* eg parted /dev/sda rm 2 */
+ const char *prog[] = {
+ PARTED,
+ pool->def->source.devices[0].path,
+ "rm",
+ "--script",
+ part_num,
+ NULL,
+ };
+
+ if (virRun(conn, prog, NULL) < 0)
+ return -1;
+
+ return 0;
}
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/