|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 6/7] xenstore: add support for reading directory with many children
>>> On 27.10.16 at 11:55, <JGross@xxxxxxxx> wrote:
> +static void send_directory_part(struct connection *conn,
> + struct buffered_data *in)
> +{
> + unsigned int off, len, maxlen, genlen;
> + char *name, *child, *data;
> + struct node *node;
> + char gen[24];
> +
> + if (xs_count_strings(in->buffer, in->used) != 2) {
> + send_error(conn, EINVAL);
> + return;
> + }
> +
> + /* First arg is node name. */
> + name = canonicalize(conn, in->buffer);
> +
> + /* Second arg is childlist offset. */
> + off = atoi(in->buffer + strlen(in->buffer) + 1);
Not being a user land person, I consider this too weak: Imo using
strtoul() and properly handling conversion errors would be better
here.
> + node = get_node(conn, in, name, XS_PERM_READ);
> + if (!node) {
> + send_error(conn, errno);
> + return;
> + }
> +
> + genlen = snprintf(gen, sizeof(gen), "%"PRIu64, node->generation) + 1;
Why not use the shorter hex representation here?
> + /* Offset behind list: just return a list with an empty string. */
> + if (off >= node->childlen) {
Is it perhaps worth separating the == and > cases? The former is
just EOL, while the latter is really an error.
> + len = strlen(gen) + 2;
> + gen[len - 1] = 0;
> + send_reply(conn, XS_DIRECTORY_PART, gen, len);
Any reason not to utilize genlen here, instead of the extra strlen()?
> + return;
> + }
> +
> + len = 0;
> + maxlen = XENSTORE_PAYLOAD_MAX - genlen - 1;
> + child = node->children + off;
> +
> + while (len + strlen(child) < maxlen) {
> + len += strlen(child) + 1;
> + child += strlen(child) + 1;
> + if (off + len == node->childlen)
> + break;
> + }
> +
> + data = talloc_array(in, char, genlen + len + 1);
> + if (!data) {
> + send_error(conn, ENOMEM);
> + return;
> + }
> +
> + strcpy(data, gen);
memcpy(data, gen, genlen); ?
> + memcpy(data + genlen, node->children + off, len);
> + if (off + len == node->childlen) {
> + len++;
> + data[genlen + len] = 0;
> + }
> +
> + send_reply(conn, XS_DIRECTORY_PART, data, genlen + len);
> +}
Since you don't return the offset, am I understanding right that the
remote side is expected to accumulate that value?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |