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 <poll.h> | 11 #include <poll.h> |
12 #endif | 12 #endif |
13 #include <pthread.h> | 13 #include <pthread.h> |
14 #ifdef __GLIBC__ | 14 #ifdef __GLIBC__ |
15 #include <netdb.h> | |
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> |
20 #include "../base/FileHandle.h" | |
19 #include "../base/Mount.h" | 21 #include "../base/Mount.h" |
20 #include "../base/MountManager.h" | 22 #include "../base/MountManager.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 void SetSocketSubSystem(BaseSocketSubSystem* bss); | |
36 | 40 |
37 // System calls handled by KernelProxy (not mount-specific) | 41 // System calls handled by KernelProxy (not mount-specific) |
38 int chdir(const std::string& path); | 42 int chdir(const std::string& path); |
39 bool getcwd(std::string *buf, size_t size); | 43 bool getcwd(std::string *buf, size_t size); |
40 bool getwd(std::string *buf); | 44 bool getwd(std::string *buf); |
41 int dup(int oldfd); | 45 int dup(int oldfd); |
46 int dup2(int oldfd, int newfd); | |
42 | 47 |
43 // System calls that take a path as an argument: | 48 // System calls that take a path as an argument: |
44 // The kernel proxy will look for the Node associated to the path. To | 49 // 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() | 50 // find the node, the kernel proxy calls the corresponding mounts GetNode() |
46 // method. The corresponding method will be called. If the node | 51 // method. The corresponding method will be called. If the node |
47 // cannot be found, errno is set and -1 is returned. | 52 // cannot be found, errno is set and -1 is returned. |
48 int chmod(const std::string& path, mode_t mode); | 53 int chmod(const std::string& path, mode_t mode); |
49 int stat(const std::string& path, struct stat *buf); | 54 int stat(const std::string& path, struct stat *buf); |
50 int mkdir(const std::string& path, mode_t mode); | 55 int mkdir(const std::string& path, mode_t mode); |
51 int rmdir(const std::string& path); | 56 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); | 107 int recv(int sockfd, void *buf, size_t len, int flags); |
103 int recvmsg(int sockfd, struct msghdr *msg, int flags); | 108 int recvmsg(int sockfd, struct msghdr *msg, int flags); |
104 int recvfrom(int sockfd, void *buf, size_t len, int flags, | 109 int recvfrom(int sockfd, void *buf, size_t len, int flags, |
105 struct sockaddr *dest_addr, socklen_t* addrlen); | 110 struct sockaddr *dest_addr, socklen_t* addrlen); |
106 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, | 111 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, |
107 const struct timeval *timeout); | 112 const struct timeval *timeout); |
108 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, | 113 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, |
109 const struct timeval *timeout, void* sigmask); | 114 const struct timeval *timeout, void* sigmask); |
110 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | 115 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
111 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); | 116 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
117 struct hostent* gethostbyname(const char* name); | |
112 int getsockopt(int sockfd, int level, int optname, void *optval, | 118 int getsockopt(int sockfd, int level, int optname, void *optval, |
113 socklen_t* optlen); | 119 socklen_t* optlen); |
114 int setsockopt(int sockfd, int level, int optname, const void *optval, | 120 int setsockopt(int sockfd, int level, int optname, const void *optval, |
115 socklen_t optlen); | 121 socklen_t optlen); |
116 int shutdown(int sockfd, int how); | 122 int shutdown(int sockfd, int how); |
117 int epoll_create(int size); | 123 int epoll_create(int size); |
118 int epoll_create1(int flags); | 124 int epoll_create1(int flags); |
119 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); | 125 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, | 126 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, |
121 int timeout); | 127 int timeout); |
122 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, | 128 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, |
123 int timeout, const sigset_t *sigmask, size_t sigset_size); | 129 int timeout, const sigset_t *sigmask, size_t sigset_size); |
124 int socketpair(int domain, int type, int protocol, int sv[2]); | 130 int socketpair(int domain, int type, int protocol, int sv[2]); |
125 int poll(struct pollfd *fds, nfds_t nfds, int timeout); | 131 int poll(struct pollfd *fds, nfds_t nfds, int timeout); |
126 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, | 132 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, |
127 const sigset_t *sigmask, size_t sigset_size); | 133 const sigset_t *sigmask, size_t sigset_size); |
128 #endif | 134 #endif |
129 MountManager *mm() { return &mm_; } | 135 MountManager *mm() { return &mm_; } |
130 | 136 |
137 ino_t CreateSocket(); | |
138 int AddFileStream(FileStream* stream); | |
139 int AddFileStream(FileStream* stream, int fd); | |
140 FileHandle* GetFileHandle(int fd); | |
141 void RemoveFileStream(int fd); | |
142 | |
143 int IsReady(int nfds, fd_set* fds, bool (FileStream::*is_ready)(), | |
144 bool apply); | |
131 private: | 145 private: |
132 struct FileDescriptor { | 146 struct FileDescriptor { |
133 // An index in open_files_ table | 147 // An index in open_files_ table |
134 int handle; | 148 int handle; |
135 }; | 149 }; |
136 | 150 |
137 struct FileHandle { | 151 BaseSocketSubSystem* ss; |
Evgeniy Stepanov
2012/05/25 12:05:57
move this back into KernelProxy
vissi
2012/05/25 13:07:09
Done.
| |
138 Mount *mount; | |
139 ino_t node; | |
140 off_t offset; | |
141 int flags; | |
142 int use_count; | |
143 pthread_mutex_t lock; | |
144 }; | |
145 | |
146 Path cwd_; | 152 Path cwd_; |
147 int max_path_len_; | 153 int max_path_len_; |
148 MountManager mm_; | 154 MountManager mm_; |
149 pthread_mutex_t kp_lock_; | 155 pthread_mutex_t kp_lock_; |
150 static KernelProxy *kp_instance_; | 156 static KernelProxy *kp_instance_; |
151 | 157 |
152 SlotAllocator<FileDescriptor> fds_; | 158 SlotAllocator<FileDescriptor> fds_; |
153 SlotAllocator<FileHandle> open_files_; | 159 SlotAllocator<FileHandle> open_files_; |
154 | 160 |
155 FileHandle *GetFileHandle(int fd); | |
156 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode); | 161 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode); |
157 | 162 |
158 KernelProxy(); | 163 KernelProxy(); |
159 static void Instantiate(); | 164 static void Instantiate(); |
160 }; | 165 }; |
161 | 166 |
162 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ | 167 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ |
OLD | NEW |