Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(488)

Side by Side Diff: libraries/nacl-mounts/base/KernelProxy.h

Issue 10392070: Socket subsystem implementation (Closed) Base URL: http://naclports.googlecode.com/svn/trunk/src/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "../net/BaseSocketSubSystem.h"
21 #include "../util/Path.h" 23 #include "../util/Path.h"
22 #include "../util/SimpleAutoLock.h" 24 #include "../util/SimpleAutoLock.h"
23 #include "../util/SlotAllocator.h" 25 #include "../util/SlotAllocator.h"
24 26
25 // KernelProxy handles all of the system calls. System calls are either 27 // KernelProxy handles all of the system calls. System calls are either
26 // (1) handled entirely by the KernelProxy, (2) processed by the 28 // (1) handled entirely by the KernelProxy, (2) processed by the
27 // KernelProxy and then passed to a Mount, or (3) proccessed by the 29 // KernelProxy and then passed to a Mount, or (3) proccessed by the
28 // KernelProxy using other system calls implemented by the Mount. 30 // KernelProxy using other system calls implemented by the Mount.
29 class KernelProxy { 31 class KernelProxy {
30 public: 32 public:
31 virtual ~KernelProxy() {} 33 virtual ~KernelProxy() {}
32 34
33 // Obtain the singleton instance of the kernel proxy. If no instance 35 // Obtain the singleton instance of the kernel proxy. If no instance
34 // has been instantiated, one will be instantiated and returned. 36 // has been instantiated, one will be instantiated and returned.
35 static KernelProxy *KPInstance(); 37 static KernelProxy *KPInstance();
38 void SetSocketSubSystem(BaseSocketSubSystem* bss);
36 39
37 // System calls handled by KernelProxy (not mount-specific) 40 // System calls handled by KernelProxy (not mount-specific)
38 int chdir(const std::string& path); 41 int chdir(const std::string& path);
39 bool getcwd(std::string *buf, size_t size); 42 bool getcwd(std::string *buf, size_t size);
40 bool getwd(std::string *buf); 43 bool getwd(std::string *buf);
41 int dup(int oldfd); 44 int dup(int oldfd);
45 int dup2(int oldfd, int newfd);
42 46
43 // System calls that take a path as an argument: 47 // System calls that take a path as an argument:
44 // The kernel proxy will look for the Node associated to the path. To 48 // 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() 49 // find the node, the kernel proxy calls the corresponding mounts GetNode()
46 // method. The corresponding method will be called. If the node 50 // method. The corresponding method will be called. If the node
47 // cannot be found, errno is set and -1 is returned. 51 // cannot be found, errno is set and -1 is returned.
48 int chmod(const std::string& path, mode_t mode); 52 int chmod(const std::string& path, mode_t mode);
49 int stat(const std::string& path, struct stat *buf); 53 int stat(const std::string& path, struct stat *buf);
50 int mkdir(const std::string& path, mode_t mode); 54 int mkdir(const std::string& path, mode_t mode);
51 int rmdir(const std::string& path); 55 int rmdir(const std::string& path);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 int recv(int sockfd, void *buf, size_t len, int flags); 106 int recv(int sockfd, void *buf, size_t len, int flags);
103 int recvmsg(int sockfd, struct msghdr *msg, int flags); 107 int recvmsg(int sockfd, struct msghdr *msg, int flags);
104 int recvfrom(int sockfd, void *buf, size_t len, int flags, 108 int recvfrom(int sockfd, void *buf, size_t len, int flags,
105 struct sockaddr *dest_addr, socklen_t* addrlen); 109 struct sockaddr *dest_addr, socklen_t* addrlen);
106 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 110 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
107 const struct timeval *timeout); 111 const struct timeval *timeout);
108 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 112 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
109 const struct timeval *timeout, void* sigmask); 113 const struct timeval *timeout, void* sigmask);
110 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 114 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
111 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 115 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
116 struct hostent* gethostbyname(const char* name);
112 int getsockopt(int sockfd, int level, int optname, void *optval, 117 int getsockopt(int sockfd, int level, int optname, void *optval,
113 socklen_t* optlen); 118 socklen_t* optlen);
114 int setsockopt(int sockfd, int level, int optname, const void *optval, 119 int setsockopt(int sockfd, int level, int optname, const void *optval,
115 socklen_t optlen); 120 socklen_t optlen);
116 int shutdown(int sockfd, int how); 121 int shutdown(int sockfd, int how);
117 int epoll_create(int size); 122 int epoll_create(int size);
118 int epoll_create1(int flags); 123 int epoll_create1(int flags);
119 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 124 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, 125 int epoll_wait(int epfd, struct epoll_event *events, int maxevents,
121 int timeout); 126 int timeout);
122 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, 127 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents,
123 int timeout, const sigset_t *sigmask, size_t sigset_size); 128 int timeout, const sigset_t *sigmask, size_t sigset_size);
124 int socketpair(int domain, int type, int protocol, int sv[2]); 129 int socketpair(int domain, int type, int protocol, int sv[2]);
125 int poll(struct pollfd *fds, nfds_t nfds, int timeout); 130 int poll(struct pollfd *fds, nfds_t nfds, int timeout);
126 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, 131 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
127 const sigset_t *sigmask, size_t sigset_size); 132 const sigset_t *sigmask, size_t sigset_size);
128 #endif 133 #endif
129 MountManager *mm() { return &mm_; } 134 MountManager *mm() { return &mm_; }
130 135
136 int AddFileStream(FileStream* stream);
137 int AddFileStream(FileStream* stream, int fd);
138 void RemoveFileStream(int fd);
139
140 int IsReady(int nfds, fd_set* fds, bool (FileStream::*is_ready)(),
141 bool apply);
131 private: 142 private:
132 struct FileDescriptor { 143 struct FileDescriptor {
133 // An index in open_files_ table 144 // An index in open_files_ table
134 int handle; 145 int handle;
135 }; 146 };
136 147
137 struct FileHandle { 148 struct FileHandle {
138 Mount *mount; 149 Mount *mount;
150 FileStream* stream;
139 ino_t node; 151 ino_t node;
140 off_t offset; 152 off_t offset;
141 int flags; 153 int flags;
142 int use_count; 154 int use_count;
143 pthread_mutex_t lock; 155 pthread_mutex_t lock;
144 }; 156 };
157 FileHandle* GetFileHandle(int fd);
145 158
159 BaseSocketSubSystem* ss;
146 Path cwd_; 160 Path cwd_;
147 int max_path_len_; 161 int max_path_len_;
148 MountManager mm_; 162 MountManager mm_;
149 pthread_mutex_t kp_lock_; 163 pthread_mutex_t kp_lock_;
150 static KernelProxy *kp_instance_; 164 static KernelProxy *kp_instance_;
151 165
152 SlotAllocator<FileDescriptor> fds_; 166 SlotAllocator<FileDescriptor> fds_;
153 SlotAllocator<FileHandle> open_files_; 167 SlotAllocator<FileHandle> open_files_;
154 168
155 FileHandle *GetFileHandle(int fd);
156 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode); 169 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode);
157 170
158 KernelProxy(); 171 KernelProxy();
159 static void Instantiate(); 172 static void Instantiate();
160 }; 173 };
161 174
162 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ 175 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698