Looks good. Please add: Reviewed-by: Matthew Booth <mbo...@redhat.com>
Matt On 29/08/14 16:03, Richard W.M. Jones wrote: > In order to access VMware ESX efficiently, we need to send a session > cookie. This patch is very simple and just allows you to send that > session cookie. It punts on the question of how you get the session > cookie in the first place, but in practice you can just run a `curl' > command against the server and extract the cookie that way. > > To use it, add file.cookie to the curl URL. For example: > > $ qemu-img info 'json: { > "file.driver":"https", > > "file.url":"https://vcenter/folder/Windows%202003/Windows%202003-flat.vmdk?dcPath=Datacenter&dsName=datastore1", > "file.sslverify":"off", > > "file.cookie":"vmware_soap_session=\"52a01262-bf93-ccce-d379-8dabb3e55560\""}' > image: [...] > file format: raw > virtual size: 8.0G (8589934592 bytes) > disk size: unavailable > > Signed-off-by: Richard W.M. Jones <rjo...@redhat.com> > --- > block/curl.c | 16 ++++++++++++++++ > qemu-options.hx | 5 +++++ > 2 files changed, 21 insertions(+) > > diff --git a/block/curl.c b/block/curl.c > index f59615d..fa1a258 100644 > --- a/block/curl.c > +++ b/block/curl.c > @@ -71,6 +71,7 @@ static CURLMcode __curl_multi_socket_action(CURLM > *multi_handle, > #define CURL_BLOCK_OPT_URL "url" > #define CURL_BLOCK_OPT_READAHEAD "readahead" > #define CURL_BLOCK_OPT_SSLVERIFY "sslverify" > +#define CURL_BLOCK_OPT_COOKIE "cookie" > > struct BDRVCURLState; > > @@ -109,6 +110,7 @@ typedef struct BDRVCURLState { > char *url; > size_t readahead_size; > bool sslverify; > + char *cookie; > bool accept_range; > AioContext *aio_context; > } BDRVCURLState; > @@ -382,6 +384,9 @@ static CURLState *curl_init_state(BlockDriverState *bs, > BDRVCURLState *s) > curl_easy_setopt(state->curl, CURLOPT_URL, s->url); > curl_easy_setopt(state->curl, CURLOPT_SSL_VERIFYPEER, > (long) s->sslverify); > + if (s->cookie) { > + curl_easy_setopt(state->curl, CURLOPT_COOKIE, s->cookie); > + } > curl_easy_setopt(state->curl, CURLOPT_TIMEOUT, 5); > curl_easy_setopt(state->curl, CURLOPT_WRITEFUNCTION, > (void *)curl_read_cb); > @@ -489,6 +494,11 @@ static QemuOptsList runtime_opts = { > .type = QEMU_OPT_BOOL, > .help = "Verify SSL certificate" > }, > + { > + .name = CURL_BLOCK_OPT_COOKIE, > + .type = QEMU_OPT_STRING, > + .help = "Pass the cookie or list of cookies with each request" > + }, > { /* end of list */ } > }, > }; > @@ -501,6 +511,7 @@ static int curl_open(BlockDriverState *bs, QDict > *options, int flags, > QemuOpts *opts; > Error *local_err = NULL; > const char *file; > + const char *cookie; > double d; > > static int inited = 0; > @@ -527,6 +538,9 @@ static int curl_open(BlockDriverState *bs, QDict > *options, int flags, > > s->sslverify = qemu_opt_get_bool(opts, CURL_BLOCK_OPT_SSLVERIFY, true); > > + cookie = qemu_opt_get(opts, CURL_BLOCK_OPT_COOKIE); > + s->cookie = g_strdup(cookie); > + > file = qemu_opt_get(opts, CURL_BLOCK_OPT_URL); > if (file == NULL) { > error_setg(errp, "curl block driver requires an 'url' option"); > @@ -582,6 +596,7 @@ out: > curl_easy_cleanup(state->curl); > state->curl = NULL; > out_noclean: > + g_free(s->cookie); > g_free(s->url); > qemu_opts_del(opts); > return -EINVAL; > @@ -684,6 +699,7 @@ static void curl_close(BlockDriverState *bs) > DPRINTF("CURL: Close\n"); > curl_detach_aio_context(bs); > > + g_free(s->cookie); > g_free(s->url); > } > > diff --git a/qemu-options.hx b/qemu-options.hx > index c573dd8..7b4a58a 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -2351,6 +2351,11 @@ multiple of 512 bytes. It defaults to 256k. > @item sslverify > Whether to verify the remote server's certificate when connecting over SSL. > It > can have the value 'on' or 'off'. It defaults to 'on'. > + > +@item cookie > +Send this cookie (it can also be a list of cookies separated by ';') with > +each outgoing request. Only supported when using protocols such as HTTP > +which support cookies, otherwise ignored. > @end table > > Note that when passing options to qemu explicitly, @option{driver} is the > value > -- Matthew Booth Red Hat Engineering, Virtualisation Team Phone: +442070094448 (UK) GPG ID: D33C3490 GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490