| OLD | NEW |
| 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_mem.h" | 5 #include "nacl_io/mount_mem.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 MountNode* node = FindNode(path); | 108 MountNode* node = FindNode(path); |
| 109 | 109 |
| 110 if (NULL == node) { | 110 if (NULL == node) { |
| 111 // Now first find the parent directory to see if we can add it | 111 // Now first find the parent directory to see if we can add it |
| 112 MountNode* parent = FindNode(path.Parent(), S_IFDIR); | 112 MountNode* parent = FindNode(path.Parent(), S_IFDIR); |
| 113 if (NULL == parent) return NULL; | 113 if (NULL == parent) return NULL; |
| 114 | 114 |
| 115 // If the node does not exist and we can't create it, fail | 115 // If the node does not exist and we can't create it, fail |
| 116 if ((mode & O_CREAT) == 0) return NULL; | 116 if ((mode & O_CREAT) == 0) return NULL; |
| 117 | 117 |
| 118 // Otherwise, create it with a single refernece | 118 // Otherwise, create it with a single reference |
| 119 mode = OpenModeToPermission(mode); | 119 mode = OpenModeToPermission(mode); |
| 120 node = AllocateData(mode); | 120 node = AllocateData(mode); |
| 121 if (NULL == node) return NULL; | 121 if (NULL == node) return NULL; |
| 122 | 122 |
| 123 if (parent->AddChild(path.Basename(), node) == -1) { | 123 if (parent->AddChild(path.Basename(), node) == -1) { |
| 124 // Or if it fails, release it | 124 // Or if it fails, release it |
| 125 node->Release(); | 125 node->Release(); |
| 126 return NULL; | 126 return NULL; |
| 127 } | 127 } |
| 128 return node; | 128 return node; |
| 129 } | 129 } |
| 130 | 130 |
| 131 // If we were expected to create it exclusively, fail | 131 // If we were expected to create it exclusively, fail |
| 132 if (mode & O_EXCL) { | 132 if (mode & O_EXCL) { |
| 133 errno = EEXIST; | 133 errno = EEXIST; |
| 134 return NULL; | 134 return NULL; |
| 135 } | 135 } |
| 136 | 136 |
| 137 // Verify we got the requested permisions. | 137 // Verify we got the requested permissions. |
| 138 int req_mode = OpenModeToPermission(mode); | 138 int req_mode = OpenModeToPermission(mode); |
| 139 int obj_mode = node->GetMode() & OpenModeToPermission(O_RDWR); | 139 int obj_mode = node->GetMode() & OpenModeToPermission(O_RDWR); |
| 140 if ((obj_mode & req_mode) != req_mode) { | 140 if ((obj_mode & req_mode) != req_mode) { |
| 141 errno = EACCES; | 141 errno = EACCES; |
| 142 return NULL; | 142 return NULL; |
| 143 } | 143 } |
| 144 | 144 |
| 145 // We opened it, so ref count it before passing it back. | 145 // We opened it, so ref count it before passing it back. |
| 146 node->Acquire(); | 146 node->Acquire(); |
| 147 return node; | 147 return node; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 if (file_only && child->IsaDir()) { | 242 if (file_only && child->IsaDir()) { |
| 243 errno = EISDIR; | 243 errno = EISDIR; |
| 244 return -1; | 244 return -1; |
| 245 } | 245 } |
| 246 if (remove_dir && child->ChildCount() > 0) { | 246 if (remove_dir && child->ChildCount() > 0) { |
| 247 errno = ENOTEMPTY; | 247 errno = ENOTEMPTY; |
| 248 return -1; | 248 return -1; |
| 249 } | 249 } |
| 250 return parent->RemoveChild(path.Basename()); | 250 return parent->RemoveChild(path.Basename()); |
| 251 } | 251 } |
| OLD | NEW |