From: Dmitry V. Levin Date: Tue, 22 Aug 2017 21:23:49 +0000 (+0000) Subject: Move number_set interface to separate files X-Git-Tag: v4.19~69 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=67c97082ac6ddc4306df04030cee6e4d3b0b4994;p=strace Move number_set interface to separate files * number_set.c: New file. * number_set.h: Likewise. * Makefile.am (strace_SOURCES): Add them. * basic_filters.c: Include "number_set.h". (number_slot_t, struct number_set): Move to number_set.h. (BITS_PER_SLOT, number_setbit, number_isset, reallocate_number_set, add_number_to_set, is_number_in_set): Move to number_set.c. * defs.h (struct number_set): Remove forward declaration. (read_set, write_set, signal_set, is_number_in_set): Move to number_set.h. * filter.h (add_number_to_set): Move to number_set.h. * filter_qualify.c: Include "number_set.h". (number_slot_t, struct number_set): Remove. * strace.c: Include "number_set.h". * syscall.c: Likewise. --- diff --git a/Makefile.am b/Makefile.am index fefd3d29..b3afc7c5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -205,6 +205,8 @@ strace_SOURCES = \ nsfs.h \ nsig.h \ numa.c \ + number_set.c \ + number_set.h \ oldstat.c \ open.c \ or1k_atomic.c \ diff --git a/basic_filters.c b/basic_filters.c index 1dbdeac8..be0c4c51 100644 --- a/basic_filters.c +++ b/basic_filters.c @@ -27,55 +27,10 @@ */ #include "defs.h" +#include "number_set.h" #include "filter.h" #include -typedef unsigned int number_slot_t; -#define BITS_PER_SLOT (sizeof(number_slot_t) * 8) - -struct number_set { - number_slot_t *vec; - unsigned int nslots; - bool not; -}; - -static void -number_setbit(const unsigned int i, number_slot_t *const vec) -{ - vec[i / BITS_PER_SLOT] |= (number_slot_t) 1 << (i % BITS_PER_SLOT); -} - -static bool -number_isset(const unsigned int i, const number_slot_t *const vec) -{ - return vec[i / BITS_PER_SLOT] & ((number_slot_t) 1 << (i % BITS_PER_SLOT)); -} - -static void -reallocate_number_set(struct number_set *const set, const unsigned int new_nslots) -{ - if (new_nslots <= set->nslots) - return; - set->vec = xreallocarray(set->vec, new_nslots, sizeof(*set->vec)); - memset(set->vec + set->nslots, 0, - sizeof(*set->vec) * (new_nslots - set->nslots)); - set->nslots = new_nslots; -} - -void -add_number_to_set(const unsigned int number, struct number_set *const set) -{ - reallocate_number_set(set, number / BITS_PER_SLOT + 1); - number_setbit(number, set->vec); -} - -bool -is_number_in_set(const unsigned int number, const struct number_set *const set) -{ - return ((number / BITS_PER_SLOT < set->nslots) - && number_isset(number, set->vec)) ^ set->not; -} - static bool qualify_syscall_number(const char *s, struct number_set *set) { diff --git a/defs.h b/defs.h index 6c0c690f..92cde26e 100644 --- a/defs.h +++ b/defs.h @@ -644,12 +644,6 @@ print_struct_statfs64(struct tcb *, kernel_ulong_t addr, kernel_ulong_t size); extern void print_ifindex(unsigned int); -struct number_set; -extern struct number_set read_set; -extern struct number_set write_set; -extern struct number_set signal_set; - -extern bool is_number_in_set(unsigned int number, const struct number_set *); extern void qualify(const char *); extern unsigned int qual_flags(const unsigned int); diff --git a/filter.h b/filter.h index eefbd3cb..fab18127 100644 --- a/filter.h +++ b/filter.h @@ -32,7 +32,6 @@ struct number_set; typedef int (*string_to_uint_func)(const char *); -void add_number_to_set(unsigned int number, struct number_set *set); void qualify_tokens(const char *str, struct number_set *set, string_to_uint_func func, const char *name); void qualify_syscall_tokens(const char *str, struct number_set *set, diff --git a/filter_qualify.c b/filter_qualify.c index 4283e769..3ed0cb59 100644 --- a/filter_qualify.c +++ b/filter_qualify.c @@ -28,16 +28,9 @@ #include "defs.h" #include "nsig.h" +#include "number_set.h" #include "filter.h" -typedef unsigned int number_slot_t; - -struct number_set { - number_slot_t *vec; - unsigned int nslots; - bool not; -}; - struct number_set read_set; struct number_set write_set; struct number_set signal_set; diff --git a/number_set.c b/number_set.c new file mode 100644 index 00000000..e46efb0b --- /dev/null +++ b/number_set.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2016-2017 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include "number_set.h" +#include "xmalloc.h" + +#define BITS_PER_SLOT (sizeof(number_slot_t) * 8) + +static void +number_setbit(const unsigned int i, number_slot_t *const vec) +{ + vec[i / BITS_PER_SLOT] |= (number_slot_t) 1 << (i % BITS_PER_SLOT); +} + +static bool +number_isset(const unsigned int i, const number_slot_t *const vec) +{ + return vec[i / BITS_PER_SLOT] & ((number_slot_t) 1 << (i % BITS_PER_SLOT)); +} + +static void +reallocate_number_set(struct number_set *const set, const unsigned int new_nslots) +{ + if (new_nslots <= set->nslots) + return; + set->vec = xreallocarray(set->vec, new_nslots, sizeof(*set->vec)); + memset(set->vec + set->nslots, 0, + sizeof(*set->vec) * (new_nslots - set->nslots)); + set->nslots = new_nslots; +} + +bool +is_number_in_set(const unsigned int number, const struct number_set *const set) +{ + return set && ((number / BITS_PER_SLOT < set->nslots) + && number_isset(number, set->vec)) ^ set->not; +} + +void +add_number_to_set(const unsigned int number, struct number_set *const set) +{ + reallocate_number_set(set, number / BITS_PER_SLOT + 1); + number_setbit(number, set->vec); +} diff --git a/number_set.h b/number_set.h new file mode 100644 index 00000000..0215d0b2 --- /dev/null +++ b/number_set.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016-2017 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef STRACE_NUMBER_SET_H +#define STRACE_NUMBER_SET_H + +typedef unsigned int number_slot_t; + +struct number_set { + number_slot_t *vec; + unsigned int nslots; + bool not; +}; + +extern bool +is_number_in_set(unsigned int number, const struct number_set *); + +extern void +add_number_to_set(unsigned int number, struct number_set *); + +extern struct number_set read_set; +extern struct number_set write_set; +extern struct number_set signal_set; + +#endif /* !STRACE_NUMBER_SET_H */ diff --git a/strace.c b/strace.c index ae93f923..fae4ec78 100644 --- a/strace.c +++ b/strace.c @@ -46,6 +46,7 @@ #endif #include +#include "number_set.h" #include "scno.h" #include "ptrace.h" #include "printsiginfo.h" diff --git a/syscall.c b/syscall.c index a0c649ea..1e12a0d9 100644 --- a/syscall.c +++ b/syscall.c @@ -35,6 +35,7 @@ #include "defs.h" #include "native_defs.h" #include "nsig.h" +#include "number_set.h" #include /* for struct iovec */