LCOV - code coverage report
Current view: top level - portable - portabled.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 0 82 0.0 %
Date: 2019-08-23 13:36:53 Functions: 0 9 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 66 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include <sys/stat.h>
       4                 :            : #include <sys/types.h>
       5                 :            : 
       6                 :            : #include "sd-bus.h"
       7                 :            : #include "sd-daemon.h"
       8                 :            : 
       9                 :            : #include "alloc-util.h"
      10                 :            : #include "bus-util.h"
      11                 :            : #include "def.h"
      12                 :            : #include "main-func.h"
      13                 :            : #include "portabled-bus.h"
      14                 :            : #include "portabled-image-bus.h"
      15                 :            : #include "portabled.h"
      16                 :            : #include "process-util.h"
      17                 :            : #include "signal-util.h"
      18                 :            : 
      19                 :            : static Manager* manager_unref(Manager *m);
      20         [ #  # ]:          0 : DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref);
      21                 :            : 
      22                 :          0 : static int manager_new(Manager **ret) {
      23                 :          0 :         _cleanup_(manager_unrefp) Manager *m = NULL;
      24                 :            :         int r;
      25                 :            : 
      26         [ #  # ]:          0 :         assert(ret);
      27                 :            : 
      28                 :          0 :         m = new0(Manager, 1);
      29         [ #  # ]:          0 :         if (!m)
      30                 :          0 :                 return -ENOMEM;
      31                 :            : 
      32                 :          0 :         r = sd_event_default(&m->event);
      33         [ #  # ]:          0 :         if (r < 0)
      34                 :          0 :                 return r;
      35                 :            : 
      36                 :          0 :         r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
      37         [ #  # ]:          0 :         if (r < 0)
      38                 :          0 :                 return r;
      39                 :            : 
      40                 :          0 :         r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
      41         [ #  # ]:          0 :         if (r < 0)
      42                 :          0 :                 return r;
      43                 :            : 
      44                 :          0 :         (void) sd_event_set_watchdog(m->event, true);
      45                 :            : 
      46                 :          0 :         *ret = TAKE_PTR(m);
      47                 :          0 :         return 0;
      48                 :            : }
      49                 :            : 
      50                 :          0 : static Manager* manager_unref(Manager *m) {
      51         [ #  # ]:          0 :         assert(m);
      52                 :            : 
      53                 :          0 :         hashmap_free(m->image_cache);
      54                 :            : 
      55                 :          0 :         sd_event_source_unref(m->image_cache_defer_event);
      56                 :            : 
      57                 :          0 :         bus_verify_polkit_async_registry_free(m->polkit_registry);
      58                 :            : 
      59                 :          0 :         sd_bus_flush_close_unref(m->bus);
      60                 :          0 :         sd_event_unref(m->event);
      61                 :            : 
      62                 :          0 :         return mfree(m);
      63                 :            : }
      64                 :            : 
      65                 :          0 : static int manager_connect_bus(Manager *m) {
      66                 :            :         int r;
      67                 :            : 
      68         [ #  # ]:          0 :         assert(m);
      69         [ #  # ]:          0 :         assert(!m->bus);
      70                 :            : 
      71                 :          0 :         r = sd_bus_default_system(&m->bus);
      72         [ #  # ]:          0 :         if (r < 0)
      73         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to connect to system bus: %m");
      74                 :            : 
      75                 :          0 :         r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/portable1", "org.freedesktop.portable1.Manager", manager_vtable, m);
      76         [ #  # ]:          0 :         if (r < 0)
      77         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to add manager object vtable: %m");
      78                 :            : 
      79                 :          0 :         r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/portable1/image", "org.freedesktop.portable1.Image", image_vtable, bus_image_object_find, m);
      80         [ #  # ]:          0 :         if (r < 0)
      81         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to add image object vtable: %m");
      82                 :            : 
      83                 :          0 :         r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/portable1/image", bus_image_node_enumerator, m);
      84         [ #  # ]:          0 :         if (r < 0)
      85         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to add image enumerator: %m");
      86                 :            : 
      87                 :          0 :         r = sd_bus_request_name_async(m->bus, NULL, "org.freedesktop.portable1", 0, NULL, NULL);
      88         [ #  # ]:          0 :         if (r < 0)
      89         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to request name: %m");
      90                 :            : 
      91                 :          0 :         r = sd_bus_attach_event(m->bus, m->event, 0);
      92         [ #  # ]:          0 :         if (r < 0)
      93         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to attach bus to event loop: %m");
      94                 :            : 
      95                 :          0 :         (void) sd_bus_set_exit_on_disconnect(m->bus, true);
      96                 :            : 
      97                 :          0 :         return 0;
      98                 :            : }
      99                 :            : 
     100                 :          0 : static int manager_startup(Manager *m) {
     101                 :            :         int r;
     102                 :            : 
     103         [ #  # ]:          0 :         assert(m);
     104                 :            : 
     105                 :          0 :         r = manager_connect_bus(m);
     106         [ #  # ]:          0 :         if (r < 0)
     107                 :          0 :                 return r;
     108                 :            : 
     109                 :          0 :         return 0;
     110                 :            : }
     111                 :            : 
     112                 :          0 : static bool check_idle(void *userdata) {
     113                 :          0 :         Manager *m = userdata;
     114                 :            : 
     115                 :          0 :         return !m->operations;
     116                 :            : }
     117                 :            : 
     118                 :          0 : static int manager_run(Manager *m) {
     119         [ #  # ]:          0 :         assert(m);
     120                 :            : 
     121                 :          0 :         return bus_event_loop_with_idle(
     122                 :            :                         m->event,
     123                 :            :                         m->bus,
     124                 :            :                         "org.freedesktop.portable1",
     125                 :            :                         DEFAULT_EXIT_USEC,
     126                 :            :                         check_idle, m);
     127                 :            : }
     128                 :            : 
     129                 :          0 : static int run(int argc, char *argv[]) {
     130                 :          0 :         _cleanup_(manager_unrefp) Manager *m = NULL;
     131                 :            :         int r;
     132                 :            : 
     133                 :          0 :         log_setup_service();
     134                 :            : 
     135                 :          0 :         umask(0022);
     136                 :            : 
     137         [ #  # ]:          0 :         if (argc != 1)
     138         [ #  # ]:          0 :                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program takes no arguments.");
     139                 :            : 
     140         [ #  # ]:          0 :         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, -1) >= 0);
     141                 :            : 
     142                 :          0 :         r = manager_new(&m);
     143         [ #  # ]:          0 :         if (r < 0)
     144         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to allocate manager object: %m");
     145                 :            : 
     146                 :          0 :         r = manager_startup(m);
     147         [ #  # ]:          0 :         if (r < 0)
     148         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to fully start up daemon: %m");
     149                 :            : 
     150         [ #  # ]:          0 :         log_debug("systemd-portabled running as pid " PID_FMT, getpid_cached());
     151                 :          0 :         sd_notify(false,
     152                 :            :                   "READY=1\n"
     153                 :            :                   "STATUS=Processing requests...");
     154                 :            : 
     155                 :          0 :         r = manager_run(m);
     156                 :            : 
     157                 :          0 :         (void) sd_notify(false,
     158                 :            :                          "STOPPING=1\n"
     159                 :            :                          "STATUS=Shutting down...");
     160         [ #  # ]:          0 :         log_debug("systemd-portabled stopped as pid " PID_FMT, getpid_cached());
     161                 :          0 :         return r;
     162                 :            : }
     163                 :            : 
     164                 :          0 : DEFINE_MAIN_FUNCTION(run);

Generated by: LCOV version 1.14