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/kernel_handle.h" | 5 #include "nacl_io/kernel_handle.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <pthread.h> | 8 #include <pthread.h> |
9 | 9 |
10 #include "nacl_io/mount.h" | 10 #include "nacl_io/mount.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 if (error) | 48 if (error) |
49 return error; | 49 return error; |
50 } | 50 } |
51 | 51 |
52 return 0; | 52 return 0; |
53 } | 53 } |
54 | 54 |
55 Error KernelHandle::Seek(off_t offset, int whence, off_t* out_offset) { | 55 Error KernelHandle::Seek(off_t offset, int whence, off_t* out_offset) { |
56 // By default, don't move the offset. | 56 // By default, don't move the offset. |
57 *out_offset = offset; | 57 *out_offset = offset; |
58 size_t base; | 58 ssize_t base; |
59 size_t node_size; | 59 size_t node_size; |
60 | 60 |
61 AUTO_LOCK(handle_lock_); | 61 AUTO_LOCK(handle_lock_); |
62 Error error = node_->GetSize(&node_size); | 62 Error error = node_->GetSize(&node_size); |
63 if (error) | 63 if (error) |
64 return error; | 64 return error; |
65 | 65 |
66 switch (whence) { | 66 switch (whence) { |
67 default: | |
68 return -1; | |
69 case SEEK_SET: | 67 case SEEK_SET: |
70 base = 0; | 68 base = 0; |
71 break; | 69 break; |
72 case SEEK_CUR: | 70 case SEEK_CUR: |
73 base = handle_attr_.offs; | 71 base = handle_attr_.offs; |
74 break; | 72 break; |
75 case SEEK_END: | 73 case SEEK_END: |
76 base = node_size; | 74 base = node_size; |
77 break; | 75 break; |
| 76 default: |
| 77 return -1; |
78 } | 78 } |
79 | 79 |
80 if (base + offset < 0) | 80 if (base + offset < 0) |
81 return EINVAL; | 81 return EINVAL; |
82 | 82 |
83 off_t new_offset = base + offset; | 83 size_t new_offset = base + offset; |
84 | 84 |
85 // Seeking past the end of the file will zero out the space between the old | 85 // Seeking past the end of the file will zero out the space between the old |
86 // end and the new end. | 86 // end and the new end. |
87 if (new_offset > node_size) { | 87 if (new_offset > node_size) { |
88 error = node_->FTruncate(new_offset); | 88 error = node_->FTruncate(new_offset); |
89 if (error) | 89 if (error) |
90 return EINVAL; | 90 return EINVAL; |
91 } | 91 } |
92 | 92 |
93 *out_offset = handle_attr_.offs = new_offset; | 93 *out_offset = handle_attr_.offs = new_offset; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 return ENOTSOCK; | 226 return ENOTSOCK; |
227 if (OpenMode() == O_RDONLY) | 227 if (OpenMode() == O_RDONLY) |
228 return EACCES; | 228 return EACCES; |
229 | 229 |
230 AUTO_LOCK(handle_lock_); | 230 AUTO_LOCK(handle_lock_); |
231 return sock->SendTo(handle_attr_, buf, len, flags, dest_addr, addrlen, | 231 return sock->SendTo(handle_attr_, buf, len, flags, dest_addr, addrlen, |
232 out_len); | 232 out_len); |
233 } | 233 } |
234 | 234 |
235 } // namespace nacl_io | 235 } // namespace nacl_io |
OLD | NEW |