127 lines
3.4 KiB
C
127 lines
3.4 KiB
C
/*
|
|
* 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*/
|