From: Dmitry V. Levin Date: Mon, 19 Dec 2016 23:37:57 +0000 (+0000) Subject: tests: generate scno.h from syscallent.h for use by other tests X-Git-Tag: v4.16~317 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=605a705a63d533dceb3c2d489468fcd3aed3963c;p=strace tests: generate scno.h from syscallent.h for use by other tests Provide scno.h with fallback definitions of all __NR_* constants known to strace for the personbality being tested. Some tests need just __NR_* constants without any kernel support. Such tests can include "scno.h" after to get definitions of these constants when system headers are too old. * tests/generate_scno.c: New file. * tests/.gitignore: Add generate_scno. * tests/Makefile.am (check_PROGRAMS): Likewise. (scno.h): New rule. (BUILT_SOURCES, CLEANFILES): Add scno.h. --- diff --git a/tests/.gitignore b/tests/.gitignore index 92b1120a..7dee9fd9 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -80,6 +80,7 @@ ftruncate ftruncate64 futex futimesat +generate_scno get_mempolicy getcpu getcwd diff --git a/tests/Makefile.am b/tests/Makefile.am index 488bfb82..1c32b1c6 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -142,6 +142,7 @@ check_PROGRAMS = \ ftruncate64 \ futex \ futimesat \ + generate_scno \ get_mempolicy \ getcpu \ getcwd \ @@ -914,5 +915,8 @@ ksysent.h: $(srcdir)/ksysent.sed mv -f $@.t2 $@ rm -f $@.t1 -BUILT_SOURCES = ksysent.h -CLEANFILES = ksysent.h $(TESTS:=.tmp) +scno.h: generate_scno + ./$< > $@-t && mv $@-t $@ + +BUILT_SOURCES = ksysent.h scno.h +CLEANFILES = ksysent.h scno.h $(TESTS:=.tmp) diff --git a/tests/generate_scno.c b/tests/generate_scno.c new file mode 100644 index 00000000..1261420c --- /dev/null +++ b/tests/generate_scno.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015-2016 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. + */ + +#include "defs.h" +#include "syscall.h" + +#define TD 0 +#define TF 0 +#define TI 0 +#define TN 0 +#define TP 0 +#define TS 0 +#define TM 0 +#define NF 0 +#define MA 0 +#define SI 0 +#define SE 0 +#define CST 0 +#define SEN(arg) 0,0 + +static const struct_sysent syscallent[] = { +#include "syscallent.h" +}; + +#undef syscall_bit +#if defined __x86_64__ && defined __ILP32__ && defined __X32_SYSCALL_BIT +# define syscall_bit __X32_SYSCALL_BIT +#endif +#ifndef syscall_bit +# define syscall_bit 0 +#endif + +static char al_num[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789"; + +int +main(void) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(syscallent); ++i) { + const char *name = syscallent[i].sys_name; + + if (!name || strspn(name, al_num) < strlen(name) +#ifdef SYS_socket_nsubcalls + || (i >= SYS_socket_subcall && + i < SYS_socket_subcall + SYS_socket_nsubcalls) +#endif +#ifdef SYS_ipc_nsubcalls + || (i >= SYS_ipc_subcall && + i < SYS_ipc_subcall + SYS_ipc_nsubcalls) +#endif +#ifdef ARM_FIRST_SHUFFLED_SYSCALL + || (i >= ARM_FIRST_SHUFFLED_SYSCALL && + i <= ARM_FIRST_SHUFFLED_SYSCALL + + ARM_LAST_SPECIAL_SYSCALL + 1) +#endif + ) + continue; + + printf("#ifndef __NR_%s\n# define __NR_%s %u\n#endif\n", + name, name, syscall_bit + i); + } + + return 0; +}