OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 #ifndef PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ | 6 #ifndef PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ |
7 #define PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ | 7 #define PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ |
8 | 8 |
9 #include <errno.h> | 9 #include <errno.h> |
10 #ifdef __GLIBC__ | 10 #ifdef __GLIBC__ |
11 #include <netdb.h> | |
11 #include <poll.h> | 12 #include <poll.h> |
12 #endif | 13 #endif |
13 #include <pthread.h> | 14 #include <pthread.h> |
14 #ifdef __GLIBC__ | 15 #ifdef __GLIBC__ |
15 #include <sys/epoll.h> | 16 #include <sys/epoll.h> |
16 #endif | 17 #endif |
17 #include <sys/stat.h> | 18 #include <sys/stat.h> |
18 #include <string> | 19 #include <string> |
19 #include "../base/Mount.h" | 20 #include "../base/Mount.h" |
20 #include "../base/MountManager.h" | 21 #include "../base/MountManager.h" |
22 #include "../base/PthreadHelpers.h" | |
23 #include "../net/BaseSocketSubSystem.h" | |
21 #include "../util/Path.h" | 24 #include "../util/Path.h" |
22 #include "../util/SimpleAutoLock.h" | 25 #include "../util/SimpleAutoLock.h" |
23 #include "../util/SlotAllocator.h" | 26 #include "../util/SlotAllocator.h" |
24 | 27 |
25 // KernelProxy handles all of the system calls. System calls are either | 28 // KernelProxy handles all of the system calls. System calls are either |
26 // (1) handled entirely by the KernelProxy, (2) processed by the | 29 // (1) handled entirely by the KernelProxy, (2) processed by the |
27 // KernelProxy and then passed to a Mount, or (3) proccessed by the | 30 // KernelProxy and then passed to a Mount, or (3) proccessed by the |
28 // KernelProxy using other system calls implemented by the Mount. | 31 // KernelProxy using other system calls implemented by the Mount. |
29 class KernelProxy { | 32 class KernelProxy { |
30 public: | 33 public: |
31 virtual ~KernelProxy() {} | 34 virtual ~KernelProxy() {} |
32 | 35 |
33 // Obtain the singleton instance of the kernel proxy. If no instance | 36 // Obtain the singleton instance of the kernel proxy. If no instance |
34 // has been instantiated, one will be instantiated and returned. | 37 // has been instantiated, one will be instantiated and returned. |
35 static KernelProxy *KPInstance(); | 38 static KernelProxy *KPInstance(); |
39 #ifdef __GLIBC__ | |
40 // Set socket subsystem reference (not in constructor because it needs to be | |
41 // created separately and only if you need sockets in your app) | |
42 void SetSocketSubSystem(BaseSocketSubSystem* bss); | |
43 #endif | |
36 | 44 |
37 // System calls handled by KernelProxy (not mount-specific) | 45 // System calls handled by KernelProxy (not mount-specific) |
38 int chdir(const std::string& path); | 46 int chdir(const std::string& path); |
39 bool getcwd(std::string *buf, size_t size); | 47 bool getcwd(std::string *buf, size_t size); |
40 bool getwd(std::string *buf); | 48 bool getwd(std::string *buf); |
41 int dup(int oldfd); | 49 int dup(int oldfd); |
50 int dup2(int oldfd, int newfd); | |
42 | 51 |
43 // System calls that take a path as an argument: | 52 // System calls that take a path as an argument: |
44 // The kernel proxy will look for the Node associated to the path. To | 53 // The kernel proxy will look for the Node associated to the path. To |
45 // find the node, the kernel proxy calls the corresponding mounts GetNode() | 54 // find the node, the kernel proxy calls the corresponding mounts GetNode() |
46 // method. The corresponding method will be called. If the node | 55 // method. The corresponding method will be called. If the node |
47 // cannot be found, errno is set and -1 is returned. | 56 // cannot be found, errno is set and -1 is returned. |
48 int chmod(const std::string& path, mode_t mode); | 57 int chmod(const std::string& path, mode_t mode); |
49 int stat(const std::string& path, struct stat *buf); | 58 int stat(const std::string& path, struct stat *buf); |
50 int mkdir(const std::string& path, mode_t mode); | 59 int mkdir(const std::string& path, mode_t mode); |
51 int rmdir(const std::string& path); | 60 int rmdir(const std::string& path); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
102 int recv(int sockfd, void *buf, size_t len, int flags); | 111 int recv(int sockfd, void *buf, size_t len, int flags); |
103 int recvmsg(int sockfd, struct msghdr *msg, int flags); | 112 int recvmsg(int sockfd, struct msghdr *msg, int flags); |
104 int recvfrom(int sockfd, void *buf, size_t len, int flags, | 113 int recvfrom(int sockfd, void *buf, size_t len, int flags, |
105 struct sockaddr *dest_addr, socklen_t* addrlen); | 114 struct sockaddr *dest_addr, socklen_t* addrlen); |
106 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, | 115 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, |
107 const struct timeval *timeout); | 116 const struct timeval *timeout); |
108 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, | 117 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, |
109 const struct timeval *timeout, void* sigmask); | 118 const struct timeval *timeout, void* sigmask); |
110 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | 119 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
111 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | 120 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
121 struct hostent* gethostbyname(const char* name); | |
112 int getsockopt(int sockfd, int level, int optname, void *optval, | 122 int getsockopt(int sockfd, int level, int optname, void *optval, |
113 socklen_t* optlen); | 123 socklen_t* optlen); |
114 int setsockopt(int sockfd, int level, int optname, const void *optval, | 124 int setsockopt(int sockfd, int level, int optname, const void *optval, |
115 socklen_t optlen); | 125 socklen_t optlen); |
116 int shutdown(int sockfd, int how); | 126 int shutdown(int sockfd, int how); |
117 int epoll_create(int size); | 127 int epoll_create(int size); |
118 int epoll_create1(int flags); | 128 int epoll_create1(int flags); |
119 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); | 129 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); |
120 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, | 130 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, |
121 int timeout); | 131 int timeout); |
122 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, | 132 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, |
123 int timeout, const sigset_t *sigmask, size_t sigset_size); | 133 int timeout, const sigset_t *sigmask, size_t sigset_size); |
124 int socketpair(int domain, int type, int protocol, int sv[2]); | 134 int socketpair(int domain, int type, int protocol, int sv[2]); |
125 int poll(struct pollfd *fds, nfds_t nfds, int timeout); | 135 int poll(struct pollfd *fds, nfds_t nfds, int timeout); |
126 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, | 136 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, |
127 const sigset_t *sigmask, size_t sigset_size); | 137 const sigset_t *sigmask, size_t sigset_size); |
128 #endif | 138 #endif |
129 MountManager *mm() { return &mm_; } | 139 MountManager *mm() { return &mm_; } |
130 | 140 |
141 #ifdef __GLIBC__ | |
142 int AddFileStream(FileStream* stream); | |
143 void RemoveFileStream(int fd); | |
144 | |
145 int IsReady(int nfds, fd_set* fds, bool (FileStream::*is_ready)(), | |
146 bool apply); | |
147 Cond& select_cond() { return select_cond_; } | |
148 Mutex& select_mutex() { return select_mutex_; } | |
149 #endif // __GLIBC__ | |
131 private: | 150 private: |
132 struct FileDescriptor { | 151 struct FileDescriptor { |
133 // An index in open_files_ table | 152 // An index in open_files_ table |
134 int handle; | 153 int handle; |
135 }; | 154 }; |
136 | 155 |
156 // used for select() signals | |
157 Cond select_cond_; | |
Dmitry Polukhin
2012/05/30 15:13:32
It is not good to mix direct pthread work and usin
vissi
2012/05/31 13:35:21
Well, wrapper features (reentrancy) are used in th
| |
158 Mutex select_mutex_; | |
159 | |
137 struct FileHandle { | 160 struct FileHandle { |
138 Mount *mount; | 161 Mount *mount; |
162 #ifdef __GLIBC__ | |
163 FileStream* stream; | |
164 #endif | |
139 ino_t node; | 165 ino_t node; |
140 off_t offset; | 166 off_t offset; |
141 int flags; | 167 int flags; |
142 int use_count; | 168 int use_count; |
143 pthread_mutex_t lock; | 169 pthread_mutex_t lock; |
144 }; | 170 }; |
171 FileHandle* GetFileHandle(int fd); | |
145 | 172 |
173 #ifdef __GLIBC__ | |
174 BaseSocketSubSystem* socket_subsystem_; | |
175 #endif | |
146 Path cwd_; | 176 Path cwd_; |
147 int max_path_len_; | 177 int max_path_len_; |
148 MountManager mm_; | 178 MountManager mm_; |
149 pthread_mutex_t kp_lock_; | 179 pthread_mutex_t kp_lock_; |
150 static KernelProxy *kp_instance_; | 180 static KernelProxy *kp_instance_; |
151 | 181 |
152 SlotAllocator<FileDescriptor> fds_; | 182 SlotAllocator<FileDescriptor> fds_; |
153 SlotAllocator<FileHandle> open_files_; | 183 SlotAllocator<FileHandle> open_files_; |
154 | 184 |
155 FileHandle *GetFileHandle(int fd); | |
156 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode); | 185 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode); |
157 | 186 |
158 KernelProxy(); | 187 KernelProxy(); |
159 static void Instantiate(); | 188 static void Instantiate(); |
160 }; | 189 }; |
161 | 190 |
162 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ | 191 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ |
OLD | NEW |