• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2007 The Android Open Source Project
3  *
4  * Fake device support.
5  */
6 #ifndef _WRAPSIM_FAKEDEV_H
7 #define _WRAPSIM_FAKEDEV_H
8 
9 #include <sys/types.h>
10 #include <sys/uio.h>
11 #include <errno.h>
12 
13 typedef struct FakeDev FakeDev;
14 
15 typedef int      (*Fake_close)(FakeDev* dev, int);
16 typedef FakeDev* (*Fake_dup)(FakeDev* dev, int);
17 typedef ssize_t  (*Fake_read)(FakeDev* dev, int, void*, size_t);
18 typedef ssize_t  (*Fake_readv)(FakeDev* dev, int, const struct iovec*, int);
19 typedef ssize_t  (*Fake_write)(FakeDev* dev, int, const void*, size_t);
20 typedef ssize_t  (*Fake_writev)(FakeDev* dev, int, const struct iovec*, int);
21 typedef void*    (*Fake_mmap)(FakeDev* dev, void*, size_t, int, int, int, __off_t);
22 typedef int      (*Fake_ioctl)(FakeDev* dev, int, int, void*);
23 
24 /*
25  * An open fake device entry.
26  */
27 struct FakeDev {
28     /* string, for debugging; usually orig. device name */
29     char*   debugName;
30 
31     /* state bucket */
32     void*   state;
33 
34     /* the file descriptor we're associated with */
35     int     fd;
36 
37     /* in some cases we use a pair; this is the other one */
38     int     otherFd;
39 
40     /*
41      * Device functions we provide.
42      *
43      * All other file descriptor operations should fail, usually with EBADF.
44      */
45     Fake_close  close;
46     Fake_dup  dup;
47     Fake_read   read;
48     Fake_readv  readv;
49     Fake_write  write;
50     Fake_writev writev;
51     Fake_mmap   mmap;       // handles both mmap() and mmap64()
52     Fake_ioctl  ioctl;
53 };
54 
55 /*
56  * If a handler isn't defined for a syscall, we return EMLINK so that it's
57  * obvious when the error is generated by us.
58  */
59 #define kNoHandlerError EMLINK
60 
61 /*
62  * Fake file descriptors begin here.  This should be chosen such that no
63  * real descriptor is ever at or above this value.
64  */
65 #define kFakeFdBase     512
66 #define kMaxFakeFdCount 256
67 
68 /*
69  * Create a new, completely fake device entry.
70  */
71 FakeDev* wsCreateFakeDev(const char* debugName);
72 
73 /*
74  * Create a new, mostly fake device entry.
75  */
76 FakeDev* wsCreateRealFakeDev(const char* debugName);
77 
78 /*
79  * Free a fake device entry.
80  */
81 void wsFreeFakeDev(FakeDev* dev);
82 
83 /*
84  * Given a file descriptor, find the corresponding fake device.  Returns
85  * NULL if the fd doesn't correspond to one of our entries.
86  */
87 FakeDev* wsFakeDevFromFd(int fd);
88 
89 /*
90  * Check to see if this open() call is on a device we want to spoof.
91  *
92  * Returns a "fake" file descriptor on success, <0 on error.
93  */
94 int wsInterceptDeviceOpen(const char* pathName, int flags);
95 
96 /*
97  * Check to see if this access() call is on a device we want to spoof.
98  *
99  * Returns 0 if the device can be fake-accessed, -1 if it can't, -2
100  * if it can't and we don't want to allow fallback to the host-device.
101  */
102 int wsInterceptDeviceAccess(const char* pathName, int flags);
103 
104 /*
105  * Devices.
106  */
107 FakeDev* wsOpenDevAudio(const char* pathName, int flags);
108 FakeDev* wsOpenDevConsoleTty(const char* pathName, int flags);
109 FakeDev* wsOpenDevEvent(const char* pathName, int flags);
110 FakeDev* wsOpenDevFb(const char* pathName, int flags);
111 FakeDev* wsOpenDevLog(const char* pathName, int flags);
112 FakeDev* wsOpenDevPower(const char* pathName, int flags);
113 FakeDev* wsOpenSysPower(const char* pathName, int flags);
114 FakeDev* wsOpenDevVibrator(const char* pathName, int flags);
115 
116 /*
117  * Performs key remapping and sends the event to the global input event device.
118  */
119 void wsSendSimKeyEvent(int key, int isDown);
120 
121 /*
122  * Send a touch event to the global input event device.
123  */
124 void wsSendSimTouchEvent(int action, int x, int y);
125 
126 #endif /*_WRAPSIM_FAKEDEV_H*/
127