10054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root/* 20054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * Copyright 2012, The Android Open Source Project 30054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * 40054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 50054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * you may not use this file except in compliance with the License. 60054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * You may obtain a copy of the License at 70054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * 80054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 90054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * 100054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * Unless required by applicable law or agreed to in writing, software 110054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 120054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * See the License for the specific language governing permissions and 140054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * limitations under the License. 150054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root */ 160054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 170054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 180054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root/** 190054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root * The probability of a syscall failing from 0.0 to 1.0 200054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root */ 210054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#define PROBABILITY 0.9 220054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 230054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 240054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 250054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include <stdio.h> 260054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include <stdlib.h> 270054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include <errno.h> 280054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 290054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root/* for various intercepted calls */ 300054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include <sys/types.h> 310054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include <sys/socket.h> 320054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include <sys/stat.h> 330054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include <fcntl.h> 340054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 350054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root/* For builds on glibc */ 360054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#define __USE_GNU 370054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include <dlfcn.h> 380054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 390054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root#include "interrupter.h" 400054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 410054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Rootstatic int probability = PROBABILITY * RAND_MAX; 420054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 430054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Rootstatic int maybe_interrupt() { 440054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root if (rand() < probability) { 450054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root return 1; 460054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root } 470054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root return 0; 480054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root} 490054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny Root 500054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny RootDEFINE_INTERCEPT(read, ssize_t, int, void*, size_t); 510054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny RootDEFINE_INTERCEPT(write, ssize_t, int, const void*, size_t); 520054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny RootDEFINE_INTERCEPT(accept, int, int, struct sockaddr*, socklen_t*); 530054cbd4dbb9315419cc3c3b2aa1754a02fff1f4Kenny RootDEFINE_INTERCEPT(creat, int, const char*, mode_t); 54