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

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, 6 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 <poll.h> 11 #include <netdb.h>
12 #else
13 #include <nacl-mounts/net/newlib_compat.h>
12 #endif 14 #endif
13 #include <pthread.h> 15 #include <pthread.h>
14 #ifdef __GLIBC__
15 #include <sys/epoll.h>
16 #endif
17 #include <sys/stat.h> 16 #include <sys/stat.h>
18 #include <string> 17 #include <string>
19 #include "../base/Mount.h" 18 #include <nacl-mounts/base/Mount.h>
20 #include "../base/MountManager.h" 19 #include <nacl-mounts/base/MountManager.h>
21 #include "../util/Path.h" 20 #include <nacl-mounts/net/BaseSocketSubSystem.h>
22 #include "../util/SimpleAutoLock.h" 21 #include <nacl-mounts/util/Path.h>
23 #include "../util/SlotAllocator.h" 22 #include <nacl-mounts/util/PthreadHelpers.h>
23 #include <nacl-mounts/util/SlotAllocator.h>
24 24
25 // KernelProxy handles all of the system calls. System calls are either 25 // KernelProxy handles all of the system calls. System calls are either
26 // (1) handled entirely by the KernelProxy, (2) processed by the 26 // (1) handled entirely by the KernelProxy, (2) processed by the
27 // KernelProxy and then passed to a Mount, or (3) proccessed by the 27 // KernelProxy and then passed to a Mount, or (3) proccessed by the
28 // KernelProxy using other system calls implemented by the Mount. 28 // KernelProxy using other system calls implemented by the Mount.
29 class KernelProxy { 29 class KernelProxy {
30 public: 30 public:
31 virtual ~KernelProxy() {} 31 virtual ~KernelProxy() {}
32 32
33 // Obtain the singleton instance of the kernel proxy. If no instance 33 // Obtain the singleton instance of the kernel proxy. If no instance
34 // has been instantiated, one will be instantiated and returned. 34 // has been instantiated, one will be instantiated and returned.
35 static KernelProxy *KPInstance(); 35 static KernelProxy *KPInstance();
36 // Set socket subsystem reference (not in constructor because it needs to be
37 // created separately and only if you need sockets in your app)
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 29 matching lines...) Expand all
81 int unlink(const std::string& path); 85 int unlink(const std::string& path);
82 // access() uses the Mount's Stat(). 86 // access() uses the Mount's Stat().
83 int access(const std::string& path, int amode); 87 int access(const std::string& path, int amode);
84 88
85 // TODO(arbenson): implement the following system calls 89 // TODO(arbenson): implement the following system calls
86 int ioctl(int fd, unsigned long request); 90 int ioctl(int fd, unsigned long request);
87 int link(const std::string& path1, const std::string& path2); 91 int link(const std::string& path1, const std::string& path2);
88 int symlink(const std::string& path1, const std::string& path2); 92 int symlink(const std::string& path1, const std::string& path2);
89 int kill(pid_t pid, int sig); 93 int kill(pid_t pid, int sig);
90 94
91 #ifdef __GLIBC__
92 // TODO(vissi): implement the following system calls 95 // TODO(vissi): implement the following system calls
93 int socket(int domain, int type, int protocol); 96 int socket(int domain, int type, int protocol);
94 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 97 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
95 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 98 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
96 int listen(int sockfd, int backlog); 99 int listen(int sockfd, int backlog);
97 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 100 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
98 int send(int sockfd, const void *buf, size_t len, int flags); 101 int send(int sockfd, const void *buf, size_t len, int flags);
99 int sendmsg(int sockfd, const struct msghdr *msg, int flags); 102 int sendmsg(int sockfd, const struct msghdr *msg, int flags);
100 int sendto(int sockfd, const void *buf, size_t len, int flags, 103 int sendto(int sockfd, const void *buf, size_t len, int flags,
101 const struct sockaddr *dest_addr, socklen_t addrlen); 104 const struct sockaddr *dest_addr, socklen_t addrlen);
102 int recv(int sockfd, void *buf, size_t len, int flags); 105 int recv(int sockfd, void *buf, size_t len, int flags);
103 int recvmsg(int sockfd, struct msghdr *msg, int flags); 106 int recvmsg(int sockfd, struct msghdr *msg, int flags);
104 int recvfrom(int sockfd, void *buf, size_t len, int flags, 107 int recvfrom(int sockfd, void *buf, size_t len, int flags,
105 struct sockaddr *dest_addr, socklen_t* addrlen); 108 struct sockaddr *dest_addr, socklen_t* addrlen);
106 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 109 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
107 const struct timeval *timeout); 110 const struct timeval *timeout);
108 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 111 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
109 const struct timeval *timeout, void* sigmask); 112 const struct timeval *timeout, void* sigmask);
110 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 113 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
111 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 114 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
115 struct hostent* gethostbyname(const char* name);
116 int getaddrinfo(const char* hostname, const char* servname,
117 const struct addrinfo* hints, struct addrinfo** res);
118 void freeaddrinfo(struct addrinfo* ai);
119 int getnameinfo(const struct sockaddr *sa, socklen_t salen,
120 char *host, socklen_t hostlen,
121 char *serv, socklen_t servlen, unsigned int flags);
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);
118 int epoll_create1(int flags);
119 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,
121 int timeout);
122 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents,
123 int timeout, const sigset_t *sigmask, size_t sigset_size);
124 int socketpair(int domain, int type, int protocol, int sv[2]); 127 int socketpair(int domain, int type, int protocol, int sv[2]);
125 int poll(struct pollfd *fds, nfds_t nfds, int timeout);
126 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
127 const sigset_t *sigmask, size_t sigset_size);
128 #endif
129 MountManager *mm() { return &mm_; } 128 MountManager *mm() { return &mm_; }
130 129
130 int AddSocket(Socket* stream);
131 void RemoveSocket(int fd);
132
133 int IsReady(int nfds, fd_set* fds, bool (Socket::*is_ready)(),
134 bool apply);
135 Cond& select_cond() { return select_cond_; }
136 Mutex& select_mutex() { return select_mutex_; }
131 private: 137 private:
132 struct FileDescriptor { 138 struct FileDescriptor {
133 // An index in open_files_ table 139 // An index in open_files_ table
134 int handle; 140 int handle;
135 }; 141 };
136 142
143 // used for select() signals
144 Cond select_cond_;
145 Mutex select_mutex_;
146
147 // if mount == NULL, it's a socket, stream == NULL is a consistent state
148 // for socket that was just opened
137 struct FileHandle { 149 struct FileHandle {
138 Mount *mount; 150 Mount *mount;
151 Socket* stream;
139 ino_t node; 152 ino_t node;
140 off_t offset; 153 off_t offset;
141 int flags; 154 int flags;
142 int use_count; 155 int use_count;
143 pthread_mutex_t lock; 156 pthread_mutex_t lock;
144 }; 157 };
158 FileHandle* GetFileHandle(int fd);
145 159
160 BaseSocketSubSystem* socket_subsystem_;
146 Path cwd_; 161 Path cwd_;
147 int max_path_len_; 162 int max_path_len_;
148 MountManager mm_; 163 MountManager mm_;
149 pthread_mutex_t kp_lock_; 164 pthread_mutex_t kp_lock_;
150 static KernelProxy *kp_instance_; 165 static KernelProxy *kp_instance_;
151 166
152 SlotAllocator<FileDescriptor> fds_; 167 SlotAllocator<FileDescriptor> fds_;
153 SlotAllocator<FileHandle> open_files_; 168 SlotAllocator<FileHandle> open_files_;
154 169
155 FileHandle *GetFileHandle(int fd);
156 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode); 170 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode);
157 171
158 KernelProxy(); 172 KernelProxy();
159 static void Instantiate(); 173 static void Instantiate();
160 }; 174 };
161 175
162 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ 176 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698