Implement a Lock/Unlock Queue API calls.
[platform/core/security/vasum.git] / client / vasum-client-impl.hpp
1 /*
2  *  Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Contact: Mateusz Malicki <m.malicki2@samsung.com>
5  *
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License
17  */
18
19
20 /**
21  * @file
22  * @author  Mateusz Malicki (m.malicki2@samsung.com)
23  * @brief   This file contains vasum-server's client definition
24  */
25
26 #ifndef VASUM_CLIENT_IMPL_HPP
27 #define VASUM_CLIENT_IMPL_HPP
28
29 #include "vasum-client.h"
30
31 #include <ipc/epoll/thread-dispatcher.hpp>
32 #include <ipc/epoll/event-poll.hpp>
33 #include <ipc/client.hpp>
34
35 #include <mutex>
36 #include <memory>
37 #include <functional>
38 #include <linux/if_link.h>
39
40 /**
41  * Zone's D-Bus state change callback function signature.
42  *
43  * @param[in] zoneId affected zone id
44  * @param[in] dbusAddress new D-Bus address
45  * @param data custom user's data pointer passed to vsm_add_state_callback() function
46  */
47 typedef std::function<void (const char *zoneId, const char *dbusAddress, void *data)> VsmZoneDbusStateFunction;
48
49 /**
50  * Notification callback function signature.
51  *
52  * @param[in] zone source zone
53  * @param[in] application sending application name
54  * @param[in] message notification message
55  * @param data custom user's data pointer passed to vsm_add_notification_callback()
56  */
57 typedef std::function<void(const char *zone, const char *application, const char *message, void *data)>
58     VsmNotificationFunction;
59
60 /**
61  * vasum's client definition.
62  *
63  * Client uses dbus API.
64  */
65 class Client {
66 public:
67     Client() noexcept;
68     ~Client() noexcept;
69
70     /**
71      * Connect client with system ipc address.
72      *
73      * @return status of this function call
74      */
75     VsmStatus connectSystem() noexcept;
76
77     /**
78      * Connect client.
79      *
80      * @param address ipc socket address
81      * @return status of this function call
82      */
83     VsmStatus connect(const std::string& address) noexcept;
84
85     /**
86      * Disconnect client
87      */
88     VsmStatus disconnect() noexcept;
89
90     /**
91      *  @see ::vsm_get_poll_fd
92      */
93     VsmStatus vsm_get_poll_fd(int* fd) noexcept;
94
95     /**
96      *  @see ::vsm_enter_eventloop
97      */
98     VsmStatus vsm_enter_eventloop(int flags, int timeout) noexcept;
99
100     /**
101      *  @see ::vsm_set_dispatcher_type
102      */
103     VsmStatus vsm_set_dispatcher_type(VsmDispacherType dispacher) noexcept;
104
105     /**
106      *  @see ::vsm_get_dispatcher_type
107      */
108     VsmStatus vsm_get_dispatcher_type(VsmDispacherType* dispacher) noexcept;
109
110     /**
111      *  @see ::vsm_get_status_message
112      */
113     const char* vsm_get_status_message() const noexcept;
114
115     /**
116      *  @see ::vsm_get_status
117      */
118     VsmStatus vsm_get_status() const noexcept;
119
120     /**
121      *  @see ::vsm_get_zone_dbuses
122      */
123     VsmStatus vsm_get_zone_dbuses(VsmArrayString* keys, VsmArrayString* values) noexcept;
124
125     /**
126      *  @see ::vsm_lock_queue
127      */
128     VsmStatus vsm_lock_queue() noexcept;
129
130     /**
131      *  @see ::vsm_unlock_queue
132      */
133     VsmStatus vsm_unlock_queue() noexcept;
134
135     /**
136      *  @see ::vsm_get_zone_ids
137      */
138     VsmStatus vsm_get_zone_ids(VsmArrayString* array) noexcept;
139
140     /**
141      *  @see ::vsm_get_active_zone_id
142      */
143     VsmStatus vsm_get_active_zone_id(VsmString* id) noexcept;
144
145     /**
146      *  @see ::vsm_get_zone_rootpath
147      */
148     VsmStatus vsm_get_zone_rootpath(const char* id, VsmString* rootpath) noexcept;
149
150     /**
151      *  @see ::vsm_lookup_zone_by_pid
152      */
153     VsmStatus vsm_lookup_zone_by_pid(int pid, VsmString* id) noexcept;
154
155     /**
156      * @see ::vsm_lookup_zone_by_id
157      */
158     VsmStatus vsm_lookup_zone_by_id(const char* id, VsmZone* zone) noexcept;
159
160     /**
161      * @see ::vsm_lookup_zone_by_terminal_id
162      */
163     VsmStatus vsm_lookup_zone_by_terminal_id(int terminal, VsmString* id) noexcept;
164
165     /**
166      *  @see ::vsm_set_active_zone
167      */
168     VsmStatus vsm_set_active_zone(const char* id) noexcept;
169
170     /**
171      *  @see ::vsm_create_zone
172      */
173     VsmStatus vsm_create_zone(const char* id, const char* tname) noexcept;
174
175     /**
176      *  @see ::vsm_destroy_zone
177      */
178     VsmStatus vsm_destroy_zone(const char* id) noexcept;
179
180     /**
181      *  @see ::vsm_shutdown_zone
182      */
183     VsmStatus vsm_shutdown_zone(const char* id) noexcept;
184
185     /**
186      *  @see ::vsm_start_zone
187      */
188     VsmStatus vsm_start_zone(const char* id) noexcept;
189
190     /**
191      *  @see ::vsm_lock_zone
192      */
193     VsmStatus vsm_lock_zone(const char* id) noexcept;
194
195     /**
196      *  @see ::vsm_unlock_zone
197      */
198     VsmStatus vsm_unlock_zone(const char* id) noexcept;
199
200     /**
201      *  @see ::vsm_add_state_callback
202      */
203     VsmStatus vsm_add_state_callback(VsmZoneDbusStateFunction zoneDbusStateCallback,
204                                      void* data,
205                                      VsmSubscriptionId* subscriptionId) noexcept;
206
207     /**
208      *  @see ::vsm_del_state_callback
209      */
210     VsmStatus vsm_del_state_callback(VsmSubscriptionId subscriptionId) noexcept;
211
212     /**
213      *  @see ::vsm_del_state_callback
214      */
215     VsmStatus vsm_grant_device(const char* id,
216                                const char* device,
217                                uint32_t flags) noexcept;
218
219     /**
220      *  @see ::vsm_revoke_device
221      */
222     VsmStatus vsm_revoke_device(const char* id, const char* device) noexcept;
223
224     /**
225      *  @see ::vsm_zone_get_netdevs
226      */
227     VsmStatus vsm_zone_get_netdevs(const char* zone, VsmArrayString* netdevIds) noexcept;
228
229     /**
230      *  @see ::vsm_netdev_get_ipv4_addr
231      */
232     VsmStatus vsm_netdev_get_ipv4_addr(const char* zone,
233                                        const char* netdevId,
234                                        struct in_addr *addr) noexcept;
235
236     /**
237      *  @see ::vsm_netdev_get_ipv6_addr
238      */
239     VsmStatus vsm_netdev_get_ipv6_addr(const char* zone,
240                                        const char* netdevId,
241                                        struct in6_addr *addr) noexcept;
242
243     /**
244      *  @see ::vsm_netdev_set_ipv4_addr
245      */
246     VsmStatus vsm_netdev_set_ipv4_addr(const char* zone,
247                                        const char* netdevId,
248                                        struct in_addr *addr,
249                                        int prefix) noexcept;
250
251     /**
252      *  @see ::vsm_netdev_set_ipv6_addr
253      */
254     VsmStatus vsm_netdev_set_ipv6_addr(const char* zone,
255                                        const char* netdevId,
256                                        struct in6_addr *addr,
257                                        int prefix) noexcept;
258
259     /**
260      *  @see ::vsm_netdev_del_ipv4_addr
261      */
262     VsmStatus vsm_netdev_del_ipv4_addr(const char* zone,
263                                       const char* netdevId,
264                                       struct in_addr* addr,
265                                       int prefix) noexcept;
266
267     /**
268      *  @see ::vsm_netdev_del_ipv6_addr
269      */
270     VsmStatus vsm_netdev_del_ipv6_addr(const char* zone,
271                                       const char* netdevId,
272                                       struct in6_addr* addr,
273                                       int prefix) noexcept;
274
275     /**
276      *  @see ::vsm_netdev_up
277      */
278     VsmStatus vsm_netdev_up(const char* zone, const char* netdevId) noexcept;
279
280     /**
281      *  @see ::vsm_netdev_down
282      */
283     VsmStatus vsm_netdev_down(const char* zone, const char* netdevId) noexcept;
284
285     /**
286      *  @see ::vsm_create_netdev_veth
287      */
288     VsmStatus vsm_create_netdev_veth(const char* zone,
289                                      const char* zoneDev,
290                                      const char* hostDev) noexcept;
291
292     /**
293      *  @see ::vsm_create_netdev_macvlan
294      */
295     VsmStatus vsm_create_netdev_macvlan(const char* zone,
296                                         const char* zoneDev,
297                                         const char* hostDev,
298                                         enum macvlan_mode mode) noexcept;
299
300     /**
301      *  @see ::vsm_create_netdev_phys
302      */
303     VsmStatus vsm_create_netdev_phys(const char* zone, const char* devId) noexcept;
304
305     /**
306      *  @see ::vsm_lookup_netdev_by_name
307      */
308     VsmStatus vsm_lookup_netdev_by_name(const char* zone,
309                                         const char* netdevId,
310                                         VsmNetdev* netdev) noexcept;
311
312     /**
313      *  @see ::vsm_destroy_netdev
314      */
315     VsmStatus vsm_destroy_netdev(const char* zone, const char* devId) noexcept;
316
317     /**
318      *  @see ::vsm_declare_file
319      */
320     VsmStatus vsm_declare_file(const char* zone,
321                                VsmFileType type,
322                                const char* path,
323                                int32_t flags,
324                                mode_t mode,
325                                VsmString* id) noexcept;
326
327     /**
328      * @see ::vsm_declare_mount
329      */
330     VsmStatus vsm_declare_mount(const char* source,
331                                 const char* zone,
332                                 const char* target,
333                                 const char* type,
334                                 uint64_t flags,
335                                 const char* data,
336                                 VsmString* id) noexcept;
337     /**
338      * @see ::vsm_declare_link
339      */
340     VsmStatus vsm_declare_link(const char* source,
341                                const char* zone,
342                                const char* target,
343                                VsmString* id) noexcept;
344
345     /**
346      * @see ::vsm_list_declarations
347      */
348     VsmStatus vsm_list_declarations(const char* zone, VsmArrayString* declarations) noexcept;
349
350     /**
351      * @see ::vsm_remove_declaration
352      */
353     VsmStatus vsm_remove_declaration(const char* zone, VsmString declaration) noexcept;
354
355     /**
356      *  @see ::vsm_notify_active_zone
357      */
358     VsmStatus vsm_notify_active_zone(const char* application, const char* message) noexcept;
359
360     /**
361      *  @see ::vsm_file_move_request
362      */
363     VsmStatus vsm_file_move_request(const char* destZone, const char* path) noexcept;
364
365     /**
366      *  @see ::vsm_add_notification_callback
367      */
368     VsmStatus vsm_add_notification_callback(VsmNotificationFunction notificationCallback,
369                                             void* data,
370                                             VsmSubscriptionId* subscriptionId) noexcept;
371
372     /**
373      *  @see ::vsm_del_notification_callback
374      */
375     VsmStatus vsm_del_notification_callback(VsmSubscriptionId subscriptionId) noexcept;
376
377 private:
378     struct Status {
379         Status();
380         Status(VsmStatus status, const std::string& msg = "");
381         VsmStatus mVsmStatus;
382         std::string mMsg;
383     };
384     Status mStatus;
385
386     mutable std::mutex mStatusMutex;
387     std::unique_ptr<ipc::epoll::ThreadDispatcher> mInternalDispatcher;
388     std::unique_ptr<ipc::epoll::EventPoll> mEventPoll;
389     std::unique_ptr<ipc::Client> mClient;
390
391     bool isConnected() const;
392     bool isInternalDispatcherEnabled() const;
393     ipc::epoll::EventPoll& getEventPoll() const;
394     VsmStatus coverException(const std::function<void(void)>& worker) noexcept;
395     VsmStatus vsm_netdev_get_ip_addr(const char* zone,
396                                      const char* netdevId,
397                                      int type,
398                                      void* addr) noexcept;
399 };
400
401 #endif /* VASUM_CLIENT_IMPL_HPP */