Files
xen/tools/libxl/libxlu_disk.c
T
Ian Campbell 7970280833 xl: support empty CDROM devices
The important change here is to xlu_disk_parse to correctly set format == EMPTY
for CDROM devices which are empty. Test cases are added which check for
correctness here.

xend accepts ',hdc:cdrom,r'[0] as an empty CDROM drive however this is not
consistent with the xl syntax in docs/misc/xl-disk-configuration.txt which
requires ',,hdc:cdrom,r' (the additional positional paramter is the format).
I'm not sure if/how this can be fixed. Note that xend does not accept
',,hdc:cdrom,r'

There are several incidental cleanups included the the cdrom-{insert,eject}
commands:
  - add a dry-run mode
  - use the non-deprecated disk specification syntax
  - check for and report errors from libxl_cdrom_insert

[0] http://wiki.xen.org/wiki/CD_Rom_Support_in_Xen

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
2012-07-26 10:35:35 +01:00

104 lines
2.5 KiB
C

#include "libxl_osdeps.h" /* must come before any other headers */
#include "libxlu_internal.h"
#include "libxlu_disk_l.h"
#include "libxlu_disk_i.h"
#include "libxlu_cfg_i.h"
void xlu__disk_err(DiskParseContext *dpc, const char *erroneous,
const char *message) {
fprintf(dpc->cfg->report,
"%s: config parsing error in disk specification: %s"
"%s%s%s"
" in `%s'\n",
dpc->cfg->config_source, message,
erroneous?": near `":"", erroneous?erroneous:"", erroneous?"'":"",
dpc->spec);
if (!dpc->err) dpc->err= EINVAL;
}
static int dpc_prep(DiskParseContext *dpc, const char *spec) {
int e;
dpc->spec = spec;
e = xlu__disk_yylex_init_extra(dpc, &dpc->scanner);
if (e) goto fail;
dpc->buf = xlu__disk_yy_scan_bytes(spec, strlen(spec), dpc->scanner);
if (!dpc->buf) { e = ENOMEM; goto fail; }
return 0;
fail:
fprintf(dpc->cfg->report, "cannot init disk scanner: %s\n",
strerror(errno));
return e;
}
static void dpc_dispose(DiskParseContext *dpc) {
if (dpc->buf) {
xlu__disk_yy_delete_buffer(dpc->buf, dpc->scanner);
dpc->buf = 0;
}
if (dpc->scanner) {
xlu__disk_yylex_destroy(dpc->scanner);
dpc->scanner = 0;
}
}
int xlu_disk_parse(XLU_Config *cfg,
int nspecs, const char *const *specs,
libxl_device_disk *disk) {
DiskParseContext dpc;
int i, e;
memset(&dpc,0,sizeof(dpc));
dpc.cfg = cfg;
dpc.scanner = 0;
dpc.disk = disk;
disk->readwrite = 1;
for (i=0; i<nspecs; i++) {
e = dpc_prep(&dpc, specs[i]);
if (e) { dpc.err = e; goto x_err; }
xlu__disk_yylex(dpc.scanner);
assert(!e);
if (dpc.err) goto x_err;
dpc_dispose(&dpc);
}
if (disk->format == LIBXL_DISK_FORMAT_UNKNOWN) {
disk->format = LIBXL_DISK_FORMAT_RAW;
}
if (disk->is_cdrom) {
disk->removable = 1;
disk->readwrite = 0;
if (!disk->pdev_path || !strcmp(disk->pdev_path, ""))
disk->format = LIBXL_DISK_FORMAT_EMPTY;
}
if (!disk->vdev) {
xlu__disk_err(&dpc,0, "no vdev specified");
goto x_err;
}
if (!disk->pdev_path && !disk->removable) {
xlu__disk_err(&dpc,0,"no target specified (and device not removable)");
goto x_err;
}
x_err:
dpc_dispose(&dpc);
return dpc.err;
}
/*
* Local variables:
* mode: C
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/