[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 09/12] xenstore: make functions static
Move functions used in only one source to the file where they are used and make them static. Remove some prototypes from headers which are no longer in use. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- tools/xenstore/include/xenstore_lib.h | 15 ----- tools/xenstore/xenstore_client.c | 117 ++++++++++++++++++++++++++++++++++ tools/xenstore/xenstored_core.c | 55 +++++----------- tools/xenstore/xenstored_core.h | 14 ---- tools/xenstore/xenstored_watch.c | 27 ++++++++ tools/xenstore/xenstored_watch.h | 2 - tools/xenstore/xs_lib.c | 112 -------------------------------- 7 files changed, 159 insertions(+), 183 deletions(-) diff --git a/tools/xenstore/include/xenstore_lib.h b/tools/xenstore/include/xenstore_lib.h index 0ffbae9..866261d 100644 --- a/tools/xenstore/include/xenstore_lib.h +++ b/tools/xenstore/include/xenstore_lib.h @@ -76,19 +76,4 @@ bool xs_perm_to_string(const struct xs_permissions *perm, /* Given a string and a length, count how many strings (nul terms). */ unsigned int xs_count_strings(const char *strings, unsigned int len); -/* Sanitising (quoting) possibly-binary strings. */ -struct expanding_buffer { - char *buf; - int avail; -}; - -/* Ensure that given expanding buffer has at least min_avail characters. */ -char *expanding_buffer_ensure(struct expanding_buffer *, int min_avail); - -/* sanitise_value() may return NULL if malloc fails. */ -char *sanitise_value(struct expanding_buffer *, const char *val, unsigned len); - -/* *out_len_r on entry is ignored; out must be at least strlen(in)+1 bytes. */ -void unsanitise_value(char *out, unsigned *out_len_r, const char *in); - #endif /* XENSTORE_LIB_H */ diff --git a/tools/xenstore/xenstore_client.c b/tools/xenstore/xenstore_client.c index 3d14d37..dfa75a7 100644 --- a/tools/xenstore/xenstore_client.c +++ b/tools/xenstore/xenstore_client.c @@ -10,6 +10,7 @@ #include <err.h> #include <errno.h> +#include <assert.h> #include <fcntl.h> #include <getopt.h> #include <stdarg.h> @@ -38,12 +39,128 @@ enum mode { MODE_watch, }; +/* Sanitising (quoting) possibly-binary strings. */ +struct expanding_buffer { + char *buf; + int avail; +}; + static char *output_buf = NULL; static int output_pos = 0; static struct expanding_buffer ebuf; static int output_size = 0; +static char *expanding_buffer_ensure(struct expanding_buffer *ebuf, int min_avail) +{ + int want; + char *got; + + if (ebuf->avail >= min_avail) + return ebuf->buf; + + if (min_avail >= INT_MAX/3) + return 0; + + want = ebuf->avail + min_avail + 10; + got = realloc(ebuf->buf, want); + if (!got) + return 0; + + ebuf->buf = got; + ebuf->avail = want; + return ebuf->buf; +} + +static char *sanitise_value(struct expanding_buffer *ebuf, + const char *val, unsigned len) +{ + int used, remain, c; + unsigned char *ip; + +#define ADD(c) (ebuf->buf[used++] = (c)) +#define ADDF(f,c) (used += sprintf(ebuf->buf+used, (f), (c))) + + assert(len < INT_MAX/5); + + ip = (unsigned char *)val; + used = 0; + remain = len; + + if (!expanding_buffer_ensure(ebuf, remain + 1)) + return NULL; + + while (remain-- > 0) { + c= *ip++; + + if (c >= ' ' && c <= '~' && c != '\\') { + ADD(c); + continue; + } + + if (!expanding_buffer_ensure(ebuf, used + remain + 5)) + /* for "<used>\\nnn<remain>\0" */ + return 0; + + ADD('\\'); + switch (c) { + case '\t': ADD('t'); break; + case '\n': ADD('n'); break; + case '\r': ADD('r'); break; + case '\\': ADD('\\'); break; + default: + if (c < 010) ADDF("%03o", c); + else ADDF("x%02x", c); + } + } + + ADD(0); + assert(used <= ebuf->avail); + return ebuf->buf; + +#undef ADD +#undef ADDF +} + +static void unsanitise_value(char *out, unsigned *out_len_r, const char *in) +{ + const char *ip; + char *op; + unsigned c; + int n; + + for (ip = in, op = out; (c = *ip++); *op++ = c) { + if (c == '\\') { + c = *ip++; + +#define GETF(f) do { \ + n = 0; \ + sscanf(ip, f "%n", &c, &n); \ + ip += n; \ + } while (0) + + switch (c) { + case 't': c= '\t'; break; + case 'n': c= '\n'; break; + case 'r': c= '\r'; break; + case '\\': c= '\\'; break; + case 'x': GETF("%2x"); break; + case '0': case '4': + case '1': case '5': + case '2': case '6': + case '3': case '7': --ip; GETF("%3o"); break; + case 0: --ip; break; + default:; + } +#undef GETF + } + } + + *op = 0; + + if (out_len_r) + *out_len_r = op - out; +} static void output(const char *fmt, ...) { va_list ap; diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index f5ec585..3faab6e 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -365,22 +365,6 @@ static void initialize_fds(int sock, int *p_sock_pollfd_idx, } } -/* Is child a subnode of parent, or equal? */ -bool is_child(const char *child, const char *parent) -{ - unsigned int len = strlen(parent); - - /* / should really be "" for this algorithm to work, but that's a - * usability nightmare. */ - if (streq(parent, "/")) - return true; - - if (strncmp(child, parent, len) != 0) - return false; - - return child[len] == '/' || child[len] == '\0'; -} - /* * If it fails, returns NULL and sets errno. * Temporary memory allocations will be done with ctx. @@ -638,6 +622,21 @@ unsigned int get_strings(struct buffered_data *data, return i; } +static void send_error(struct connection *conn, int error) +{ + unsigned int i; + + for (i = 0; error != xsd_errors[i].errnum; i++) { + if (i == ARRAY_SIZE(xsd_errors) - 1) { + eprintf("xenstored: error %i untranslatable", error); + i = 0; /* EINVAL */ + break; + } + } + send_reply(conn, XS_ERROR, xsd_errors[i].errstring, + strlen(xsd_errors[i].errstring) + 1); +} + void send_reply(struct connection *conn, enum xsd_sockmsg_type type, const void *data, unsigned int len) { @@ -675,21 +674,6 @@ void send_ack(struct connection *conn, enum xsd_sockmsg_type type) send_reply(conn, type, "OK", sizeof("OK")); } -void send_error(struct connection *conn, int error) -{ - unsigned int i; - - for (i = 0; error != xsd_errors[i].errnum; i++) { - if (i == ARRAY_SIZE(xsd_errors) - 1) { - eprintf("xenstored: error %i untranslatable", error); - i = 0; /* EINVAL */ - break; - } - } - send_reply(conn, XS_ERROR, xsd_errors[i].errstring, - strlen(xsd_errors[i].errstring) + 1); -} - static bool valid_chars(const char *node) { /* Nodes can have lots of crap. */ @@ -761,15 +745,6 @@ char *canonicalize(struct connection *conn, const char *node) return (char *)node; } -bool check_event_node(const char *node) -{ - if (!node || !strstarts(node, "@")) { - errno = EINVAL; - return false; - } - return true; -} - static int send_directory(struct connection *conn, struct buffered_data *in) { struct node *node; diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h index 089625f..3872dab 100644 --- a/tools/xenstore/xenstored_core.h +++ b/tools/xenstore/xenstored_core.h @@ -132,24 +132,15 @@ const char *onearg(struct buffered_data *in); unsigned int get_strings(struct buffered_data *data, char *vec[], unsigned int num); -/* Is child node a child or equal to parent node? */ -bool is_child(const char *child, const char *parent); - void send_reply(struct connection *conn, enum xsd_sockmsg_type type, const void *data, unsigned int len); /* Some routines (write, mkdir, etc) just need a non-error return */ void send_ack(struct connection *conn, enum xsd_sockmsg_type type); -/* Send an error: error is usually "errno". */ -void send_error(struct connection *conn, int error); - /* Canonicalize this path if possible. */ char *canonicalize(struct connection *conn, const char *node); -/* Check if node is an event node. */ -bool check_event_node(const char *node); - /* Get this node, checking we have permissions. */ struct node *get_node(struct connection *conn, const void *ctx, @@ -159,9 +150,6 @@ struct node *get_node(struct connection *conn, /* Get TDB context for this connection */ TDB_CONTEXT *tdb_context(struct connection *conn); -/* Destructor for tdbs: required for transaction code */ -int destroy_tdb(void *_tdb); - /* Replace the tdb: required for transaction code */ bool replace_tdb(const char *newname, TDB_CONTEXT *newtdb); @@ -174,11 +162,9 @@ bool is_valid_nodename(const char *node); /* Tracing infrastructure. */ void trace_create(const void *data, const char *type); void trace_destroy(const void *data, const char *type); -void trace_watch_timeout(const struct connection *conn, const char *node, const char *token); void trace(const char *fmt, ...); void dtrace_io(const struct connection *conn, const struct buffered_data *data, int out); -extern int event_fd; extern int dom0_domid; extern int dom0_event; extern int priv_domid; diff --git a/tools/xenstore/xenstored_watch.c b/tools/xenstore/xenstored_watch.c index 8cfc5b0..e1146ed 100644 --- a/tools/xenstore/xenstored_watch.c +++ b/tools/xenstore/xenstored_watch.c @@ -47,6 +47,33 @@ struct watch char *node; }; +static bool check_event_node(const char *node) +{ + if (!node || !strstarts(node, "@")) { + errno = EINVAL; + return false; + } + return true; +} + +/* Is child a subnode of parent, or equal? */ +static bool is_child(const char *child, const char *parent) +{ + unsigned int len = strlen(parent); + + /* + * / should really be "" for this algorithm to work, but that's a + * usability nightmare. + */ + if (streq(parent, "/")) + return true; + + if (strncmp(child, parent, len) != 0) + return false; + + return child[len] == '/' || child[len] == '\0'; +} + /* * Send a watch event. * Temporary memory allocations are done with ctx. diff --git a/tools/xenstore/xenstored_watch.h b/tools/xenstore/xenstored_watch.h index 546a5c3..c72ea6a 100644 --- a/tools/xenstore/xenstored_watch.h +++ b/tools/xenstore/xenstored_watch.h @@ -28,8 +28,6 @@ int do_unwatch(struct connection *conn, struct buffered_data *in); void fire_watches(struct connection *conn, void *tmp, const char *name, bool recurse); -void dump_watches(struct connection *conn); - void conn_delete_all_watches(struct connection *conn); #endif /* _XENSTORED_WATCH_H */ diff --git a/tools/xenstore/xs_lib.c b/tools/xenstore/xs_lib.c index 6568e82..5ef3d6d 100644 --- a/tools/xenstore/xs_lib.c +++ b/tools/xenstore/xs_lib.c @@ -21,7 +21,6 @@ #include <string.h> #include <stdlib.h> #include <errno.h> -#include <assert.h> #include "xenstore_lib.h" /* Common routines for the Xen store daemon and client library. */ @@ -184,114 +183,3 @@ unsigned int xs_count_strings(const char *strings, unsigned int len) return num; } - -char *expanding_buffer_ensure(struct expanding_buffer *ebuf, int min_avail) -{ - int want; - char *got; - - if (ebuf->avail >= min_avail) - return ebuf->buf; - - if (min_avail >= INT_MAX/3) - return 0; - - want = ebuf->avail + min_avail + 10; - got = realloc(ebuf->buf, want); - if (!got) - return 0; - - ebuf->buf = got; - ebuf->avail = want; - return ebuf->buf; -} - -char *sanitise_value(struct expanding_buffer *ebuf, - const char *val, unsigned len) -{ - int used, remain, c; - unsigned char *ip; - -#define ADD(c) (ebuf->buf[used++] = (c)) -#define ADDF(f,c) (used += sprintf(ebuf->buf+used, (f), (c))) - - assert(len < INT_MAX/5); - - ip = (unsigned char *)val; - used = 0; - remain = len; - - if (!expanding_buffer_ensure(ebuf, remain + 1)) - return NULL; - - while (remain-- > 0) { - c= *ip++; - - if (c >= ' ' && c <= '~' && c != '\\') { - ADD(c); - continue; - } - - if (!expanding_buffer_ensure(ebuf, used + remain + 5)) - /* for "<used>\\nnn<remain>\0" */ - return 0; - - ADD('\\'); - switch (c) { - case '\t': ADD('t'); break; - case '\n': ADD('n'); break; - case '\r': ADD('r'); break; - case '\\': ADD('\\'); break; - default: - if (c < 010) ADDF("%03o", c); - else ADDF("x%02x", c); - } - } - - ADD(0); - assert(used <= ebuf->avail); - return ebuf->buf; - -#undef ADD -#undef ADDF -} - -void unsanitise_value(char *out, unsigned *out_len_r, const char *in) -{ - const char *ip; - char *op; - unsigned c; - int n; - - for (ip = in, op = out; (c = *ip++); *op++ = c) { - if (c == '\\') { - c = *ip++; - -#define GETF(f) do { \ - n = 0; \ - sscanf(ip, f "%n", &c, &n); \ - ip += n; \ - } while (0) - - switch (c) { - case 't': c= '\t'; break; - case 'n': c= '\n'; break; - case 'r': c= '\r'; break; - case '\\': c= '\\'; break; - case 'x': GETF("%2x"); break; - case '0': case '4': - case '1': case '5': - case '2': case '6': - case '3': case '7': --ip; GETF("%3o"); break; - case 0: --ip; break; - default:; - } -#undef GETF - } - } - - *op = 0; - - if (out_len_r) - *out_len_r = op - out; -} -- 2.6.6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |