Vasum Wrapper: wrap old api client library #2
[platform/core/security/vasum.git] / client / vasum-client.h
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 the public API for Vasum Client
24  *
25  * @par Example usage:
26  * @code
27 #include <stdio.h>
28 #include "client/vasum-client.h"
29
30 int main(int argc, char** argv)
31 {
32     VsmStatus status;
33     VsmClient client;
34     VsmArrayString values = NULL;
35     int ret = 0;
36
37     status = vsm_start_glib_loop(); // start glib loop (if not started any yet)
38     if (VSMCLIENT_SUCCESS != status) {
39         // error!
40         return 1;
41     }
42
43     client = vsm_client_create(); // create client handle
44     if (NULL == client) {
45         // error!
46         ret = 1;
47         goto finish;
48     }
49
50     status = vsm_connect(client); // connect to dbus
51     if (VSMCLIENT_SUCCESS != status) {
52         // error!
53         ret = 1;
54         goto finish;
55     }
56
57     status = vsm_get_zone_ids(client, &values);
58     if (VSMCLIENT_SUCCESS != status) {
59         // error!
60         ret = 1;
61         goto finish;
62     }
63
64     // print array
65     for (VsmArrayString iValues = values; *iValues; iValues++) {
66         printf("%s\n", *iValues);
67     }
68
69 finish:
70     vsm_array_string_free(values); // free memory
71     vsm_client_free(client); // destroy client handle
72     vsm_stop_glib_loop(); // stop the glib loop (use only with vsm_start_glib_loop)
73     return ret;
74 }
75  @endcode
76  */
77
78 #ifndef VASUM_CLIENT_H
79 #define VASUM_CLIENT_H
80
81 #include <stdint.h>
82 #include <sys/stat.h>
83 #include <netinet/ip.h>
84 #include <linux/if_link.h>
85
86 #ifdef __cplusplus
87 extern "C"
88 {
89 #endif
90
91 /**
92  * vasum-server's client pointer.
93  */
94 typedef void* VsmClient;
95
96 /**
97  * NULL-terminated string type.
98  *
99  * @sa vsm_array_string_free
100  */
101 typedef char* VsmString;
102
103 /**
104  * NULL-terminated array of strings type.
105  *
106  * @sa vsm_string_free
107  */
108 typedef VsmString* VsmArrayString;
109
110 /**
111  * Completion status of communication function.
112  */
113 typedef enum {
114     VSMCLIENT_CUSTOM_ERROR,     /**< User specified error */
115     VSMCLIENT_IO_ERROR,         /**< Input/Output error */
116     VSMCLIENT_OPERATION_FAILED, /**< Operation failed */
117     VSMCLIENT_INVALID_ARGUMENT, /**< Invalid argument */
118     VSMCLIENT_OTHER_ERROR,      /**< Other error */
119     VSMCLIENT_SUCCESS           /**< Success */
120 } VsmStatus;
121
122 /**
123  * Subscription id
124  */
125 typedef unsigned int VsmSubscriptionId;
126
127 /**
128  * States of zone
129  */
130 typedef enum {
131     STOPPED,
132     STARTING,
133     RUNNING,
134     STOPPING,
135     ABORTING,
136     FREEZING,
137     FROZEN,
138     THAWED,
139     LOCKED,
140     MAX_STATE,
141     ACTIVATING = 128
142 } VsmZoneState;
143
144 /**
145  * Zone information structure
146  */
147 typedef struct {
148     char* id;
149     int terminal;
150     VsmZoneState state;
151     char *rootfs_path;
152 } VsmZoneStructure;
153
154 /**
155  * Zone information
156  */
157 typedef VsmZoneStructure* VsmZone;
158
159 /**
160  * Netowrk device type
161  */
162 typedef enum {
163     VSMNETDEV_VETH,
164     VSMNETDEV_PHYS,
165     VSMNETDEV_MACVLAN
166 } VsmNetdevType;
167
168 /**
169  * Network device information structure
170  */
171 typedef struct {
172     char* name;
173     VsmNetdevType type;
174 } VsmNetdevStructure;
175
176 /**
177  * Network device information
178  */
179 typedef VsmNetdevStructure* VsmNetdev;
180
181 /**
182  * File type
183  */
184 typedef enum {
185     VSMFILE_DIRECTORY,
186     VSMFILE_FIFO,
187     VSMFILE_REGULAR
188 } VsmFileType;
189
190 #ifndef __VASUM_WRAPPER_SOURCE__
191 /**
192  * Start glib loop.
193  *
194  * Do not call this function if an application creates a glib loop itself.
195  * Otherwise, call it before any other function from this library.
196  *
197  * @return status of this function call
198  */
199 VsmStatus vsm_start_glib_loop();
200
201 /**
202  * Stop glib loop.
203  *
204  * Call only if vsm_start_glib_loop() was called.
205  *
206  * @return status of this function call
207  */
208 VsmStatus vsm_stop_glib_loop();
209
210 /**
211  * Create a new vasum-server's client.
212  *
213  * @return Created client pointer or NULL on failure.
214  */
215 VsmClient vsm_client_create();
216
217 /**
218  * Release client resources.
219  *
220  * @param[in] client vasum-server's client
221  */
222 void vsm_client_free(VsmClient client);
223
224 /**
225  * Get status code of last vasum-server communication.
226  *
227  * @param[in] client vasum-server's client
228  * @return status of this function call
229  */
230 VsmStatus vsm_get_status(VsmClient client);
231
232 /**
233  * Get status message of the last vasum-server communication.
234  *
235  * @param[in] client vasum-server's client
236  * @return last status message from vasum-server communication
237  */
238 const char* vsm_get_status_message(VsmClient client);
239
240 /**
241  * Connect client to the vasum-server.
242  *
243  * @param[in] client vasum-server's client
244  * @return status of this function call
245  */
246 VsmStatus vsm_connect(VsmClient client);
247
248 /**
249  * Connect client to the vasum-server via custom address.
250  *
251  * @param[in] client vasum-server's client
252  * @param[in] address dbus address
253  * @return status of this function call
254  */
255 VsmStatus vsm_connect_custom(VsmClient client, const char* address);
256
257 /**
258  * Release VsmArrayString.
259  *
260  * @param[in] astring VsmArrayString
261  */
262 void vsm_array_string_free(VsmArrayString astring);
263
264 /**
265  * Release VsmString.
266  *
267  * @param string VsmString
268  */
269 void vsm_string_free(VsmString string);
270
271 /**
272  * Release VsmZone
273  *
274  * @param zone VsmZone
275  */
276 void vsm_zone_free(VsmZone zone);
277
278 /**
279  * Release VsmNetdev
280  *
281  * @param netdev VsmNetdev
282  */
283 void vsm_netdev_free(VsmNetdev netdev);
284
285 /**
286  * @name Host API
287  *
288  * Functions using org.tizen.vasum.host.manager D-Bus interface.
289  *
290  * @{
291  */
292
293 /**
294  * Zone's D-Bus state change callback function signature.
295  *
296  * @param[in] zoneId affected zone id
297  * @param[in] address new D-Bus address
298  * @param data custom user's data pointer passed to vsm_add_state_callback() function
299  */
300 typedef void (*VsmZoneDbusStateCallback)(const char* zoneId,
301                                              const char* address,
302                                              void* data);
303
304 /**
305  * Get dbus address of each zone.
306  *
307  * @param[in] client vasum-server's client
308  * @param[out] keys array of zones name
309  * @param[out] values array of zones dbus address
310  * @return status of this function call
311  * @post keys[i] corresponds to values[i]
312  * @remark Use vsm_array_string_free() to free memory occupied by @p keys and @p values.
313  */
314 VsmStatus vsm_get_zone_dbuses(VsmClient client, VsmArrayString* keys, VsmArrayString* values);
315
316 /**
317  * Get zones name.
318  *
319  * @param[in] client vasum-server's client
320  * @param[out] array array of zones name
321  * @return status of this function call
322  * @remark Use vsm_array_string_free() to free memory occupied by @p array.
323  */
324 VsmStatus vsm_get_zone_ids(VsmClient client, VsmArrayString* array);
325
326 /**
327  * Get active (foreground) zone name.
328  *
329  * @param[in] client vasum-server's client
330  * @param[out] id active zone name
331  * @return status of this function call
332  * @remark Use @p vsm_string_free() to free memory occupied by @p id.
333  */
334 VsmStatus vsm_get_active_zone_id(VsmClient client, VsmString* id);
335
336 /**
337  * Get zone name of process with given pid.
338  *
339  * @param[in] client vasum-server's client
340  * @param[in] pid process id
341  * @param[out] id active zone name
342  * @return status of this function call
343  * @remark Use @p vsm_string_free() to free memory occupied by @p id.
344  */
345 VsmStatus vsm_lookup_zone_by_pid(VsmClient client, int pid, VsmString* id);
346
347 /**
348  * Get zone informations of zone with given id.
349  *
350  * @param[in] client vasum-server's client
351  * @param[in] id zone name
352  * @param[out] zone zone informations
353  * @return status of this function call
354  * @remark Use @p vsm_zone_free() to free memory occupied by @p zone
355  */
356 VsmStatus vsm_lookup_zone_by_id(VsmClient client, const char* id, VsmZone* zone);
357
358 /**
359  * Get zone name with given terminal.
360  *
361  * @param[in] client vasum-server's client
362  * @param[in] terminal terminal id
363  * @param[out] id zone name with given terminal
364  * @return status of this function call
365  * @remark Use @p vsm_string_free() to free memory occupied by @p id.
366  */
367 VsmStatus vsm_lookup_zone_by_terminal_id(VsmClient client, int terminal, VsmString* id);
368
369 /**
370  * Set active (foreground) zone.
371  *
372  * @param[in] client vasum-server's client
373  * @param[in] id zone name
374  * @return status of this function call
375  */
376 VsmStatus vsm_set_active_zone(VsmClient client, const char* id);
377
378 /**
379  * Create and add zone
380  *
381  * @param[in] client vasum-server's client
382  * @param[in] id zone id
383  * @param[in] tname template name, NULL is equivalent to "default"
384  * @return status of this function call
385  */
386 VsmStatus vsm_create_zone(VsmClient client, const char* id, const char* tname);
387
388 /**
389  * Remove zone
390  *
391  * @param[in] client vasum-server's client
392  * @param[in] id zone id
393  * @param[in] force if 0 data will be kept, otherwise data will be lost
394  * @return status of this function call
395  */
396 VsmStatus vsm_destroy_zone(VsmClient client, const char* id, int force);
397
398 /**
399  * Shutdown zone
400  *
401  * @param[in] client vasum-server's client
402  * @param[in] id zone name
403  * @return status of this function call
404  */
405 VsmStatus vsm_shutdown_zone(VsmClient client, const char* id);
406
407 /**
408  * Start zone
409  *
410  * @param[in] client vasum-server's client
411  * @param[in] id zone name
412  * @return status of this function call
413  */
414 VsmStatus vsm_start_zone(VsmClient client, const char* id);
415
416 /**
417  * Lock zone
418  *
419  * @param[in] client vasum-server's client
420  * @param[in] id zone name
421  * @return status of this function call
422  */
423 VsmStatus vsm_lock_zone(VsmClient client, const char* id);
424
425 /**
426  * Unlock zone
427  *
428  * @param[in] client vasum-server's client
429  * @param[in] id zone name
430  * @return status of this function call
431  */
432 VsmStatus vsm_unlock_zone(VsmClient client, const char* id);
433
434 /**
435  * Register dbus state change callback function.
436  *
437  * @note The callback function will be invoked on a different thread.
438  *
439  * @param[in] client vasum-server's client
440  * @param[in] zoneDbusStateCallback callback function
441  * @param[in] data some extra data that will be passed to callback function
442  * @param[out] subscriptionId subscription identifier that can be used to unsubscribe signal,
443  *                      pointer can be NULL.
444  * @return status of this function call
445  */
446 VsmStatus vsm_add_state_callback(VsmClient client,
447                                  VsmZoneDbusStateCallback zoneDbusStateCallback,
448                                  void* data,
449                                  VsmSubscriptionId* subscriptionId);
450
451 /**
452  * Unregister dbus state change callback function.
453  *
454  * @param[in] client vasum-server's client
455  * @param[in] subscriptionId subscription identifier returned by vsm_add_state_callback
456  * @return status of this function call
457  */
458 VsmStatus vsm_del_state_callback(VsmClient client, VsmSubscriptionId subscriptionId);
459
460 /**
461  * Grant access to device
462  *
463  * @param[in] client vasum-server's client
464  * @param[in] zone zone name
465  * @param[in] device device path
466  * @param[in] flags access flags
467  * @return status of this function call
468  */
469 VsmStatus vsm_grant_device(VsmClient client,
470                            const char* zone,
471                            const char* device,
472                            uint32_t flags);
473
474 /**
475  * Revoke access to device
476  *
477  * @param[in] client vasum-server's client
478  * @param[in] zone zone name
479  * @param[in] device device path
480  * @return status of this function call
481  */
482 VsmStatus vsm_revoke_device(VsmClient client, const char* zone, const char* device);
483
484 /**
485  * Get array of netdev from given zone
486  *
487  * @param[in] client vasum-server's client
488  * @param[in] zone zone name
489  * @param[out] netdevIds array of netdev id
490  * @return status of this function call
491  * @remark Use vsm_array_string_free() to free memory occupied by @p netdevIds.
492  */
493 VsmStatus vsm_zone_get_netdevs(VsmClient client, const char* zone, VsmArrayString* netdevIds);
494
495 /**
496  * Get ipv4 address for given netdevId
497  *
498  * @param[in] client vasum-server's client
499  * @param[in] zone zone name
500  * @param[in] netdevId netdev id
501  * @param[out] addr ipv4 address
502  * @return status of this function call
503  */
504 VsmStatus vsm_netdev_get_ipv4_addr(VsmClient client,
505                                    const char* zone,
506                                    const char* netdevId,
507                                    struct in_addr *addr);
508
509 /**
510  * Get ipv6 address for given netdevId
511  *
512  * @param[in] client vasum-server's client
513  * @param[in] zone zone name
514  * @param[in] netdevId netdev id
515  * @param[out] addr ipv6 address
516  * @return status of this function call
517  */
518 VsmStatus vsm_netdev_get_ipv6_addr(VsmClient client,
519                                    const char* zone,
520                                    const char* netdevId,
521                                    struct in6_addr *addr);
522
523 /**
524  * Set ipv4 address for given netdevId
525  *
526  * @param[in] client vasum-server's client
527  * @param[in] zone zone name
528  * @param[in] netdevId netdev id
529  * @param[in] addr ipv4 address
530  * @param[in] prefix bit-length of the network prefix
531  * @return status of this function call
532  */
533 VsmStatus vsm_netdev_set_ipv4_addr(VsmClient client,
534                                    const char* zone,
535                                    const char* netdevId,
536                                    struct in_addr *addr,
537                                    int prefix);
538
539 /**
540  * Set ipv6 address for given netdevId
541  *
542  * @param[in] client vasum-server's client
543  * @param[in] zone zone name
544  * @param[in] netdevId netdev id
545  * @param[in] addr ipv6 address
546  * @param[in] prefix bit-length of the network prefix
547  * @return status of this function call
548  */
549 VsmStatus vsm_netdev_set_ipv6_addr(VsmClient client,
550                                    const char* zone,
551                                    const char* netdevId,
552                                    struct in6_addr *addr,
553                                    int prefix);
554
555 /**
556  * Remove ipv4 address from netdev
557  *
558  * @param[in] client vasum-server's client
559  * @param[in] zone zone name
560  * @param[in] netdevId network device id
561  * @param[in] addr ipv4 address
562  * @param[in] prefix bit-length of the network prefix
563  * @return status of this function call
564  */
565 VsmStatus vsm_netdev_del_ipv4_addr(VsmClient client,
566                                    const char* zone,
567                                    const char* netdevId,
568                                    struct in_addr* addr,
569                                    int prefix);
570
571 /**
572  * Remove ipv6 address from netdev
573  *
574  * @param[in] client vasum-server's client
575  * @param[in] zone zone name
576  * @param[in] netdevId network device id
577  * @param[in] addr ipv6 address
578  * @param[in] prefix bit-length of the network prefix
579  * @return status of this function call
580  */
581 VsmStatus vsm_netdev_del_ipv6_addr(VsmClient client,
582                                    const char* zone,
583                                    const char* netdevId,
584                                    struct in6_addr* addr,
585                                    int prefix);
586
587 /**
588  * Turn up a network device in the zone
589  *
590  * @param[in] client vasum-server's client
591  * @param[in] zone zone name
592  * @param[in] netdevId netdev id
593  * @return status of this function call
594  */
595 VsmStatus vsm_netdev_up(VsmClient client,
596                         const char* zone,
597                         const char* netdevId);
598
599 /**
600  * Turn down a network device in the zone
601  *
602  * @param[in] client vasum-server's client
603  * @param[in] zone zone name
604  * @param[in] netdevId netdev id
605  * @return status of this function call
606  */
607 VsmStatus vsm_netdev_down(VsmClient client,
608                           const char* zone,
609                           const char* netdevId);
610
611
612 /**
613  * Create veth netdev in zone
614  *
615  * @param[in] client vasum-server's client
616  * @param[in] zone zone name
617  * @param[in] zoneDev in host network device id
618  * @param[in] hostDev in zone network device id
619  * @return status of this function call
620  */
621 VsmStatus vsm_create_netdev_veth(VsmClient client,
622                                  const char* zone,
623                                  const char* zoneDev,
624                                  const char* hostDev);
625 /**
626  * Create macvlab in zone
627  *
628  * @param[in] client vasum-server's client
629  * @param[in] zone zone name
630  * @param[in] zoneDev in host network device id
631  * @param[in] hostDev in zone network device id
632  * @return status of this function call
633  */
634 VsmStatus vsm_create_netdev_macvlan(VsmClient client,
635                                     const char* zone,
636                                     const char* zoneDev,
637                                     const char* hostDev,
638                                     enum macvlan_mode mode);
639 /**
640  * Create/move phys netdev in/to zone
641  *
642  * @param[in] client vasum-server's client
643  * @param[in] zone zone name
644  * @param[in] devId network device id
645  * @return status of this function call
646  */
647 VsmStatus vsm_create_netdev_phys(VsmClient client, const char* zone, const char* devId);
648
649 /**
650  * Get netdev informations
651  *
652  * @param[in] client vasum-server's client
653  * @param[in] zone zone name
654  * @param[in] netdevId network device id
655  * @param[out] netdev netdev informations
656  * @return status of this function call
657  * @remark Use vsm_netdev_free() to free memory occupied by @p netdev.
658  */
659 VsmStatus vsm_lookup_netdev_by_name(VsmClient client,
660                                     const char* zone,
661                                     const char* netdevId,
662                                     VsmNetdev* netdev);
663
664 /**
665  * Remove netdev from zone
666  *
667  * @param[in] client vasum-server's client
668  * @param[in] zone zone name
669  * @param[in] devId network device id
670  * @return status of this function call
671  */
672 VsmStatus vsm_destroy_netdev(VsmClient client, const char* zone, const char* devId);
673
674 /**
675  * Create file, directory or pipe in zone
676  *
677  * Declare file, directory or pipe that will be created while zone startup
678  *
679  * @param[in] client vasum-server's client
680  * @param[in] type file type
681  * @param[in] zone zone id
682  * @param[in] path path to file
683  * @param[in] flags if O_CREAT bit is set then file will be created in zone,
684  *                  otherwise file will by copied from host;
685  *                  it is meaningful only when O_CREAT is set
686  * @param[in] mode mode of file
687  * @return status of this function call
688  */
689 VsmStatus vsm_declare_file(VsmClient client,
690                            const char* zone,
691                            VsmFileType type,
692                            const char* path,
693                            int32_t flags,
694                            mode_t mode);
695
696 /**
697  * Create mount point in zone
698  *
699  * Declare mount that will be created while zone startup
700  * Parameters are passed to mount system function
701  *
702  * @param[in] client vasum-server's client
703  * @param[in] source device path (path in host)
704  * @param[in] zone zone id
705  * @param[in] target mount point (path in zone)
706  * @param[in] type filesystem type
707  * @param[in] flags mount flags as in mount function
708  * @param[in] data additional data as in mount function
709  * @return status of this function call
710  */
711 VsmStatus vsm_declare_mount(VsmClient client,
712                             const char* source,
713                             const char* zone,
714                             const char* target,
715                             const char* type,
716                             uint64_t flags,
717                             const char* data);
718
719 /**
720  * Create link in zone
721  *
722  * Declare link that will be created while zone startup
723  * Parameters are passed to link system function
724  *
725  * @param[in] client vasum-server's client
726  * @param[in] source path to link source (in host)
727  * @param[in] zone zone id
728  * @param[in] target path to link name (in zone)
729  * @return status of this function call
730  */
731 VsmStatus vsm_declare_link(VsmClient client,
732                            const char *source,
733                            const char* zone,
734                            const char *target);
735
736 /**
737  * Get all declarations
738  *
739  * Gets all declarations of resourcies
740  * (@see ::vsm_declare_link, @see ::vsm_declare_mount, @see ::vsm_declare_linki)
741  *
742  * @param[in] client vasum-server's client
743  * @param[in] zone zone id
744  * @param[out] declarations array of declarations id
745  * @return status of this function call
746  */
747 VsmStatus vsm_list_declarations(VsmClient client,
748                                 const char* zone,
749                                 VsmArrayString* declarations);
750
751 /**
752  * Remove declaration
753  *
754  * Removes given declaration by its id (@see ::vsm_list_declarations)
755  *
756  * @param[in] client vasum-server's client
757  * @param[in] zone zone id
758  * @param[in] declaration declaration id
759  * @return status of this function call
760  */
761 VsmStatus vsm_remove_declaration(VsmClient client,
762                                  const char* zone,
763                                  VsmString declaration);
764
765
766 /** @} Host API */
767
768
769 /**
770  * @name Zone API
771  *
772  * Functions using org.tizen.vasum.zone.manager D-Bus interface.
773  *
774  * @{
775  */
776
777 /**
778  * Notification callback function signature.
779  *
780  * @param[in] zone source zone
781  * @param[in] application sending application name
782  * @param[in] message notification message
783  * @param data custom user's data pointer passed to vsm_add_notification_callback()
784  */
785 typedef void (*VsmNotificationCallback)(const char* zone,
786                                         const char* application,
787                                         const char* message,
788                                         void* data);
789 /**
790  * Send message to active zone.
791  *
792  * @param[in] client vasum-server's client
793  * @param[in] application application name
794  * @param[in] message message
795  * @return status of this function call
796  */
797 VsmStatus vsm_notify_active_zone(VsmClient client, const char* application, const char* message);
798
799 /**
800  * Move file between zones.
801  *
802  * @param[in] client vasum-server's client
803  * @param[in] destZone destination zone id
804  * @param[in] path path to moved file
805  * @return status of this function call
806  */
807 VsmStatus vsm_file_move_request(VsmClient client, const char* destZone, const char* path);
808
809 /**
810  * Register notification callback function.
811  *
812  * @note The callback function will be invoked on a different thread.
813  *
814  * @param[in] client vasum-server's client
815  * @param[in] notificationCallback callback function
816  * @param[in] data some extra data that will be passed to callback function
817  * @param[out] subscriptionId subscription identifier that can be used to unsubscribe signal,
818  *                      pointer can be NULL.
819  * @return status of this function call
820  */
821 VsmStatus vsm_add_notification_callback(VsmClient client,
822                                         VsmNotificationCallback notificationCallback,
823                                         void* data,
824                                         VsmSubscriptionId* subscriptionId);
825
826 /**
827  * Unregister notification callback function.
828  *
829  * @param[in] client vasum-server's client
830  * @param[in] subscriptionId subscription identifier returned by vsm_add_notification_callback
831  * @return status of this function call
832  */
833 VsmStatus vsm_del_notification_callback(VsmClient client, VsmSubscriptionId subscriptionId);
834
835 #endif /* __VASUM_WRAPPER_SOURCE__ */
836
837 /** @} Zone API */
838
839 #ifdef __cplusplus
840 }
841 #endif
842
843 #endif /* VASUM_CLIENT_H */