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_intercept.h" | 5 #include "nacl_io/kernel_intercept.h" |
6 | 6 |
7 #include <assert.h> | 7 #include <assert.h> |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <string.h> | 9 #include <string.h> |
10 | 10 |
11 #include "nacl_io/kernel_proxy.h" | 11 #include "nacl_io/kernel_proxy.h" |
12 #include "nacl_io/kernel_wrap.h" | 12 #include "nacl_io/kernel_wrap.h" |
13 #include "nacl_io/kernel_wrap_real.h" | 13 #include "nacl_io/kernel_wrap_real.h" |
| 14 #include "nacl_io/log.h" |
14 #include "nacl_io/osmman.h" | 15 #include "nacl_io/osmman.h" |
15 #include "nacl_io/ossocket.h" | 16 #include "nacl_io/ossocket.h" |
16 #include "nacl_io/pepper_interface.h" | 17 #include "nacl_io/pepper_interface.h" |
17 #include "nacl_io/real_pepper_interface.h" | 18 #include "nacl_io/real_pepper_interface.h" |
18 | 19 |
19 using namespace nacl_io; | 20 using namespace nacl_io; |
20 | 21 |
21 #define ON_NOSYS_RETURN(x) \ | 22 #define ON_NOSYS_RETURN(x) \ |
22 if (!ki_is_initialized()) { \ | 23 if (!ki_is_initialized()) { \ |
23 errno = ENOSYS; \ | 24 errno = ENOSYS; \ |
(...skipping 17 matching lines...) Expand all Loading... |
41 if (s_saved_state.kp != NULL) | 42 if (s_saved_state.kp != NULL) |
42 return 1; | 43 return 1; |
43 s_saved_state = s_state; | 44 s_saved_state = s_state; |
44 s_state.kp = NULL; | 45 s_state.kp = NULL; |
45 s_state.ppapi = NULL; | 46 s_state.ppapi = NULL; |
46 s_state.kp_owned = false; | 47 s_state.kp_owned = false; |
47 return 0; | 48 return 0; |
48 } | 49 } |
49 | 50 |
50 int ki_init(void* kp) { | 51 int ki_init(void* kp) { |
| 52 LOG_TRACE("ki_init: %p", kp); |
51 return ki_init_ppapi(kp, 0, NULL); | 53 return ki_init_ppapi(kp, 0, NULL); |
52 } | 54 } |
53 | 55 |
54 int ki_init_ppapi(void* kp, | 56 int ki_init_ppapi(void* kp, |
55 PP_Instance instance, | 57 PP_Instance instance, |
56 PPB_GetInterface get_browser_interface) { | 58 PPB_GetInterface get_browser_interface) { |
57 assert(!s_state.kp); | 59 assert(!s_state.kp); |
58 if (s_state.kp != NULL) | 60 if (s_state.kp != NULL) |
59 return 1; | 61 return 1; |
60 PepperInterface* ppapi = NULL; | 62 PepperInterface* ppapi = NULL; |
61 if (instance && get_browser_interface) { | 63 if (instance && get_browser_interface) { |
62 ppapi = new RealPepperInterface(instance, get_browser_interface); | 64 ppapi = new RealPepperInterface(instance, get_browser_interface); |
63 s_state.ppapi = ppapi; | 65 s_state.ppapi = ppapi; |
64 } | 66 } |
65 int rtn = ki_init_interface(kp, ppapi); | 67 int rtn = ki_init_interface(kp, ppapi); |
66 return rtn; | 68 return rtn; |
67 } | 69 } |
68 | 70 |
69 int ki_init_interface(void* kp, void* pepper_interface) { | 71 int ki_init_interface(void* kp, void* pepper_interface) { |
| 72 LOG_TRACE("ki_init_interface: %p %p", kp, pepper_interface); |
70 assert(!s_state.kp); | 73 assert(!s_state.kp); |
71 if (s_state.kp != NULL) | 74 if (s_state.kp != NULL) |
72 return 1; | 75 return 1; |
73 PepperInterface* ppapi = static_cast<PepperInterface*>(pepper_interface); | 76 PepperInterface* ppapi = static_cast<PepperInterface*>(pepper_interface); |
74 kernel_wrap_init(); | 77 kernel_wrap_init(); |
75 | 78 |
76 if (kp == NULL) { | 79 if (kp == NULL) { |
77 s_state.kp = new KernelProxy(); | 80 s_state.kp = new KernelProxy(); |
78 s_state.kp_owned = true; | 81 s_state.kp_owned = true; |
79 } else { | 82 } else { |
80 s_state.kp = static_cast<KernelProxy*>(kp); | 83 s_state.kp = static_cast<KernelProxy*>(kp); |
81 s_state.kp_owned = false; | 84 s_state.kp_owned = false; |
82 } | 85 } |
83 | 86 |
84 if (s_state.kp->Init(ppapi) != 0) | 87 if (s_state.kp->Init(ppapi) != 0) |
85 return 1; | 88 return 1; |
86 | 89 |
87 return 0; | 90 return 0; |
88 } | 91 } |
89 | 92 |
90 int ki_is_initialized() { | 93 int ki_is_initialized() { |
91 return s_state.kp != NULL; | 94 return s_state.kp != NULL; |
92 } | 95 } |
93 | 96 |
94 void ki_uninit() { | 97 void ki_uninit() { |
| 98 LOG_TRACE("ki_uninit"); |
95 if (s_saved_state.kp == NULL) | 99 if (s_saved_state.kp == NULL) |
96 kernel_wrap_uninit(); | 100 kernel_wrap_uninit(); |
97 | 101 |
98 // If we are going to delete the KernelProxy don't do it | 102 // If we are going to delete the KernelProxy don't do it |
99 // until we've swapped it out. | 103 // until we've swapped it out. |
100 KernelInterceptState state_to_delete = s_state; | 104 KernelInterceptState state_to_delete = s_state; |
101 | 105 |
102 // Swap out the KernelProxy. This will normally reset the | 106 // Swap out the KernelProxy. This will normally reset the |
103 // proxy to NULL, aside from in test code that has called | 107 // proxy to NULL, aside from in test code that has called |
104 // ki_push_state_for_testing(). | 108 // ki_push_state_for_testing(). |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 int ki_socket(int domain, int type, int protocol) { | 532 int ki_socket(int domain, int type, int protocol) { |
529 ON_NOSYS_RETURN(-1); | 533 ON_NOSYS_RETURN(-1); |
530 return s_state.kp->socket(domain, type, protocol); | 534 return s_state.kp->socket(domain, type, protocol); |
531 } | 535 } |
532 | 536 |
533 int ki_socketpair(int domain, int type, int protocol, int* sv) { | 537 int ki_socketpair(int domain, int type, int protocol, int* sv) { |
534 ON_NOSYS_RETURN(-1); | 538 ON_NOSYS_RETURN(-1); |
535 return s_state.kp->socketpair(domain, type, protocol, sv); | 539 return s_state.kp->socketpair(domain, type, protocol, sv); |
536 } | 540 } |
537 #endif // PROVIDES_SOCKET_API | 541 #endif // PROVIDES_SOCKET_API |
OLD | NEW |