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.
This commit is contained in:
parent
e398011d2b
commit
67c97082ac
@ -205,6 +205,8 @@ strace_SOURCES = \
|
|||||||
nsfs.h \
|
nsfs.h \
|
||||||
nsig.h \
|
nsig.h \
|
||||||
numa.c \
|
numa.c \
|
||||||
|
number_set.c \
|
||||||
|
number_set.h \
|
||||||
oldstat.c \
|
oldstat.c \
|
||||||
open.c \
|
open.c \
|
||||||
or1k_atomic.c \
|
or1k_atomic.c \
|
||||||
|
@ -27,55 +27,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
|
#include "number_set.h"
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
|
||||||
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
|
static bool
|
||||||
qualify_syscall_number(const char *s, struct number_set *set)
|
qualify_syscall_number(const char *s, struct number_set *set)
|
||||||
{
|
{
|
||||||
|
6
defs.h
6
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);
|
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 void qualify(const char *);
|
||||||
extern unsigned int qual_flags(const unsigned int);
|
extern unsigned int qual_flags(const unsigned int);
|
||||||
|
|
||||||
|
1
filter.h
1
filter.h
@ -32,7 +32,6 @@
|
|||||||
struct number_set;
|
struct number_set;
|
||||||
typedef int (*string_to_uint_func)(const char *);
|
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,
|
void qualify_tokens(const char *str, struct number_set *set,
|
||||||
string_to_uint_func func, const char *name);
|
string_to_uint_func func, const char *name);
|
||||||
void qualify_syscall_tokens(const char *str, struct number_set *set,
|
void qualify_syscall_tokens(const char *str, struct number_set *set,
|
||||||
|
@ -28,16 +28,9 @@
|
|||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "nsig.h"
|
#include "nsig.h"
|
||||||
|
#include "number_set.h"
|
||||||
#include "filter.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 read_set;
|
||||||
struct number_set write_set;
|
struct number_set write_set;
|
||||||
struct number_set signal_set;
|
struct number_set signal_set;
|
||||||
|
75
number_set.c
Normal file
75
number_set.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2017 Dmitry V. Levin <ldv@altlinux.org>
|
||||||
|
* 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 <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#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);
|
||||||
|
}
|
49
number_set.h
Normal file
49
number_set.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2017 Dmitry V. Levin <ldv@altlinux.org>
|
||||||
|
* 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 */
|
1
strace.c
1
strace.c
@ -46,6 +46,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
|
|
||||||
|
#include "number_set.h"
|
||||||
#include "scno.h"
|
#include "scno.h"
|
||||||
#include "ptrace.h"
|
#include "ptrace.h"
|
||||||
#include "printsiginfo.h"
|
#include "printsiginfo.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user