| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/node.h" | 5 #include "nacl_io/node.h" |
| 6 | 6 |
| 7 #include <assert.h> | 7 #include <assert.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <fcntl.h> | 9 #include <fcntl.h> |
| 10 #include <poll.h> | 10 #include <poll.h> |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 stat_.st_mode = S_IRALL | S_IWALL; | 32 stat_.st_mode = S_IRALL | S_IWALL; |
| 33 | 33 |
| 34 // Filesystem should normally never be NULL, but may be null in tests. | 34 // Filesystem should normally never be NULL, but may be null in tests. |
| 35 // If NULL, at least set the inode to a valid (nonzero) value. | 35 // If NULL, at least set the inode to a valid (nonzero) value. |
| 36 if (filesystem_) | 36 if (filesystem_) |
| 37 filesystem_->OnNodeCreated(this); | 37 filesystem_->OnNodeCreated(this); |
| 38 else | 38 else |
| 39 stat_.st_ino = 1; | 39 stat_.st_ino = 1; |
| 40 } | 40 } |
| 41 | 41 |
| 42 Node::~Node() {} | 42 Node::~Node() { |
| 43 } |
| 43 | 44 |
| 44 Error Node::Init(int open_flags) { return 0; } | 45 Error Node::Init(int open_flags) { |
| 46 return 0; |
| 47 } |
| 45 | 48 |
| 46 void Node::Destroy() { | 49 void Node::Destroy() { |
| 47 if (filesystem_) { | 50 if (filesystem_) { |
| 48 filesystem_->OnNodeDestroyed(this); | 51 filesystem_->OnNodeDestroyed(this); |
| 49 } | 52 } |
| 50 } | 53 } |
| 51 | 54 |
| 52 EventEmitter* Node::GetEventEmitter() { return NULL; } | 55 EventEmitter* Node::GetEventEmitter() { |
| 56 return NULL; |
| 57 } |
| 53 | 58 |
| 54 uint32_t Node::GetEventStatus() { | 59 uint32_t Node::GetEventStatus() { |
| 55 if (GetEventEmitter()) | 60 if (GetEventEmitter()) |
| 56 return GetEventEmitter()->GetEventStatus(); | 61 return GetEventEmitter()->GetEventStatus(); |
| 57 | 62 |
| 58 return POLLIN | POLLOUT; | 63 return POLLIN | POLLOUT; |
| 59 } | 64 } |
| 60 | 65 |
| 61 bool Node::CanOpen(int open_flags) { | 66 bool Node::CanOpen(int open_flags) { |
| 62 switch (open_flags & 3) { | 67 switch (open_flags & 3) { |
| 63 case O_RDONLY: | 68 case O_RDONLY: |
| 64 return (stat_.st_mode & S_IRALL) != 0; | 69 return (stat_.st_mode & S_IRALL) != 0; |
| 65 case O_WRONLY: | 70 case O_WRONLY: |
| 66 return (stat_.st_mode & S_IWALL) != 0; | 71 return (stat_.st_mode & S_IWALL) != 0; |
| 67 case O_RDWR: | 72 case O_RDWR: |
| 68 return (stat_.st_mode & S_IRALL) != 0 && (stat_.st_mode & S_IWALL) != 0; | 73 return (stat_.st_mode & S_IRALL) != 0 && (stat_.st_mode & S_IWALL) != 0; |
| 69 } | 74 } |
| 70 | 75 |
| 71 return false; | 76 return false; |
| 72 } | 77 } |
| 73 | 78 |
| 74 Error Node::FSync() { return 0; } | 79 Error Node::FSync() { |
| 80 return 0; |
| 81 } |
| 75 | 82 |
| 76 Error Node::FTruncate(off_t length) { return EINVAL; } | 83 Error Node::FTruncate(off_t length) { |
| 84 return EINVAL; |
| 85 } |
| 77 | 86 |
| 78 Error Node::GetDents(size_t offs, | 87 Error Node::GetDents(size_t offs, |
| 79 struct dirent* pdir, | 88 struct dirent* pdir, |
| 80 size_t count, | 89 size_t count, |
| 81 int* out_bytes) { | 90 int* out_bytes) { |
| 82 *out_bytes = 0; | 91 *out_bytes = 0; |
| 83 return ENOTDIR; | 92 return ENOTDIR; |
| 84 } | 93 } |
| 85 | 94 |
| 86 Error Node::GetStat(struct stat* pstat) { | 95 Error Node::GetStat(struct stat* pstat) { |
| 87 AUTO_LOCK(node_lock_); | 96 AUTO_LOCK(node_lock_); |
| 88 memcpy(pstat, &stat_, sizeof(stat_)); | 97 memcpy(pstat, &stat_, sizeof(stat_)); |
| 89 return 0; | 98 return 0; |
| 90 } | 99 } |
| 91 | 100 |
| 92 Error Node::Ioctl(int request, ...) { | 101 Error Node::Ioctl(int request, ...) { |
| 93 va_list ap; | 102 va_list ap; |
| 94 va_start(ap, request); | 103 va_start(ap, request); |
| 95 Error rtn = VIoctl(request, ap); | 104 Error rtn = VIoctl(request, ap); |
| 96 va_end(ap); | 105 va_end(ap); |
| 97 return rtn; | 106 return rtn; |
| 98 } | 107 } |
| 99 | 108 |
| 100 Error Node::VIoctl(int request, va_list args) { return EINVAL; } | 109 Error Node::VIoctl(int request, va_list args) { |
| 110 return EINVAL; |
| 111 } |
| 101 | 112 |
| 102 Error Node::Read(const HandleAttr& attr, | 113 Error Node::Read(const HandleAttr& attr, |
| 103 void* buf, | 114 void* buf, |
| 104 size_t count, | 115 size_t count, |
| 105 int* out_bytes) { | 116 int* out_bytes) { |
| 106 *out_bytes = 0; | 117 *out_bytes = 0; |
| 107 return EINVAL; | 118 return EINVAL; |
| 108 } | 119 } |
| 109 | 120 |
| 110 Error Node::Write(const HandleAttr& attr, | 121 Error Node::Write(const HandleAttr& attr, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 Error read_error = Read(data, new_addr, length, &bytes_read); | 157 Error read_error = Read(data, new_addr, length, &bytes_read); |
| 147 if (read_error) { | 158 if (read_error) { |
| 148 _real_munmap(new_addr, length); | 159 _real_munmap(new_addr, length); |
| 149 return read_error; | 160 return read_error; |
| 150 } | 161 } |
| 151 | 162 |
| 152 *out_addr = new_addr; | 163 *out_addr = new_addr; |
| 153 return 0; | 164 return 0; |
| 154 } | 165 } |
| 155 | 166 |
| 156 Error Node::Tcflush(int queue_selector) { return EINVAL; } | 167 Error Node::Tcflush(int queue_selector) { |
| 168 return EINVAL; |
| 169 } |
| 157 | 170 |
| 158 Error Node::Tcgetattr(struct termios* termios_p) { return EINVAL; } | 171 Error Node::Tcgetattr(struct termios* termios_p) { |
| 172 return EINVAL; |
| 173 } |
| 159 | 174 |
| 160 Error Node::Tcsetattr(int optional_actions, const struct termios* termios_p) { | 175 Error Node::Tcsetattr(int optional_actions, const struct termios* termios_p) { |
| 161 return EINVAL; | 176 return EINVAL; |
| 162 } | 177 } |
| 163 | 178 |
| 164 int Node::GetLinks() { return stat_.st_nlink; } | 179 int Node::GetLinks() { |
| 180 return stat_.st_nlink; |
| 181 } |
| 165 | 182 |
| 166 int Node::GetMode() { return stat_.st_mode & ~S_IFMT; } | 183 int Node::GetMode() { |
| 184 return stat_.st_mode & ~S_IFMT; |
| 185 } |
| 167 | 186 |
| 168 Error Node::GetSize(off_t* out_size) { | 187 Error Node::GetSize(off_t* out_size) { |
| 169 *out_size = stat_.st_size; | 188 *out_size = stat_.st_size; |
| 170 return 0; | 189 return 0; |
| 171 } | 190 } |
| 172 | 191 |
| 173 int Node::GetType() { return stat_.st_mode & S_IFMT; } | 192 int Node::GetType() { |
| 193 return stat_.st_mode & S_IFMT; |
| 194 } |
| 174 | 195 |
| 175 void Node::SetType(int type) { | 196 void Node::SetType(int type) { |
| 176 assert((type & ~S_IFMT) == 0); | 197 assert((type & ~S_IFMT) == 0); |
| 177 stat_.st_mode &= ~S_IFMT; | 198 stat_.st_mode &= ~S_IFMT; |
| 178 stat_.st_mode |= type; | 199 stat_.st_mode |= type; |
| 179 } | 200 } |
| 180 | 201 |
| 181 bool Node::IsaDir() { return (stat_.st_mode & S_IFDIR) != 0; } | 202 bool Node::IsaDir() { |
| 203 return (stat_.st_mode & S_IFDIR) != 0; |
| 204 } |
| 182 | 205 |
| 183 bool Node::IsaFile() { return (stat_.st_mode & S_IFREG) != 0; } | 206 bool Node::IsaFile() { |
| 207 return (stat_.st_mode & S_IFREG) != 0; |
| 208 } |
| 184 | 209 |
| 185 bool Node::IsaSock() { return (stat_.st_mode & S_IFSOCK) != 0; } | 210 bool Node::IsaSock() { |
| 211 return (stat_.st_mode & S_IFSOCK) != 0; |
| 212 } |
| 186 | 213 |
| 187 Error Node::Isatty() { | 214 Error Node::Isatty() { |
| 188 return ENOTTY; | 215 return ENOTTY; |
| 189 } | 216 } |
| 190 | 217 |
| 191 Error Node::AddChild(const std::string& name, const ScopedNode& node) { | 218 Error Node::AddChild(const std::string& name, const ScopedNode& node) { |
| 192 return ENOTDIR; | 219 return ENOTDIR; |
| 193 } | 220 } |
| 194 | 221 |
| 195 Error Node::RemoveChild(const std::string& name) { return ENOTDIR; } | 222 Error Node::RemoveChild(const std::string& name) { |
| 223 return ENOTDIR; |
| 224 } |
| 196 | 225 |
| 197 Error Node::FindChild(const std::string& name, ScopedNode* out_node) { | 226 Error Node::FindChild(const std::string& name, ScopedNode* out_node) { |
| 198 out_node->reset(NULL); | 227 out_node->reset(NULL); |
| 199 return ENOTDIR; | 228 return ENOTDIR; |
| 200 } | 229 } |
| 201 | 230 |
| 202 int Node::ChildCount() { return 0; } | 231 int Node::ChildCount() { |
| 232 return 0; |
| 233 } |
| 203 | 234 |
| 204 void Node::Link() { stat_.st_nlink++; } | 235 void Node::Link() { |
| 236 stat_.st_nlink++; |
| 237 } |
| 205 | 238 |
| 206 void Node::Unlink() { stat_.st_nlink--; } | 239 void Node::Unlink() { |
| 240 stat_.st_nlink--; |
| 241 } |
| 207 | 242 |
| 208 } // namespace nacl_io | 243 } // namespace nacl_io |
| OLD | NEW |