summaryrefslogtreecommitdiffstats
path: root/cmds/interrupter/interrupter.c
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2012-10-12 14:58:28 -0700
committerKenny Root <kroot@google.com>2012-10-15 08:53:46 -0700
commit0054cbd4dbb9315419cc3c3b2aa1754a02fff1f4 (patch)
treecd1283e9c71e1489ee3bf82b2da3f0744c7e6f9b /cmds/interrupter/interrupter.c
parentcee1124052202c7f2a1956a54e5aa538d82197a7 (diff)
downloadframeworks_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.c53
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);