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

Side by Side Diff: native_client_sdk/src/libraries/nacl_io/mount_passthrough.cc

Issue 16232016: [NaCl SDK] nacl_io: big refactor to return error value (errno). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge master, fix windows Created 7 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 /* Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be 2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file. 3 * found in the LICENSE file.
4 */ 4 */
5 #include "nacl_io/mount_passthrough.h" 5 #include "nacl_io/mount_passthrough.h"
6 #include <errno.h> 6 #include <errno.h>
7 #include "nacl_io/kernel_wrap_real.h" 7 #include "nacl_io/kernel_wrap_real.h"
8 8
9 class MountNodePassthrough : public MountNode { 9 class MountNodePassthrough : public MountNode {
10 public: 10 public:
11 explicit MountNodePassthrough(Mount* mount, int real_fd) 11 explicit MountNodePassthrough(Mount* mount, int real_fd)
12 : MountNode(mount), 12 : MountNode(mount), real_fd_(real_fd) {}
13 real_fd_(real_fd) {
14 }
15 13
16 protected: 14 protected:
17 virtual bool Init(int flags) { 15 virtual Error Init(int flags) { return 0; }
18 return true;
19 }
20 16
21 virtual void Destroy() { 17 virtual void Destroy() {
22 if (real_fd_) 18 if (real_fd_)
23 _real_close(real_fd_); 19 _real_close(real_fd_);
24 real_fd_ = 0; 20 real_fd_ = 0;
25 } 21 }
26 22
27 public: 23 public:
28 // Normal read/write operations on a file 24 // Normal read/write operations on a file
29 virtual int Read(size_t offs, void* buf, size_t count) { 25 virtual Error Read(size_t offs, void* buf, size_t count, int* out_bytes) {
26 *out_bytes = 0;
27
30 off_t new_offset; 28 off_t new_offset;
31 int err = _real_lseek(real_fd_, offs, 0, &new_offset); 29 int err = _real_lseek(real_fd_, offs, 0, &new_offset);
32 if (err) { 30 if (err)
33 errno = err; 31 return err;
34 return -1;
35 }
36 32
37 size_t nread; 33 size_t nread;
38 err = _real_read(real_fd_, buf, count, &nread); 34 err = _real_read(real_fd_, buf, count, &nread);
39 if (err) { 35 if (err)
40 errno = err; 36 return err;
41 return -1;
42 }
43 37
44 return static_cast<int>(nread); 38 *out_bytes = static_cast<int>(nread);
39 return 0;
45 } 40 }
46 41
47 virtual int Write(size_t offs, const void* buf, size_t count) { 42 virtual Error Write(size_t offs,
43 const void* buf,
44 size_t count,
45 int* out_bytes) {
46 *out_bytes = 0;
47
48 off_t new_offset; 48 off_t new_offset;
49 int err = _real_lseek(real_fd_, offs, 0, &new_offset); 49 int err = _real_lseek(real_fd_, offs, 0, &new_offset);
50 if (err) { 50 if (err)
51 errno = err; 51 return err;
52 return -1;
53 }
54 52
55 size_t nwrote; 53 size_t nwrote;
56 err = _real_write(real_fd_, buf, count, &nwrote); 54 err = _real_write(real_fd_, buf, count, &nwrote);
57 if (err) { 55 if (err)
58 errno = err; 56 return err;
59 return -1;
60 }
61 57
62 return static_cast<int>(nwrote); 58 *out_bytes = static_cast<int>(nwrote);
59 return 0;
63 } 60 }
64 61
65 virtual int FTruncate(off_t size) { 62 virtual Error FTruncate(off_t size) {
66 // TODO(binji): what to do here? 63 // TODO(binji): what to do here?
67 return -1; 64 return ENOSYS;
68 } 65 }
69 66
70 virtual int GetDents(size_t offs, struct dirent* pdir, size_t count) { 67 virtual Error GetDents(size_t offs, struct dirent* pdir, size_t count) {
71 size_t nread; 68 size_t nread;
72 int err = _real_getdents(real_fd_, pdir, count, &nread); 69 int err = _real_getdents(real_fd_, pdir, count, &nread);
73 if (err) { 70 if (err)
74 errno = err; 71 return err;
75 return -1;
76 }
77
78 return nread; 72 return nread;
79 } 73 }
80 74
81 virtual int GetStat(struct stat* stat) { 75 virtual Error GetStat(struct stat* stat) {
82 int err = _real_fstat(real_fd_, stat); 76 int err = _real_fstat(real_fd_, stat);
83 if (err) { 77 if (err)
84 errno = err; 78 return err;
85 return -1;
86 }
87
88 return 0; 79 return 0;
89 } 80 }
90 81
91 void* MMap(void* addr, size_t length, int prot, int flags, size_t offset) { 82 Error MMap(void* addr,
92 void* new_addr = addr; 83 size_t length,
93 int err = _real_mmap(&new_addr, length, prot, flags, real_fd_, offset); 84 int prot,
94 if (err) { 85 int flags,
95 errno = err; 86 size_t offset,
96 return (void*)-1; 87 void** out_addr) {
97 } 88 *out_addr = addr;
98 89 int err = _real_mmap(out_addr, length, prot, flags, real_fd_, offset);
99 return new_addr; 90 if (err)
91 return err;
92 return 0;
100 } 93 }
101 94
102 private: 95 private:
103 friend class MountPassthrough; 96 friend class MountPassthrough;
104 97
105 int real_fd_; 98 int real_fd_;
106 }; 99 };
107 100
108 MountPassthrough::MountPassthrough() { 101 MountPassthrough::MountPassthrough() {}
102
103 Error MountPassthrough::Init(int dev,
104 StringMap_t& args,
105 PepperInterface* ppapi) {
106 return Mount::Init(dev, args, ppapi);
109 } 107 }
110 108
111 bool MountPassthrough::Init(int dev, StringMap_t& args, 109 void MountPassthrough::Destroy() {}
112 PepperInterface* ppapi) {
113 Mount::Init(dev, args, ppapi);
114 return true;
115 }
116 110
117 void MountPassthrough::Destroy() { 111 Error MountPassthrough::Open(const Path& path, int mode, MountNode** out_node) {
118 } 112 *out_node = NULL;
119 113
120 MountNode *MountPassthrough::Open(const Path& path, int mode) {
121 int real_fd; 114 int real_fd;
122 int err = _real_open(path.Join().c_str(), mode, 0666, &real_fd); 115 int error = _real_open(path.Join().c_str(), mode, 0666, &real_fd);
123 if (err) { 116 if (error)
124 errno = err; 117 return error;
125 return NULL;
126 }
127 118
128 MountNodePassthrough* node = new MountNodePassthrough(this, real_fd); 119 MountNodePassthrough* node = new MountNodePassthrough(this, real_fd);
129 return node; 120 *out_node = node;
130 }
131
132 MountNode *MountPassthrough::OpenResource(const Path& path) {
133 int real_fd;
134 int err = _real_open_resource(path.Join().c_str(), &real_fd);
135 if (err) {
136 errno = err;
137 return NULL;
138 }
139
140 MountNodePassthrough* node = new MountNodePassthrough(this, real_fd);
141 return node;
142 }
143
144 int MountPassthrough::Unlink(const Path& path) {
145 // Not implemented by NaCl.
146 errno = ENOSYS;
147 return -1;
148 }
149
150 int MountPassthrough::Mkdir(const Path& path, int perm) {
151 int err = _real_mkdir(path.Join().c_str(), perm);
152 if (err) {
153 errno = err;
154 return -1;
155 }
156
157 return 0; 121 return 0;
158 } 122 }
159 123
160 int MountPassthrough::Rmdir(const Path& path) { 124 Error MountPassthrough::OpenResource(const Path& path, MountNode** out_node) {
161 int err = _real_rmdir(path.Join().c_str()); 125 *out_node = NULL;
162 if (err) {
163 errno = err;
164 return -1;
165 }
166 126
127 int real_fd;
128 int error = _real_open_resource(path.Join().c_str(), &real_fd);
129 if (error)
130 return error;
131
132 MountNodePassthrough* node = new MountNodePassthrough(this, real_fd);
133 *out_node = node;
167 return 0; 134 return 0;
168 } 135 }
169 136
170 int MountPassthrough::Remove(const Path& path) { 137 Error MountPassthrough::Unlink(const Path& path) {
171 // Not implemented by NaCl. 138 // Not implemented by NaCl.
172 errno = ENOSYS; 139 return ENOSYS;
173 return -1;
174 } 140 }
141
142 Error MountPassthrough::Mkdir(const Path& path, int perm) {
143 return _real_mkdir(path.Join().c_str(), perm);
144 }
145
146 Error MountPassthrough::Rmdir(const Path& path) {
147 return _real_rmdir(path.Join().c_str());
148 }
149
150 Error MountPassthrough::Remove(const Path& path) {
151 // Not implemented by NaCl.
152 return ENOSYS;
153 }
OLDNEW
« no previous file with comments | « native_client_sdk/src/libraries/nacl_io/mount_passthrough.h ('k') | native_client_sdk/src/libraries/nacl_io_test/example.dsc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698