|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2 of 7 v2] blktap3/tapback: Introduces functionality required to access XenStore
> On Fri, 2013-01-04 at 12:14 +0000, Thanos Makatos wrote:
> > This patch introduces convenience functions that read/write values
> from/to
> > XenStore.
> >
> > diff -r 0777319f0a6e -r efd3f343f7c7 tools/blktap3/tapback/xenstore.c
> > --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> > +++ b/tools/blktap3/tapback/xenstore.c Fri Jan 04 11:54:51 2013
> +0000
> > @@ -0,0 +1,188 @@
> > +/*
> > + * Copyright (C) 2012 Citrix Ltd.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License
> > + * as published by the Free Software Foundation; either version 2
> > + * of the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301,
> > + * USA.
> > + */
> > +
> > +#include <stdarg.h>
> > +#include <stdio.h>
> > +#include <xenstore.h>
> > +#include <assert.h>
> > +#include <stdlib.h>
> > +#include <string.h>
> > +
> > +#include "blktap3.h"
> > +#include "tapback.h"
> > +#include "xenstore.h"
> > +
> > +/**
> > + * Prints the supplied arguments to a buffer and returns it. The
> buffer must
> > + * be deallocated by the user.
>
> I'm not sure how much value this function has for callers over and
> above
> just using (v)asprintf directly, likewise for mprintf.
You're right they don't add anything, I'll remove them.
>
> > + */
> > +static char *
> > +vmprintf(const char * const fmt, va_list ap)
> > +{
> > + char *s = NULL;
>
> No need to init s.
Regarding initialising variables, isn't it a good programming practice to
initialise variables even if they'll be shortly assigned a value? Won't the
compiler easily optimise such cases? Or does it make it too cumbersome to read?
In any case, I checked the coding style document and it doesn't specify this,
so I think it would be a meaningful addition.
>
> > +
> > + if (vasprintf(&s, fmt, ap) < 0)
> > + s = NULL;
> > +
> > + return s;
> > +}
> > +
> > +__printf(1, 2)
> > +char *
> > +mprintf(const char * const fmt, ...)
> > +{
> > + va_list ap;
> > + char *s = NULL;
>
> No need to init s.
>
> > +
> > + va_start(ap, fmt);
> > + s = vmprintf(fmt, ap);
> > + va_end(ap);
> > +
> > + return s;
> > +}
> > +
> > +char *
> > +tapback_xs_vread(struct xs_handle * const xs, xs_transaction_t xst,
> > + const char * const fmt, va_list ap)
>
> This might be an interesting/useful addition to libxenstore?
Sure.
>
> > +{
> > + char *path = NULL, *data = NULL;
>
> No need to init path.
>
> > + unsigned int len = 0;
> > +
> > + assert(xs);
> > +
> > + path = vmprintf(fmt, ap);
> > + data = xs_read(xs, xst, path, &len);
>
> This uses path without checking if it is NULL.
>
> I think you can pass len == NULL if you don't care about the length of
> the result.
Right.
>
> However xenstore values generally can contain nulls and are not
> necessarily NULL terminated (see docs/misc/xenstore.txt), but perhaps
> the block protocol tightens this restriction such that you can rely on
> NULL termination (at least in practice)?
Hm.. I saw this in tools/xenstore/xenstore.h and I though xs_read does end the
string with a NULL:
/* Get the value of a single file, nul terminated.
* Returns a malloced value: call free() on it after use.
* len indicates length in bytes, not including terminator.
*/
void *xs_read(struct xs_handle *h, xs_transaction_t t,
const char *path, unsigned int *len);
Am I missing something?
>
> > + free(path);
> > +
> > + return data;
> > +}
> > +
> > +__printf(3, 4)
> > +char *
> > +tapback_xs_read(struct xs_handle * const xs, xs_transaction_t xst,
> > + const char * const fmt, ...)
> > +{
> > + va_list ap;
> > + char *s = NULL;
>
> No need to init s.
>
> > +
> > + assert(xs);
> > +
> > + va_start(ap, fmt);
> > + s = tapback_xs_vread(xs, xst, fmt, ap);
> > + va_end(ap);
> > +
> > + return s;
> > +}
> > +
>
> > +__scanf(3, 4)
> > +int
> > +tapback_device_scanf_otherend(vbd_t * const device,
> > + const char * const path, const char * const fmt, ...)
> > +{
> > + va_list ap;
> > + int n = 0;
> > + char *s = NULL;
> > +
> > + assert(device);
> > + assert(path);
> > +
> > + if (!(s = tapback_device_read_otherend(device, path)))
> > + return -1;
>
> Since s here is read from the frontend you probably can't trust it to
> be
> NULL terminated.
>
> > + va_start(ap, fmt);
> > + n = vsscanf(s, fmt, ap);
> > + free(s);
> > + va_end(ap);
> > +
> > + return n;
> > +}
> > +
>
> Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |