OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/jsfs/js_fs.h" | 5 #include "nacl_io/jsfs/js_fs.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 <limits.h> | 10 #include <limits.h> |
11 #include <string.h> | 11 #include <string.h> |
12 | 12 |
13 #include "nacl_io/ioctl.h" | 13 #include "nacl_io/ioctl.h" |
14 #include "nacl_io/jsfs/js_fs_node.h" | 14 #include "nacl_io/jsfs/js_fs_node.h" |
15 #include "nacl_io/kernel_handle.h" | 15 #include "nacl_io/kernel_handle.h" |
16 #include "nacl_io/log.h" | 16 #include "nacl_io/log.h" |
17 #include "nacl_io/osdirent.h" | 17 #include "nacl_io/osdirent.h" |
18 #include "nacl_io/pepper_interface.h" | 18 #include "nacl_io/pepper_interface.h" |
19 #include "sdk_util/macros.h" | 19 #include "sdk_util/macros.h" |
20 | 20 |
21 #define TRACE(format, ...) \ | |
22 LOG_TRACE("%s:%d: " format, __FILE__, __LINE__, ##__VA_ARGS__) | |
23 #define ERROR(format, ...) \ | |
24 LOG_ERROR("%s:%d: " format, __FILE__, __LINE__, ##__VA_ARGS__) | |
25 | |
26 namespace nacl_io { | 21 namespace nacl_io { |
27 | 22 |
28 JsFs::JsFs() | 23 JsFs::JsFs() |
29 : messaging_iface_(NULL), | 24 : messaging_iface_(NULL), |
30 array_iface_(NULL), | 25 array_iface_(NULL), |
31 buffer_iface_(NULL), | 26 buffer_iface_(NULL), |
32 dict_iface_(NULL), | 27 dict_iface_(NULL), |
33 var_iface_(NULL), | 28 var_iface_(NULL), |
34 request_id_(0) { | 29 request_id_(0) { |
35 } | 30 } |
36 | 31 |
37 Error JsFs::Init(const FsInitArgs& args) { | 32 Error JsFs::Init(const FsInitArgs& args) { |
38 Error error = Filesystem::Init(args); | 33 Error error = Filesystem::Init(args); |
39 if (error) | 34 if (error) |
40 return error; | 35 return error; |
41 | 36 |
42 pthread_cond_init(&response_cond_, NULL); | 37 pthread_cond_init(&response_cond_, NULL); |
43 | 38 |
44 messaging_iface_ = ppapi_->GetMessagingInterface(); | 39 messaging_iface_ = ppapi_->GetMessagingInterface(); |
45 array_iface_ = ppapi_->GetVarArrayInterface(); | 40 array_iface_ = ppapi_->GetVarArrayInterface(); |
46 buffer_iface_ = ppapi_->GetVarArrayBufferInterface(); | 41 buffer_iface_ = ppapi_->GetVarArrayBufferInterface(); |
47 dict_iface_ = ppapi_->GetVarDictionaryInterface(); | 42 dict_iface_ = ppapi_->GetVarDictionaryInterface(); |
48 var_iface_ = ppapi_->GetVarInterface(); | 43 var_iface_ = ppapi_->GetVarInterface(); |
49 | 44 |
50 if (!messaging_iface_ || !array_iface_ || !buffer_iface_ || !dict_iface_ || | 45 if (!messaging_iface_ || !array_iface_ || !buffer_iface_ || !dict_iface_ || |
51 !var_iface_) { | 46 !var_iface_) { |
52 ERROR("Got 1+ NULL interface(s): %s%s%s%s%s", | 47 LOG_ERROR("Got 1+ NULL interface(s): %s%s%s%s%s", |
53 messaging_iface_ ? "" : "Messaging ", | 48 messaging_iface_ ? "" : "Messaging ", |
54 array_iface_ ? "" : "VarArray ", | 49 array_iface_ ? "" : "VarArray ", |
55 buffer_iface_ ? "" : "VarArrayBuffer ", | 50 buffer_iface_ ? "" : "VarArrayBuffer ", |
56 dict_iface_ ? "" : "VarDictionary ", | 51 dict_iface_ ? "" : "VarDictionary ", |
57 var_iface_ ? "" : "Var "); | 52 var_iface_ ? "" : "Var "); |
58 return ENOSYS; | 53 return ENOSYS; |
59 } | 54 } |
60 | 55 |
61 return 0; | 56 return 0; |
62 } | 57 } |
63 | 58 |
64 void JsFs::Destroy() { | 59 void JsFs::Destroy() { |
65 pthread_cond_destroy(&response_cond_); | 60 pthread_cond_destroy(&response_cond_); |
66 } | 61 } |
67 | 62 |
68 bool JsFs::SetDictVar(PP_Var dict, const char* key, PP_Var value) { | 63 bool JsFs::SetDictVar(PP_Var dict, const char* key, PP_Var value) { |
69 PP_Var key_var = var_iface_->VarFromUtf8(key, strlen(key)); | 64 PP_Var key_var = var_iface_->VarFromUtf8(key, strlen(key)); |
70 ScopedVar scoped_key(ppapi_, key_var); | 65 ScopedVar scoped_key(ppapi_, key_var); |
71 if (key_var.type != PP_VARTYPE_STRING) { | 66 if (key_var.type != PP_VARTYPE_STRING) { |
72 ERROR("Unable to create string key \"%s\".", key); | 67 LOG_ERROR("Unable to create string key \"%s\".", key); |
73 return false; | 68 return false; |
74 } | 69 } |
75 | 70 |
76 PP_Bool success = dict_iface_->Set(dict, key_var, value); | 71 PP_Bool success = dict_iface_->Set(dict, key_var, value); |
77 if (!success) { | 72 if (!success) { |
78 ERROR("Unable to set \"%s\" key of dictionary.", key); | 73 LOG_ERROR("Unable to set \"%s\" key of dictionary.", key); |
79 return false; | 74 return false; |
80 } | 75 } |
81 | 76 |
82 return true; | 77 return true; |
83 } | 78 } |
84 | 79 |
85 PP_Var JsFs::GetDictVar(PP_Var dict, const char* key) { | 80 PP_Var JsFs::GetDictVar(PP_Var dict, const char* key) { |
86 PP_Var key_var = var_iface_->VarFromUtf8(key, strlen(key)); | 81 PP_Var key_var = var_iface_->VarFromUtf8(key, strlen(key)); |
87 ScopedVar scoped_key(ppapi_, key_var); | 82 ScopedVar scoped_key(ppapi_, key_var); |
88 if (key_var.type != PP_VARTYPE_STRING) { | 83 if (key_var.type != PP_VARTYPE_STRING) { |
89 ERROR("Unable to create string key \"%s\".", key); | 84 LOG_ERROR("Unable to create string key \"%s\".", key); |
90 return PP_MakeUndefined(); | 85 return PP_MakeUndefined(); |
91 } | 86 } |
92 | 87 |
93 return dict_iface_->Get(dict, key_var); | 88 return dict_iface_->Get(dict, key_var); |
94 } | 89 } |
95 | 90 |
96 bool JsFs::GetVarInt32(PP_Var var, int32_t* out_value) { | 91 bool JsFs::GetVarInt32(PP_Var var, int32_t* out_value) { |
97 switch (var.type) { | 92 switch (var.type) { |
98 case PP_VARTYPE_INT32: | 93 case PP_VARTYPE_INT32: |
99 *out_value = var.value.as_int; | 94 *out_value = var.value.as_int; |
(...skipping 29 matching lines...) Expand all Loading... |
129 *out_value = var.value.as_int; | 124 *out_value = var.value.as_int; |
130 return true; | 125 return true; |
131 | 126 |
132 case PP_VARTYPE_DOUBLE: | 127 case PP_VARTYPE_DOUBLE: |
133 *out_value = static_cast<int64_t>(var.value.as_double); | 128 *out_value = static_cast<int64_t>(var.value.as_double); |
134 return true; | 129 return true; |
135 | 130 |
136 case PP_VARTYPE_ARRAY: { | 131 case PP_VARTYPE_ARRAY: { |
137 uint32_t len = array_iface_->GetLength(var); | 132 uint32_t len = array_iface_->GetLength(var); |
138 if (len != 2) { | 133 if (len != 2) { |
139 ERROR("Expected int64 array type to have 2 elements, not %d", len); | 134 LOG_ERROR("Expected int64 array type to have 2 elements, not %d", len); |
140 return false; | 135 return false; |
141 } | 136 } |
142 | 137 |
143 PP_Var high_int_var = array_iface_->Get(var, 0); | 138 PP_Var high_int_var = array_iface_->Get(var, 0); |
144 ScopedVar scoped_high_int_var(ppapi_, high_int_var); | 139 ScopedVar scoped_high_int_var(ppapi_, high_int_var); |
145 uint32_t high_int; | 140 uint32_t high_int; |
146 if (!GetVarUint32(high_int_var, &high_int)) | 141 if (!GetVarUint32(high_int_var, &high_int)) |
147 return false; | 142 return false; |
148 | 143 |
149 PP_Var low_int_var = array_iface_->Get(var, 1); | 144 PP_Var low_int_var = array_iface_->Get(var, 1); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 case 'd': | 178 case 'd': |
184 value_var = PP_MakeInt32(va_arg(args, int32_t)); | 179 value_var = PP_MakeInt32(va_arg(args, int32_t)); |
185 break; | 180 break; |
186 case 'u': | 181 case 'u': |
187 value_var = PP_MakeInt32(va_arg(args, uint32_t)); | 182 value_var = PP_MakeInt32(va_arg(args, uint32_t)); |
188 break; | 183 break; |
189 case 's': { | 184 case 's': { |
190 const char* value = va_arg(args, const char*); | 185 const char* value = va_arg(args, const char*); |
191 value_var = var_iface_->VarFromUtf8(value, strlen(value)); | 186 value_var = var_iface_->VarFromUtf8(value, strlen(value)); |
192 if (value_var.type != PP_VARTYPE_STRING) { | 187 if (value_var.type != PP_VARTYPE_STRING) { |
193 ERROR("Unable to create \"%s\" string var.", value); | 188 LOG_ERROR("Unable to create \"%s\" string var.", value); |
194 return PP_MakeNull(); | 189 return PP_MakeNull(); |
195 } | 190 } |
196 break; | 191 break; |
197 } | 192 } |
198 case 'p': | 193 case 'p': |
199 value_var = *va_arg(args, const PP_Var*); | 194 value_var = *va_arg(args, const PP_Var*); |
200 var_iface_->AddRef(value_var); | 195 var_iface_->AddRef(value_var); |
201 break; | 196 break; |
202 case 'l': { | 197 case 'l': { |
203 // Only '%lld' is supported. | 198 // Only '%lld' is supported. |
204 ++p; | 199 ++p; |
205 assert(*p == 'l'); | 200 assert(*p == 'l'); |
206 ++p; | 201 ++p; |
207 assert(*p == 'd'); | 202 assert(*p == 'd'); |
208 | 203 |
209 int64_t value = va_arg(args, int64_t); | 204 int64_t value = va_arg(args, int64_t); |
210 if (value >= INT_MIN && value <= INT_MAX) { | 205 if (value >= INT_MIN && value <= INT_MAX) { |
211 // Send as an int. | 206 // Send as an int. |
212 value_var = PP_MakeInt32(static_cast<int32_t>(value)); | 207 value_var = PP_MakeInt32(static_cast<int32_t>(value)); |
213 } else { | 208 } else { |
214 // Send as an array of two ints: [high int32, low int32]. | 209 // Send as an array of two ints: [high int32, low int32]. |
215 value_var = array_iface_->Create(); | 210 value_var = array_iface_->Create(); |
216 if (!array_iface_->SetLength(value_var, 2)) { | 211 if (!array_iface_->SetLength(value_var, 2)) { |
217 ERROR("Unable to set length of s64 array."); | 212 LOG_ERROR("Unable to set length of s64 array."); |
218 return PP_MakeNull(); | 213 return PP_MakeNull(); |
219 } | 214 } |
220 | 215 |
221 if (!array_iface_->Set(value_var, 0, PP_MakeInt32(value >> 32))) { | 216 if (!array_iface_->Set(value_var, 0, PP_MakeInt32(value >> 32))) { |
222 ERROR("Unable to set of high int32 of s64 array."); | 217 LOG_ERROR("Unable to set of high int32 of s64 array."); |
223 return PP_MakeNull(); | 218 return PP_MakeNull(); |
224 } | 219 } |
225 | 220 |
226 if (!array_iface_->Set( | 221 if (!array_iface_->Set( |
227 value_var, 1, PP_MakeInt32(value & 0xffffffff))) { | 222 value_var, 1, PP_MakeInt32(value & 0xffffffff))) { |
228 ERROR("Unable to set of low int32 of s64 array."); | 223 LOG_ERROR("Unable to set of low int32 of s64 array."); |
229 return PP_MakeNull(); | 224 return PP_MakeNull(); |
230 } | 225 } |
231 } | 226 } |
232 | 227 |
233 break; | 228 break; |
234 } | 229 } |
235 default: | 230 default: |
236 ERROR("Unknown format specifier %%\"%s\"", p); | 231 LOG_ERROR("Unknown format specifier %%\"%s\"", p); |
237 assert(0); | 232 assert(0); |
238 return PP_MakeNull(); | 233 return PP_MakeNull(); |
239 } | 234 } |
240 | 235 |
241 ++p; | 236 ++p; |
242 | 237 |
243 if (!SetDictVar(dict, key, value_var)) | 238 if (!SetDictVar(dict, key, value_var)) |
244 return PP_MakeNull(); | 239 return PP_MakeNull(); |
245 | 240 |
246 // Unconditionally release the value var. It is legal to do this even for | 241 // Unconditionally release the value var. It is legal to do this even for |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 va_list args; | 280 va_list args; |
286 va_start(args, format); | 281 va_start(args, format); |
287 bool result = VSendRequestAndWait(out_response, format, args); | 282 bool result = VSendRequestAndWait(out_response, format, args); |
288 va_end(args); | 283 va_end(args); |
289 return result; | 284 return result; |
290 } | 285 } |
291 | 286 |
292 Error JsFs::ErrorFromResponse(const ScopedVar& response) { | 287 Error JsFs::ErrorFromResponse(const ScopedVar& response) { |
293 int32_t error; | 288 int32_t error; |
294 if (ScanVar(response.pp_var(), "%d", "error", &error) != 1) { | 289 if (ScanVar(response.pp_var(), "%d", "error", &error) != 1) { |
295 ERROR("Expected \"error\" field in response."); | 290 LOG_ERROR("Expected \"error\" field in response."); |
296 return EINVAL; | 291 return EINVAL; |
297 } | 292 } |
298 | 293 |
299 return error; | 294 return error; |
300 } | 295 } |
301 | 296 |
302 int JsFs::ScanVar(PP_Var var, const char* format, ...) { | 297 int JsFs::ScanVar(PP_Var var, const char* format, ...) { |
303 va_list args; | 298 va_list args; |
304 va_start(args, format); | 299 va_start(args, format); |
305 int result = VScanVar(var, format, args); | 300 int result = VScanVar(var, format, args); |
306 va_end(args); | 301 va_end(args); |
307 return result; | 302 return result; |
308 } | 303 } |
309 | 304 |
310 int JsFs::VScanVar(PP_Var dict_var, const char* format, va_list args) { | 305 int JsFs::VScanVar(PP_Var dict_var, const char* format, va_list args) { |
311 if (dict_var.type != PP_VARTYPE_DICTIONARY) { | 306 if (dict_var.type != PP_VARTYPE_DICTIONARY) { |
312 ERROR("Expected var of type dictionary, not %d.", dict_var.type); | 307 LOG_ERROR("Expected var of type dictionary, not %d.", dict_var.type); |
313 return 0; | 308 return 0; |
314 } | 309 } |
315 | 310 |
316 int num_values = 0; | 311 int num_values = 0; |
317 | 312 |
318 const char* p = format; | 313 const char* p = format; |
319 while (*p) { | 314 while (*p) { |
320 assert(*p == '%'); | 315 assert(*p == '%'); |
321 ++p; | 316 ++p; |
322 | 317 |
323 const char* key = va_arg(args, const char*); | 318 const char* key = va_arg(args, const char*); |
324 PP_Var value_var = GetDictVar(dict_var, key); | 319 PP_Var value_var = GetDictVar(dict_var, key); |
325 ScopedVar scoped_value_var(ppapi_, value_var); | 320 ScopedVar scoped_value_var(ppapi_, value_var); |
326 | 321 |
327 if (value_var.type == PP_VARTYPE_UNDEFINED) | 322 if (value_var.type == PP_VARTYPE_UNDEFINED) |
328 break; | 323 break; |
329 | 324 |
330 bool ok = true; | 325 bool ok = true; |
331 | 326 |
332 switch (*p) { | 327 switch (*p) { |
333 case 'd': { | 328 case 'd': { |
334 int32_t* value = va_arg(args, int32_t*); | 329 int32_t* value = va_arg(args, int32_t*); |
335 if (!GetVarInt32(value_var, value)) { | 330 if (!GetVarInt32(value_var, value)) { |
336 ERROR("Expected int32_t value for key \"%s\"", key); | 331 LOG_ERROR("Expected int32_t value for key \"%s\"", key); |
337 ok = false; | 332 ok = false; |
338 } | 333 } |
339 break; | 334 break; |
340 } | 335 } |
341 case 'u': { | 336 case 'u': { |
342 uint32_t* value = va_arg(args, uint32_t*); | 337 uint32_t* value = va_arg(args, uint32_t*); |
343 if (!GetVarUint32(value_var, value)) { | 338 if (!GetVarUint32(value_var, value)) { |
344 ERROR("Expected uint32_t value for key \"%s\"", key); | 339 LOG_ERROR("Expected uint32_t value for key \"%s\"", key); |
345 ok = false; | 340 ok = false; |
346 } | 341 } |
347 break; | 342 break; |
348 } | 343 } |
349 case 'l': { | 344 case 'l': { |
350 // Only '%lld' is supported. | 345 // Only '%lld' is supported. |
351 ++p; | 346 ++p; |
352 assert(*p == 'l'); | 347 assert(*p == 'l'); |
353 ++p; | 348 ++p; |
354 assert(*p == 'd'); | 349 assert(*p == 'd'); |
355 | 350 |
356 int64_t* value = va_arg(args, int64_t*); | 351 int64_t* value = va_arg(args, int64_t*); |
357 if (!GetVarInt64(value_var, value)) { | 352 if (!GetVarInt64(value_var, value)) { |
358 ERROR("Expected int64_t value for key \"%s\"", key); | 353 LOG_ERROR("Expected int64_t value for key \"%s\"", key); |
359 ok = false; | 354 ok = false; |
360 } | 355 } |
361 break; | 356 break; |
362 } | 357 } |
363 case 'p': { | 358 case 'p': { |
364 PP_Var* value = va_arg(args, PP_Var*); | 359 PP_Var* value = va_arg(args, PP_Var*); |
365 *value = scoped_value_var.Release(); | 360 *value = scoped_value_var.Release(); |
366 break; | 361 break; |
367 } | 362 } |
368 default: | 363 default: |
369 ERROR("Unknown format specifier %%\"%s\"", p); | 364 LOG_ERROR("Unknown format specifier %%\"%s\"", p); |
370 assert(0); | 365 assert(0); |
371 ok = false; | 366 ok = false; |
372 break; | 367 break; |
373 } | 368 } |
374 | 369 |
375 if (!ok) | 370 if (!ok) |
376 break; | 371 break; |
377 | 372 |
378 p++; | 373 p++; |
379 num_values++; | 374 num_values++; |
(...skipping 15 matching lines...) Expand all Loading... |
395 pthread_cond_wait(&response_cond_, lock_.mutex()); | 390 pthread_cond_wait(&response_cond_, lock_.mutex()); |
396 } | 391 } |
397 } | 392 } |
398 | 393 |
399 Error JsFs::Access(const Path& path, int a_mode) { | 394 Error JsFs::Access(const Path& path, int a_mode) { |
400 ScopedVar response(ppapi_); | 395 ScopedVar response(ppapi_); |
401 if (!SendRequestAndWait(&response, "%s%s%d", | 396 if (!SendRequestAndWait(&response, "%s%s%d", |
402 "cmd", "access", | 397 "cmd", "access", |
403 "path", path.Join().c_str(), | 398 "path", path.Join().c_str(), |
404 "amode", a_mode)) { | 399 "amode", a_mode)) { |
405 ERROR("Failed to send request."); | 400 LOG_ERROR("Failed to send request."); |
406 return EINVAL; | 401 return EINVAL; |
407 } | 402 } |
408 | 403 |
409 return ErrorFromResponse(response); | 404 return ErrorFromResponse(response); |
410 } | 405 } |
411 | 406 |
412 Error JsFs::Open(const Path& path, int open_flags, ScopedNode* out_node) { | 407 Error JsFs::Open(const Path& path, int open_flags, ScopedNode* out_node) { |
413 out_node->reset(NULL); | 408 out_node->reset(NULL); |
414 ScopedVar response(ppapi_); | 409 ScopedVar response(ppapi_); |
415 if (!SendRequestAndWait(&response, "%s%s%d", | 410 if (!SendRequestAndWait(&response, "%s%s%d", |
416 "cmd", "open", | 411 "cmd", "open", |
417 "path", path.Join().c_str(), | 412 "path", path.Join().c_str(), |
418 "oflag", open_flags)) { | 413 "oflag", open_flags)) { |
419 ERROR("Failed to send request."); | 414 LOG_ERROR("Failed to send request."); |
420 return EINVAL; | 415 return EINVAL; |
421 } | 416 } |
422 | 417 |
423 int32_t error; | 418 int32_t error; |
424 int32_t fd; | 419 int32_t fd; |
425 int result = ScanVar(response.pp_var(), "%d%d", "error", &error, "fd", &fd); | 420 int result = ScanVar(response.pp_var(), "%d%d", "error", &error, "fd", &fd); |
426 if (result >= 1 && error) | 421 if (result >= 1 && error) |
427 return error; | 422 return error; |
428 | 423 |
429 if (result != 2) { | 424 if (result != 2) { |
430 ERROR("Expected \"error\" and \"fd\" fields in response."); | 425 LOG_ERROR("Expected \"error\" and \"fd\" fields in response."); |
431 return EINVAL; | 426 return EINVAL; |
432 } | 427 } |
433 | 428 |
434 out_node->reset(new JsFsNode(this, fd)); | 429 out_node->reset(new JsFsNode(this, fd)); |
435 return 0; | 430 return 0; |
436 } | 431 } |
437 | 432 |
438 Error JsFs::Unlink(const Path& path) { | 433 Error JsFs::Unlink(const Path& path) { |
439 ScopedVar response(ppapi_); | 434 ScopedVar response(ppapi_); |
440 if (!SendRequestAndWait( | 435 if (!SendRequestAndWait( |
441 &response, "%s%s", "cmd", "unlink", "path", path.Join().c_str())) { | 436 &response, "%s%s", "cmd", "unlink", "path", path.Join().c_str())) { |
442 ERROR("Failed to send request."); | 437 LOG_ERROR("Failed to send request."); |
443 return EINVAL; | 438 return EINVAL; |
444 } | 439 } |
445 | 440 |
446 return ErrorFromResponse(response); | 441 return ErrorFromResponse(response); |
447 } | 442 } |
448 | 443 |
449 Error JsFs::Mkdir(const Path& path, int perm) { | 444 Error JsFs::Mkdir(const Path& path, int perm) { |
450 ScopedVar response(ppapi_); | 445 ScopedVar response(ppapi_); |
451 if (!SendRequestAndWait(&response, "%s%s%d", | 446 if (!SendRequestAndWait(&response, "%s%s%d", |
452 "cmd", "mkdir", | 447 "cmd", "mkdir", |
453 "path", path.Join().c_str(), | 448 "path", path.Join().c_str(), |
454 "mode", perm)) { | 449 "mode", perm)) { |
455 ERROR("Failed to send request."); | 450 LOG_ERROR("Failed to send request."); |
456 return EINVAL; | 451 return EINVAL; |
457 } | 452 } |
458 | 453 |
459 return ErrorFromResponse(response); | 454 return ErrorFromResponse(response); |
460 } | 455 } |
461 | 456 |
462 Error JsFs::Rmdir(const Path& path) { | 457 Error JsFs::Rmdir(const Path& path) { |
463 ScopedVar response(ppapi_); | 458 ScopedVar response(ppapi_); |
464 if (!SendRequestAndWait( | 459 if (!SendRequestAndWait( |
465 &response, "%s%s", "cmd", "rmdir", "path", path.Join().c_str())) { | 460 &response, "%s%s", "cmd", "rmdir", "path", path.Join().c_str())) { |
466 ERROR("Failed to send request."); | 461 LOG_ERROR("Failed to send request."); |
467 return EINVAL; | 462 return EINVAL; |
468 } | 463 } |
469 | 464 |
470 return ErrorFromResponse(response); | 465 return ErrorFromResponse(response); |
471 } | 466 } |
472 | 467 |
473 Error JsFs::Remove(const Path& path) { | 468 Error JsFs::Remove(const Path& path) { |
474 ScopedVar response(ppapi_); | 469 ScopedVar response(ppapi_); |
475 if (!SendRequestAndWait( | 470 if (!SendRequestAndWait( |
476 &response, "%s%s", "cmd", "remove", "path", path.Join().c_str())) { | 471 &response, "%s%s", "cmd", "remove", "path", path.Join().c_str())) { |
477 ERROR("Failed to send request."); | 472 LOG_ERROR("Failed to send request."); |
478 return EINVAL; | 473 return EINVAL; |
479 } | 474 } |
480 | 475 |
481 return ErrorFromResponse(response); | 476 return ErrorFromResponse(response); |
482 } | 477 } |
483 | 478 |
484 Error JsFs::Rename(const Path& path, const Path& newpath) { | 479 Error JsFs::Rename(const Path& path, const Path& newpath) { |
485 ScopedVar response(ppapi_); | 480 ScopedVar response(ppapi_); |
486 if (!SendRequestAndWait(&response, "%s%s%s", | 481 if (!SendRequestAndWait(&response, "%s%s%s", |
487 "cmd", "rename", | 482 "cmd", "rename", |
488 "old", path.Join().c_str(), | 483 "old", path.Join().c_str(), |
489 "new", newpath.Join().c_str())) { | 484 "new", newpath.Join().c_str())) { |
490 ERROR("Failed to send request."); | 485 LOG_ERROR("Failed to send request."); |
491 return EINVAL; | 486 return EINVAL; |
492 } | 487 } |
493 | 488 |
494 return ErrorFromResponse(response); | 489 return ErrorFromResponse(response); |
495 } | 490 } |
496 | 491 |
497 Error JsFs::Filesystem_VIoctl(int request, va_list args) { | 492 Error JsFs::Filesystem_VIoctl(int request, va_list args) { |
498 if (request != NACL_IOC_HANDLEMESSAGE) { | 493 if (request != NACL_IOC_HANDLEMESSAGE) { |
499 ERROR("Unknown ioctl: %#x", request); | 494 LOG_ERROR("Unknown ioctl: %#x", request); |
500 return EINVAL; | 495 return EINVAL; |
501 } | 496 } |
502 | 497 |
503 PP_Var response = *va_arg(args, PP_Var*); | 498 PP_Var response = *va_arg(args, PP_Var*); |
504 | 499 |
505 AUTO_LOCK(lock_); | 500 AUTO_LOCK(lock_); |
506 | 501 |
507 RequestId response_id; | 502 RequestId response_id; |
508 if (ScanVar(response, "%d", "id", &response_id) != 1) { | 503 if (ScanVar(response, "%d", "id", &response_id) != 1) { |
509 TRACE("ioctl with no \"id\", ignoring.\n"); | 504 LOG_TRACE("ioctl with no \"id\", ignoring.\n"); |
510 return EINVAL; | 505 return EINVAL; |
511 } | 506 } |
512 | 507 |
513 responses_.insert(ResponseMap_t::value_type(response_id, response)); | 508 responses_.insert(ResponseMap_t::value_type(response_id, response)); |
514 pthread_cond_broadcast(&response_cond_); | 509 pthread_cond_broadcast(&response_cond_); |
515 return 0; | 510 return 0; |
516 } | 511 } |
517 | 512 |
518 } // namespace nacl_io | 513 } // namespace nacl_io |
OLD | NEW |