| /* |
| * Copyright 2007 The Android Open Source Project |
| * |
| * Fake device support. |
| */ |
| #ifndef _WRAPSIM_FAKEDEV_H |
| #define _WRAPSIM_FAKEDEV_H |
| |
| #include <sys/types.h> |
| #include <sys/uio.h> |
| #include <errno.h> |
| |
| typedef struct FakeDev FakeDev; |
| |
| typedef int (*Fake_close)(FakeDev* dev, int); |
| typedef FakeDev* (*Fake_dup)(FakeDev* dev, int); |
| typedef ssize_t (*Fake_read)(FakeDev* dev, int, void*, size_t); |
| typedef ssize_t (*Fake_readv)(FakeDev* dev, int, const struct iovec*, int); |
| typedef ssize_t (*Fake_write)(FakeDev* dev, int, const void*, size_t); |
| typedef ssize_t (*Fake_writev)(FakeDev* dev, int, const struct iovec*, int); |
| typedef void* (*Fake_mmap)(FakeDev* dev, void*, size_t, int, int, int, __off_t); |
| typedef int (*Fake_ioctl)(FakeDev* dev, int, int, void*); |
| |
| /* |
| * An open fake device entry. |
| */ |
| struct FakeDev { |
| /* string, for debugging; usually orig. device name */ |
| char* debugName; |
| |
| /* state bucket */ |
| void* state; |
| |
| /* the file descriptor we're associated with */ |
| int fd; |
| |
| /* in some cases we use a pair; this is the other one */ |
| int otherFd; |
| |
| /* |
| * Device functions we provide. |
| * |
| * All other file descriptor operations should fail, usually with EBADF. |
| */ |
| Fake_close close; |
| Fake_dup dup; |
| Fake_read read; |
| Fake_readv readv; |
| Fake_write write; |
| Fake_writev writev; |
| Fake_mmap mmap; // handles both mmap() and mmap64() |
| Fake_ioctl ioctl; |
| }; |
| |
| /* |
| * If a handler isn't defined for a syscall, we return EMLINK so that it's |
| * obvious when the error is generated by us. |
| */ |
| #define kNoHandlerError EMLINK |
| |
| /* |
| * Fake file descriptors begin here. This should be chosen such that no |
| * real descriptor is ever at or above this value. |
| */ |
| #define kFakeFdBase 512 |
| #define kMaxFakeFdCount 256 |
| |
| /* |
| * Create a new, completely fake device entry. |
| */ |
| FakeDev* wsCreateFakeDev(const char* debugName); |
| |
| /* |
| * Create a new, mostly fake device entry. |
| */ |
| FakeDev* wsCreateRealFakeDev(const char* debugName); |
| |
| /* |
| * Free a fake device entry. |
| */ |
| void wsFreeFakeDev(FakeDev* dev); |
| |
| /* |
| * Given a file descriptor, find the corresponding fake device. Returns |
| * NULL if the fd doesn't correspond to one of our entries. |
| */ |
| FakeDev* wsFakeDevFromFd(int fd); |
| |
| /* |
| * Check to see if this open() call is on a device we want to spoof. |
| * |
| * Returns a "fake" file descriptor on success, <0 on error. |
| */ |
| int wsInterceptDeviceOpen(const char* pathName, int flags); |
| |
| /* |
| * Check to see if this access() call is on a device we want to spoof. |
| * |
| * Returns 0 if the device can be fake-accessed, -1 if it can't, -2 |
| * if it can't and we don't want to allow fallback to the host-device. |
| */ |
| int wsInterceptDeviceAccess(const char* pathName, int flags); |
| |
| /* |
| * Devices. |
| */ |
| FakeDev* wsOpenDevAudio(const char* pathName, int flags); |
| FakeDev* wsOpenDevConsoleTty(const char* pathName, int flags); |
| FakeDev* wsOpenDevEvent(const char* pathName, int flags); |
| FakeDev* wsOpenDevFb(const char* pathName, int flags); |
| FakeDev* wsOpenDevLog(const char* pathName, int flags); |
| FakeDev* wsOpenDevPower(const char* pathName, int flags); |
| FakeDev* wsOpenSysPower(const char* pathName, int flags); |
| FakeDev* wsOpenDevVibrator(const char* pathName, int flags); |
| |
| /* |
| * Performs key remapping and sends the event to the global input event device. |
| */ |
| void wsSendSimKeyEvent(int key, int isDown); |
| |
| /* |
| * Send a touch event to the global input event device. |
| */ |
| void wsSendSimTouchEvent(int action, int x, int y); |
| |
| #endif /*_WRAPSIM_FAKEDEV_H*/ |