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 \
|
||||
nsig.h \
|
||||
numa.c \
|
||||
number_set.c \
|
||||
number_set.h \
|
||||
oldstat.c \
|
||||
open.c \
|
||||
or1k_atomic.c \
|
||||
|
@ -27,55 +27,10 @@
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include "number_set.h"
|
||||
#include "filter.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
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
|
1
filter.h
1
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,
|
||||
|
@ -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;
|
||||
|
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
|
||||
#include <asm/unistd.h>
|
||||
|
||||
#include "number_set.h"
|
||||
#include "scno.h"
|
||||
#include "ptrace.h"
|
||||
#include "printsiginfo.h"
|
||||
|
Loading…
Reference in New Issue
Block a user