Chromium Code Reviews| Index: libraries/nacl-mounts/base/KernelProxy.h |
| =================================================================== |
| --- libraries/nacl-mounts/base/KernelProxy.h (revision 594) |
| +++ libraries/nacl-mounts/base/KernelProxy.h (working copy) |
| @@ -8,6 +8,7 @@ |
| #include <errno.h> |
| #ifdef __GLIBC__ |
| +#include <netdb.h> |
| #include <poll.h> |
| #endif |
| #include <pthread.h> |
| @@ -18,8 +19,9 @@ |
| #include <string> |
| #include "../base/Mount.h" |
| #include "../base/MountManager.h" |
| +#include "../net/BaseSocketSubSystem.h" |
| #include "../util/Path.h" |
| -#include "../util/SimpleAutoLock.h" |
| +#include "../util/PthreadHelpers.h" |
| #include "../util/SlotAllocator.h" |
| // KernelProxy handles all of the system calls. System calls are either |
| @@ -33,12 +35,18 @@ |
| // Obtain the singleton instance of the kernel proxy. If no instance |
| // has been instantiated, one will be instantiated and returned. |
| static KernelProxy *KPInstance(); |
| +#ifdef __GLIBC__ |
| + // Set socket subsystem reference (not in constructor because it needs to be |
| + // created separately and only if you need sockets in your app) |
| + void SetSocketSubSystem(BaseSocketSubSystem* bss); |
| +#endif |
| // System calls handled by KernelProxy (not mount-specific) |
| int chdir(const std::string& path); |
| bool getcwd(std::string *buf, size_t size); |
| bool getwd(std::string *buf); |
| int dup(int oldfd); |
| + int dup2(int oldfd, int newfd); |
| // System calls that take a path as an argument: |
| // The kernel proxy will look for the Node associated to the path. To |
| @@ -109,6 +117,13 @@ |
| const struct timeval *timeout, void* sigmask); |
| int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
| int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
| + struct hostent* gethostbyname(const char* name); |
| + int getaddrinfo(const char* hostname, const char* servname, |
| + const struct addrinfo* hints, struct addrinfo** res); |
| + void freeaddrinfo(struct addrinfo* ai); |
| + int getnameinfo(const struct sockaddr *sa, socklen_t salen, |
| + char *host, socklen_t hostlen, |
| + char *serv, socklen_t servlen, unsigned int flags); |
| int getsockopt(int sockfd, int level, int optname, void *optval, |
| socklen_t* optlen); |
| int setsockopt(int sockfd, int level, int optname, const void *optval, |
| @@ -128,21 +143,41 @@ |
| #endif |
| MountManager *mm() { return &mm_; } |
| +#ifdef __GLIBC__ |
| + int AddSocket(Socket* stream); |
| + void RemoveSocket(int fd); |
| + |
| + int IsReady(int nfds, fd_set* fds, bool (Socket::*is_ready)(), |
| + bool apply); |
| + Cond& select_cond() { return select_cond_; } |
| + Mutex& select_mutex() { return select_mutex_; } |
| +#endif // __GLIBC__ |
| private: |
| struct FileDescriptor { |
| // An index in open_files_ table |
| int handle; |
| }; |
| + // used for select() signals |
| + Cond select_cond_; |
| + Mutex select_mutex_; |
| + |
| struct FileHandle { |
| Mount *mount; |
| +#ifdef __GLIBC__ |
| + Socket* stream; |
|
Evgeniy Stepanov
2012/06/04 10:27:20
add a comment about types of handles (file/socket/
vissi
2012/06/04 12:43:37
Done.
Evgeniy Stepanov
2012/06/04 13:10:18
where?
vissi
2012/06/04 13:26:35
Forgot to include it, please, check now.
|
| +#endif |
| ino_t node; |
| off_t offset; |
| int flags; |
| int use_count; |
| pthread_mutex_t lock; |
| }; |
| + FileHandle* GetFileHandle(int fd); |
| +#ifdef __GLIBC__ |
| + BaseSocketSubSystem* socket_subsystem_; |
| +#endif |
| Path cwd_; |
| int max_path_len_; |
| MountManager mm_; |
| @@ -152,7 +187,6 @@ |
| SlotAllocator<FileDescriptor> fds_; |
| SlotAllocator<FileHandle> open_files_; |
| - FileHandle *GetFileHandle(int fd); |
| int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode); |
| KernelProxy(); |