LCOV - code coverage report
Current view: top level - shared - bus-util.h (source / functions) Hit Total Coverage
Test: systemd test coverage Lines: 5 6 83.3 %
Date: 2015-07-29 18:47:03 Functions: 5 6 83.3 %

          Line data    Source code
       1             : /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
       2             : 
       3             : #pragma once
       4             : 
       5             : /***
       6             :   This file is part of systemd.
       7             : 
       8             :   Copyright 2013 Lennart Poettering
       9             : 
      10             :   systemd is free software; you can redistribute it and/or modify it
      11             :   under the terms of the GNU Lesser General Public License as published by
      12             :   the Free Software Foundation; either version 2.1 of the License, or
      13             :   (at your option) any later version.
      14             : 
      15             :   systemd is distributed in the hope that it will be useful, but
      16             :   WITHOUT ANY WARRANTY; without even the implied warranty of
      17             :   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
      18             :   Lesser General Public License for more details.
      19             : 
      20             :   You should have received a copy of the GNU Lesser General Public License
      21             :   along with systemd; If not, see <http://www.gnu.org/licenses/>.
      22             : ***/
      23             : 
      24             : #include "sd-event.h"
      25             : #include "sd-bus.h"
      26             : #include "hashmap.h"
      27             : #include "install.h"
      28             : #include "time-util.h"
      29             : 
      30             : typedef enum BusTransport {
      31             :         BUS_TRANSPORT_LOCAL,
      32             :         BUS_TRANSPORT_REMOTE,
      33             :         BUS_TRANSPORT_MACHINE,
      34             :         _BUS_TRANSPORT_MAX,
      35             :         _BUS_TRANSPORT_INVALID = -1
      36             : } BusTransport;
      37             : 
      38             : typedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
      39             : 
      40             : struct bus_properties_map {
      41             :         const char *member;
      42             :         const char *signature;
      43             :         bus_property_set_t set;
      44             :         size_t offset;
      45             : };
      46             : 
      47             : int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
      48             : 
      49             : int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map,  void *userdata);
      50             : int bus_message_map_properties_changed(sd_bus_message *m, const struct bus_properties_map *map, void *userdata);
      51             : int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map, void *userdata);
      52             : 
      53             : int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name);
      54             : 
      55             : typedef bool (*check_idle_t)(void *userdata);
      56             : 
      57             : int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t timeout, check_idle_t check_idle, void *userdata);
      58             : 
      59             : int bus_name_has_owner(sd_bus *c, const char *name, sd_bus_error *error);
      60             : 
      61             : int bus_check_peercred(sd_bus *c);
      62             : 
      63             : int bus_test_polkit(sd_bus_message *call, int capability, const char *action, uid_t good_user, bool *_challenge, sd_bus_error *e);
      64             : 
      65             : int bus_verify_polkit_async(sd_bus_message *call, int capability, const char *action, bool interactive, uid_t good_user, Hashmap **registry, sd_bus_error *error);
      66             : void bus_verify_polkit_async_registry_free(Hashmap *registry);
      67             : 
      68             : int bus_open_system_systemd(sd_bus **_bus);
      69             : int bus_open_user_systemd(sd_bus **_bus);
      70             : 
      71             : int bus_open_transport(BusTransport transport, const char *host, bool user, sd_bus **bus);
      72             : int bus_open_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus);
      73             : 
      74             : int bus_print_property(const char *name, sd_bus_message *property, bool all);
      75             : int bus_print_all_properties(sd_bus *bus, const char *dest, const char *path, char **filter, bool all);
      76             : 
      77             : int bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
      78             : 
      79             : #define bus_property_get_usec ((sd_bus_property_get_t) NULL)
      80             : #define bus_property_set_usec ((sd_bus_property_set_t) NULL)
      81             : 
      82             : assert_cc(sizeof(int) == sizeof(int32_t));
      83             : #define bus_property_get_int ((sd_bus_property_get_t) NULL)
      84             : 
      85             : assert_cc(sizeof(unsigned) == sizeof(unsigned));
      86             : #define bus_property_get_unsigned ((sd_bus_property_get_t) NULL)
      87             : 
      88             : /* On 64bit machines we can use the default serializer for size_t and
      89             :  * friends, otherwise we need to cast this manually */
      90             : #if __SIZEOF_SIZE_T__ == 8
      91             : #define bus_property_get_size ((sd_bus_property_get_t) NULL)
      92             : #else
      93             : int bus_property_get_size(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
      94             : #endif
      95             : 
      96             : #if __SIZEOF_LONG__ == 8
      97             : #define bus_property_get_long ((sd_bus_property_get_t) NULL)
      98             : #define bus_property_get_ulong ((sd_bus_property_get_t) NULL)
      99             : #else
     100             : int bus_property_get_long(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
     101             : int bus_property_get_ulong(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
     102             : #endif
     103             : 
     104             : /* uid_t and friends on Linux 32 bit. This means we can just use the
     105             :  * default serializer for 32bit unsigned, for serializing it, and map
     106             :  * it to NULL here */
     107             : assert_cc(sizeof(uid_t) == sizeof(uint32_t));
     108             : #define bus_property_get_uid ((sd_bus_property_get_t) NULL)
     109             : 
     110             : assert_cc(sizeof(gid_t) == sizeof(uint32_t));
     111             : #define bus_property_get_gid ((sd_bus_property_get_t) NULL)
     112             : 
     113             : assert_cc(sizeof(pid_t) == sizeof(uint32_t));
     114             : #define bus_property_get_pid ((sd_bus_property_get_t) NULL)
     115             : 
     116             : assert_cc(sizeof(mode_t) == sizeof(uint32_t));
     117             : #define bus_property_get_mode ((sd_bus_property_get_t) NULL)
     118             : 
     119             : int bus_log_parse_error(int r);
     120             : int bus_log_create_error(int r);
     121             : 
     122             : typedef struct UnitInfo {
     123             :         const char *machine;
     124             :         const char *id;
     125             :         const char *description;
     126             :         const char *load_state;
     127             :         const char *active_state;
     128             :         const char *sub_state;
     129             :         const char *following;
     130             :         const char *unit_path;
     131             :         uint32_t job_id;
     132             :         const char *job_type;
     133             :         const char *job_path;
     134             : } UnitInfo;
     135             : 
     136             : int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u);
     137             : 
     138       31146 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_unref);
     139           5 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_flush_close_unref);
     140           2 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_slot*, sd_bus_slot_unref);
     141      155723 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_message*, sd_bus_message_unref);
     142          27 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_creds*, sd_bus_creds_unref);
     143             : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_track*, sd_bus_track_unref);
     144             : 
     145             : #define _cleanup_bus_unref_ _cleanup_(sd_bus_unrefp)
     146             : #define _cleanup_bus_flush_close_unref_ _cleanup_(sd_bus_flush_close_unrefp)
     147             : #define _cleanup_bus_slot_unref_ _cleanup_(sd_bus_slot_unrefp)
     148             : #define _cleanup_bus_message_unref_ _cleanup_(sd_bus_message_unrefp)
     149             : #define _cleanup_bus_creds_unref_ _cleanup_(sd_bus_creds_unrefp)
     150             : #define _cleanup_bus_track_unref_ _cleanup_(sd_bus_slot_unrefp)
     151             : #define _cleanup_bus_error_free_ _cleanup_(sd_bus_error_free)
     152             : 
     153             : #define BUS_DEFINE_PROPERTY_GET_ENUM(function, name, type)              \
     154             :         int function(sd_bus *bus,                                       \
     155             :                      const char *path,                                  \
     156             :                      const char *interface,                             \
     157             :                      const char *property,                              \
     158             :                      sd_bus_message *reply,                             \
     159             :                      void *userdata,                                    \
     160             :                      sd_bus_error *error) {                             \
     161             :                                                                         \
     162             :                 const char *value;                                      \
     163             :                 type *field = userdata;                                 \
     164             :                 int r;                                                  \
     165             :                                                                         \
     166             :                 assert(bus);                                            \
     167             :                 assert(reply);                                          \
     168             :                 assert(field);                                          \
     169             :                                                                         \
     170             :                 value = strempty(name##_to_string(*field));             \
     171             :                                                                         \
     172             :                 r = sd_bus_message_append_basic(reply, 's', value);     \
     173             :                 if (r < 0)                                              \
     174             :                         return r;                                       \
     175             :                                                                         \
     176             :                 return 1;                                               \
     177             :         }                                                               \
     178             :         struct __useless_struct_to_allow_trailing_semicolon__
     179             : 
     180             : #define BUS_PROPERTY_DUAL_TIMESTAMP(name, offset, flags) \
     181             :         SD_BUS_PROPERTY(name, "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, realtime), (flags)), \
     182             :         SD_BUS_PROPERTY(name "Monotonic", "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, monotonic), (flags))
     183             : 
     184             : int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignment);
     185             : 
     186             : typedef struct BusWaitForJobs BusWaitForJobs;
     187             : 
     188             : int bus_wait_for_jobs_new(sd_bus *bus, BusWaitForJobs **ret);
     189             : void bus_wait_for_jobs_free(BusWaitForJobs *d);
     190             : int bus_wait_for_jobs_add(BusWaitForJobs *d, const char *path);
     191             : int bus_wait_for_jobs(BusWaitForJobs *d, bool quiet);
     192             : int bus_wait_for_jobs_one(BusWaitForJobs *d, const char *path, bool quiet);
     193             : 
     194           0 : DEFINE_TRIVIAL_CLEANUP_FUNC(BusWaitForJobs*, bus_wait_for_jobs_free);
     195             : 
     196             : int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet, UnitFileChange **changes, unsigned *n_changes);
     197             : 
     198             : int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id, const char *external_id, char **ret_path);
     199             : int bus_path_decode_unique(const char *path, const char *prefix, char **ret_sender, char **ret_external);
     200             : 
     201             : bool is_kdbus_wanted(void);
     202             : bool is_kdbus_available(void);

Generated by: LCOV version 1.11