diff options
author | Kenny Root <kroot@google.com> | 2012-10-12 14:58:28 -0700 |
---|---|---|
committer | Kenny Root <kroot@google.com> | 2012-10-15 08:53:46 -0700 |
commit | 0054cbd4dbb9315419cc3c3b2aa1754a02fff1f4 (patch) | |
tree | cd1283e9c71e1489ee3bf82b2da3f0744c7e6f9b /cmds/interrupter/interrupter.c | |
parent | cee1124052202c7f2a1956a54e5aa538d82197a7 (diff) | |
download | frameworks_base-0054cbd4dbb9315419cc3c3b2aa1754a02fff1f4.zip frameworks_base-0054cbd4dbb9315419cc3c3b2aa1754a02fff1f4.tar.gz frameworks_base-0054cbd4dbb9315419cc3c3b2aa1754a02fff1f4.tar.bz2 |
Add interrupter library to simulate EINTR
To check for robustness against EINTR from syscalls, add an
interrupter library that can be preloaded with LD_PRELOAD.
Change-Id: I0a6cd8702ec5bc6b2927a5e223ee3cdc033860a2
Diffstat (limited to 'cmds/interrupter/interrupter.c')
-rw-r--r-- | cmds/interrupter/interrupter.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/cmds/interrupter/interrupter.c b/cmds/interrupter/interrupter.c new file mode 100644 index 0000000..ae55515 --- /dev/null +++ b/cmds/interrupter/interrupter.c @@ -0,0 +1,53 @@ +/* + * Copyright 2012, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/** + * The probability of a syscall failing from 0.0 to 1.0 + */ +#define PROBABILITY 0.9 + + + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> + +/* for various intercepted calls */ +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <fcntl.h> + +/* For builds on glibc */ +#define __USE_GNU +#include <dlfcn.h> + +#include "interrupter.h" + +static int probability = PROBABILITY * RAND_MAX; + +static int maybe_interrupt() { + if (rand() < probability) { + return 1; + } + return 0; +} + +DEFINE_INTERCEPT(read, ssize_t, int, void*, size_t); +DEFINE_INTERCEPT(write, ssize_t, int, const void*, size_t); +DEFINE_INTERCEPT(accept, int, int, struct sockaddr*, socklen_t*); +DEFINE_INTERCEPT(creat, int, const char*, mode_t); |