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/dir_node.h" | 5 #include "nacl_io/dir_node.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <string.h> | 8 #include <string.h> |
9 | 9 |
| 10 #include "nacl_io/log.h" |
10 #include "nacl_io/osdirent.h" | 11 #include "nacl_io/osdirent.h" |
| 12 #include "nacl_io/osinttypes.h" |
11 #include "nacl_io/osstat.h" | 13 #include "nacl_io/osstat.h" |
12 #include "sdk_util/auto_lock.h" | 14 #include "sdk_util/auto_lock.h" |
13 #include "sdk_util/macros.h" | 15 #include "sdk_util/macros.h" |
14 | 16 |
15 namespace nacl_io { | 17 namespace nacl_io { |
16 | 18 |
17 namespace { | 19 namespace { |
18 | 20 |
19 // TODO(binji): For now, just use a dummy value for the parent ino. | 21 // TODO(binji): For now, just use a dummy value for the parent ino. |
20 const ino_t kParentDirIno = -1; | 22 const ino_t kParentDirIno = -1; |
(...skipping 12 matching lines...) Expand all Loading... |
33 for (NodeMap_t::iterator it = map_.begin(); it != map_.end(); ++it) { | 35 for (NodeMap_t::iterator it = map_.begin(); it != map_.end(); ++it) { |
34 it->second->Unlink(); | 36 it->second->Unlink(); |
35 } | 37 } |
36 } | 38 } |
37 | 39 |
38 Error DirNode::Read(const HandleAttr& attr, | 40 Error DirNode::Read(const HandleAttr& attr, |
39 void* buf, | 41 void* buf, |
40 size_t count, | 42 size_t count, |
41 int* out_bytes) { | 43 int* out_bytes) { |
42 *out_bytes = 0; | 44 *out_bytes = 0; |
| 45 LOG_TRACE("Can't read a directory."); |
43 return EISDIR; | 46 return EISDIR; |
44 } | 47 } |
45 | 48 |
46 Error DirNode::FTruncate(off_t size) { | 49 Error DirNode::FTruncate(off_t size) { |
| 50 LOG_TRACE("Can't truncate a directory."); |
47 return EISDIR; | 51 return EISDIR; |
48 } | 52 } |
49 | 53 |
50 Error DirNode::Write(const HandleAttr& attr, | 54 Error DirNode::Write(const HandleAttr& attr, |
51 const void* buf, | 55 const void* buf, |
52 size_t count, | 56 size_t count, |
53 int* out_bytes) { | 57 int* out_bytes) { |
54 *out_bytes = 0; | 58 *out_bytes = 0; |
| 59 LOG_TRACE("Can't write to a directory."); |
55 return EISDIR; | 60 return EISDIR; |
56 } | 61 } |
57 | 62 |
58 Error DirNode::GetDents(size_t offs, | 63 Error DirNode::GetDents(size_t offs, |
59 dirent* pdir, | 64 dirent* pdir, |
60 size_t size, | 65 size_t size, |
61 int* out_bytes) { | 66 int* out_bytes) { |
62 AUTO_LOCK(node_lock_); | 67 AUTO_LOCK(node_lock_); |
63 BuildCache_Locked(); | 68 BuildCache_Locked(); |
64 return cache_.GetDents(offs, pdir, size, out_bytes); | 69 return cache_.GetDents(offs, pdir, size, out_bytes); |
65 } | 70 } |
66 | 71 |
67 Error DirNode::AddChild(const std::string& name, const ScopedNode& node) { | 72 Error DirNode::AddChild(const std::string& name, const ScopedNode& node) { |
68 AUTO_LOCK(node_lock_); | 73 AUTO_LOCK(node_lock_); |
69 | 74 |
70 if (name.empty()) | 75 if (name.empty()) { |
| 76 LOG_ERROR("Can't add child with no name."); |
71 return ENOENT; | 77 return ENOENT; |
| 78 } |
72 | 79 |
73 if (name.length() >= MEMBER_SIZE(dirent, d_name)) | 80 if (name.length() >= MEMBER_SIZE(dirent, d_name)) { |
| 81 LOG_ERROR("Child name is too long: %" PRIuS " >= %" PRIuS, |
| 82 name.length(), |
| 83 MEMBER_SIZE(dirent, d_name)); |
74 return ENAMETOOLONG; | 84 return ENAMETOOLONG; |
| 85 } |
75 | 86 |
76 NodeMap_t::iterator it = map_.find(name); | 87 NodeMap_t::iterator it = map_.find(name); |
77 if (it != map_.end()) | 88 if (it != map_.end()) { |
| 89 LOG_TRACE("Can't add child \"%s\", it already exists.", name); |
78 return EEXIST; | 90 return EEXIST; |
| 91 } |
79 | 92 |
80 node->Link(); | 93 node->Link(); |
81 map_[name] = node; | 94 map_[name] = node; |
82 ClearCache_Locked(); | 95 ClearCache_Locked(); |
83 return 0; | 96 return 0; |
84 } | 97 } |
85 | 98 |
86 Error DirNode::RemoveChild(const std::string& name) { | 99 Error DirNode::RemoveChild(const std::string& name) { |
87 AUTO_LOCK(node_lock_); | 100 AUTO_LOCK(node_lock_); |
88 NodeMap_t::iterator it = map_.find(name); | 101 NodeMap_t::iterator it = map_.find(name); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 | 138 |
126 cache_built_ = true; | 139 cache_built_ = true; |
127 } | 140 } |
128 | 141 |
129 void DirNode::ClearCache_Locked() { | 142 void DirNode::ClearCache_Locked() { |
130 cache_built_ = false; | 143 cache_built_ = false; |
131 cache_.Reset(); | 144 cache_.Reset(); |
132 } | 145 } |
133 | 146 |
134 } // namespace nacl_io | 147 } // namespace nacl_io |
OLD | NEW |