fish: Don't store xmlURIPtr directly in the drive struct.

Original drv_uri fields:

      xmlURIPtr uri;        /* URI */
      char *socket;         /* ?socket parameter from URI. */
      const char *format;   /* format (NULL == autodetect) */

New drv_uri fields:

      char *path;           /* disk path */
      char *protocol;       /* protocol (eg. "nbd") */
      char **server;        /* server(s) - can be NULL */
      char *username;       /* username - can be NULL */
      const char *format;   /* format (NULL == autodetect) */
      const char *orig_uri; /* original URI (for error messages etc.) */

This is just code motion.
This commit is contained in:
Richard W.M. Jones
2013-07-30 12:17:22 +01:00
parent 0e1ba00059
commit a3891430bc
3 changed files with 53 additions and 25 deletions

View File

@@ -30,8 +30,6 @@
#include <assert.h>
#include <libintl.h>
#include <libxml/uri.h>
#ifdef HAVE_LIBVIRT
#include <libvirt/libvirt.h>
#include <libvirt/virterror.h>
@@ -337,10 +335,9 @@ single_drive_display_name (struct drv *drvs)
break;
case drv_uri:
name = (char *) xmlSaveUri (drvs->uri.uri);
name = strdup (drvs->uri.orig_uri);
if (name == NULL) {
fprintf (stderr, _("%s: xmlSaveUri: could not make printable URI\n"),
program_name);
perror ("strdup");
exit (EXIT_FAILURE);
}
/* Try to shorten the URI to just the final element, if it will

View File

@@ -35,6 +35,7 @@
static int is_uri (const char *arg);
static void parse_uri (const char *arg, const char *format, struct drv *drv);
static char *query_get (xmlURIPtr uri, const char *search_name);
static char **make_server (xmlURIPtr uri, const char *socket);
/* Handle the '-a' option when passed on the command line. */
void
@@ -95,8 +96,12 @@ is_uri (const char *arg)
static void
parse_uri (const char *arg, const char *format, struct drv *drv)
{
xmlURIPtr uri;
char *socket;
CLEANUP_XMLFREEURI xmlURIPtr uri = NULL;
CLEANUP_FREE char *socket = NULL;
char *path;
char *protocol;
char **server;
char *username;
uri = xmlParseURI (arg);
if (!uri) {
@@ -132,11 +137,37 @@ parse_uri (const char *arg, const char *format, struct drv *drv)
}
*/
protocol = strdup (uri->scheme);
if (protocol == NULL) {
perror ("strdup");
exit (EXIT_FAILURE);
}
server = make_server (uri, socket);
if (uri->user && STRNEQ (uri->user, "")) {
username = strdup (uri->user);
if (!username) {
perror ("username");
exit (EXIT_FAILURE);
}
}
else username = NULL;
path = strdup (uri->path ? uri->path : "");
if (!path) {
perror ("path");
exit (EXIT_FAILURE);
}
drv->type = drv_uri;
drv->nr_drives = -1;
drv->uri.uri = uri;
drv->uri.socket = socket;
drv->uri.path = path;
drv->uri.protocol = protocol;
drv->uri.server = server;
drv->uri.username = username;
drv->uri.format = format;
drv->uri.orig_uri = arg;
}
/* Code inspired by libvirt src/util/viruri.c, written by danpb,
@@ -285,7 +316,6 @@ add_drives (struct drv *drv, char next_drive)
{
int r;
struct guestfs_add_drive_opts_argv ad_optargs;
char **server;
if (next_drive > 'z') {
fprintf (stderr,
@@ -336,22 +366,20 @@ add_drives (struct drv *drv, char next_drive)
ad_optargs.format = drv->uri.format;
}
ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_PROTOCOL_BITMASK;
ad_optargs.protocol = drv->uri.uri->scheme;
ad_optargs.server = server = make_server (drv->uri.uri, drv->uri.socket);
if (server)
ad_optargs.protocol = drv->uri.protocol;
if (drv->uri.server) {
ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_SERVER_BITMASK;
if (drv->uri.uri->user && STRNEQ (drv->uri.uri->user, "")) {
ad_optargs.server = drv->uri.server;
}
if (drv->uri.username) {
ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_USERNAME_BITMASK;
ad_optargs.username = drv->uri.uri->user;
ad_optargs.username = drv->uri.username;
}
r = guestfs_add_drive_opts_argv (g, drv->uri.uri->path ? : "",
&ad_optargs);
r = guestfs_add_drive_opts_argv (g, drv->uri.path, &ad_optargs);
if (r == -1)
exit (EXIT_FAILURE);
guestfs___free_string_list (server);
drv->nr_drives = 1;
next_drive++;
break;
@@ -463,8 +491,10 @@ free_drives (struct drv *drv)
/* a.filename and a.format are optargs, don't free them */
break;
case drv_uri:
xmlFreeURI (drv->uri.uri);
free (drv->uri.socket);
free (drv->uri.path);
free (drv->uri.protocol);
guestfs___free_string_list (drv->uri.server);
free (drv->uri.username);
break;
case drv_d:
/* d.filename is optarg, don't free it */

View File

@@ -21,8 +21,6 @@
#include <getopt.h>
#include <libxml/uri.h>
#include "guestfs-internal-frontend.h"
/* Provided by guestfish or guestmount. */
@@ -64,9 +62,12 @@ struct drv {
const char *format; /* format (NULL == autodetect) */
} a;
struct {
xmlURIPtr uri; /* URI */
char *socket; /* ?socket parameter from URI. */
char *path; /* disk path */
char *protocol; /* protocol (eg. "nbd") */
char **server; /* server(s) - can be NULL */
char *username; /* username - can be NULL */
const char *format; /* format (NULL == autodetect) */
const char *orig_uri; /* original URI (for error messages etc.) */
} uri;
struct {
char *guest; /* guest name */