LCOV - code coverage report
Current view: top level - modules-load - modules-load.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 0 106 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 96 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include <errno.h>
       4                 :            : #include <getopt.h>
       5                 :            : #include <libkmod.h>
       6                 :            : #include <limits.h>
       7                 :            : #include <string.h>
       8                 :            : #include <sys/stat.h>
       9                 :            : 
      10                 :            : #include "conf-files.h"
      11                 :            : #include "def.h"
      12                 :            : #include "fd-util.h"
      13                 :            : #include "fileio.h"
      14                 :            : #include "log.h"
      15                 :            : #include "main-func.h"
      16                 :            : #include "module-util.h"
      17                 :            : #include "pretty-print.h"
      18                 :            : #include "proc-cmdline.h"
      19                 :            : #include "string-util.h"
      20                 :            : #include "strv.h"
      21                 :            : #include "util.h"
      22                 :            : 
      23                 :            : static char **arg_proc_cmdline_modules = NULL;
      24                 :            : static const char conf_file_dirs[] = CONF_PATHS_NULSTR("modules-load.d");
      25                 :            : 
      26                 :          0 : STATIC_DESTRUCTOR_REGISTER(arg_proc_cmdline_modules, strv_freep);
      27                 :            : 
      28                 :          0 : static void systemd_kmod_log(void *data, int priority, const char *file, int line,
      29                 :            :                              const char *fn, const char *format, va_list args) {
      30                 :            : 
      31                 :            :         DISABLE_WARNING_FORMAT_NONLITERAL;
      32                 :          0 :         log_internalv(priority, 0, file, line, fn, format, args);
      33                 :            :         REENABLE_WARNING;
      34                 :          0 : }
      35                 :            : 
      36                 :          0 : static int add_modules(const char *p) {
      37                 :          0 :         _cleanup_strv_free_ char **k = NULL;
      38                 :            : 
      39                 :          0 :         k = strv_split(p, ",");
      40         [ #  # ]:          0 :         if (!k)
      41                 :          0 :                 return log_oom();
      42                 :            : 
      43         [ #  # ]:          0 :         if (strv_extend_strv(&arg_proc_cmdline_modules, k, true) < 0)
      44                 :          0 :                 return log_oom();
      45                 :            : 
      46                 :          0 :         return 0;
      47                 :            : }
      48                 :            : 
      49                 :          0 : static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
      50                 :            :         int r;
      51                 :            : 
      52         [ #  # ]:          0 :         if (proc_cmdline_key_streq(key, "modules_load")) {
      53                 :            : 
      54         [ #  # ]:          0 :                 if (proc_cmdline_value_missing(key, value))
      55                 :          0 :                         return 0;
      56                 :            : 
      57                 :          0 :                 r = add_modules(value);
      58         [ #  # ]:          0 :                 if (r < 0)
      59                 :          0 :                         return r;
      60                 :            :         }
      61                 :            : 
      62                 :          0 :         return 0;
      63                 :            : }
      64                 :            : 
      65                 :          0 : static int apply_file(struct kmod_ctx *ctx, const char *path, bool ignore_enoent) {
      66                 :          0 :         _cleanup_fclose_ FILE *f = NULL;
      67                 :            :         int r;
      68                 :            : 
      69         [ #  # ]:          0 :         assert(ctx);
      70         [ #  # ]:          0 :         assert(path);
      71                 :            : 
      72                 :          0 :         r = search_and_fopen_nulstr(path, "re", NULL, conf_file_dirs, &f);
      73         [ #  # ]:          0 :         if (r < 0) {
      74   [ #  #  #  # ]:          0 :                 if (ignore_enoent && r == -ENOENT)
      75                 :          0 :                         return 0;
      76                 :            : 
      77         [ #  # ]:          0 :                 return log_error_errno(r, "Failed to open %s: %m", path);
      78                 :            :         }
      79                 :            : 
      80         [ #  # ]:          0 :         log_debug("apply: %s", path);
      81                 :          0 :         for (;;) {
      82   [ #  #  #  # ]:          0 :                 _cleanup_free_ char *line = NULL;
      83                 :            :                 char *l;
      84                 :            :                 int k;
      85                 :            : 
      86                 :          0 :                 k = read_line(f, LONG_LINE_MAX, &line);
      87         [ #  # ]:          0 :                 if (k < 0)
      88         [ #  # ]:          0 :                         return log_error_errno(k, "Failed to read file '%s': %m", path);
      89         [ #  # ]:          0 :                 if (k == 0)
      90                 :          0 :                         break;
      91                 :            : 
      92                 :          0 :                 l = strstrip(line);
      93         [ #  # ]:          0 :                 if (isempty(l))
      94                 :          0 :                         continue;
      95         [ #  # ]:          0 :                 if (strchr(COMMENTS, *l))
      96                 :          0 :                         continue;
      97                 :            : 
      98                 :          0 :                 k = module_load_and_warn(ctx, l, true);
      99   [ #  #  #  # ]:          0 :                 if (k < 0 && r >= 0)
     100                 :          0 :                         r = k;
     101                 :            :         }
     102                 :            : 
     103                 :          0 :         return r;
     104                 :            : }
     105                 :            : 
     106                 :          0 : static int help(void) {
     107                 :          0 :         _cleanup_free_ char *link = NULL;
     108                 :            :         int r;
     109                 :            : 
     110                 :          0 :         r = terminal_urlify_man("systemd-modules-load.service", "8", &link);
     111         [ #  # ]:          0 :         if (r < 0)
     112                 :          0 :                 return log_oom();
     113                 :            : 
     114                 :          0 :         printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
     115                 :            :                "Loads statically configured kernel modules.\n\n"
     116                 :            :                "  -h --help             Show this help\n"
     117                 :            :                "     --version          Show package version\n"
     118                 :            :                "\nSee the %s for details.\n"
     119                 :            :                , program_invocation_short_name
     120                 :            :                , link
     121                 :            :         );
     122                 :            : 
     123                 :          0 :         return 0;
     124                 :            : }
     125                 :            : 
     126                 :          0 : static int parse_argv(int argc, char *argv[]) {
     127                 :            : 
     128                 :            :         enum {
     129                 :            :                 ARG_VERSION = 0x100,
     130                 :            :         };
     131                 :            : 
     132                 :            :         static const struct option options[] = {
     133                 :            :                 { "help",      no_argument,       NULL, 'h'           },
     134                 :            :                 { "version",   no_argument,       NULL, ARG_VERSION   },
     135                 :            :                 {}
     136                 :            :         };
     137                 :            : 
     138                 :            :         int c;
     139                 :            : 
     140         [ #  # ]:          0 :         assert(argc >= 0);
     141         [ #  # ]:          0 :         assert(argv);
     142                 :            : 
     143         [ #  # ]:          0 :         while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
     144                 :            : 
     145   [ #  #  #  # ]:          0 :                 switch (c) {
     146                 :            : 
     147                 :          0 :                 case 'h':
     148                 :          0 :                         return help();
     149                 :            : 
     150                 :          0 :                 case ARG_VERSION:
     151                 :          0 :                         return version();
     152                 :            : 
     153                 :          0 :                 case '?':
     154                 :          0 :                         return -EINVAL;
     155                 :            : 
     156                 :          0 :                 default:
     157                 :          0 :                         assert_not_reached("Unhandled option");
     158                 :            :                 }
     159                 :            : 
     160                 :          0 :         return 1;
     161                 :            : }
     162                 :            : 
     163                 :          0 : static int run(int argc, char *argv[]) {
     164                 :          0 :         _cleanup_(kmod_unrefp) struct kmod_ctx *ctx = NULL;
     165                 :            :         int r, k;
     166                 :            : 
     167                 :          0 :         r = parse_argv(argc, argv);
     168         [ #  # ]:          0 :         if (r <= 0)
     169                 :          0 :                 return r;
     170                 :            : 
     171                 :          0 :         log_setup_service();
     172                 :            : 
     173                 :          0 :         umask(0022);
     174                 :            : 
     175                 :          0 :         r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
     176         [ #  # ]:          0 :         if (r < 0)
     177         [ #  # ]:          0 :                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
     178                 :            : 
     179                 :          0 :         ctx = kmod_new(NULL, NULL);
     180         [ #  # ]:          0 :         if (!ctx) {
     181         [ #  # ]:          0 :                 log_error("Failed to allocate memory for kmod.");
     182                 :          0 :                 return -ENOMEM;
     183                 :            :         }
     184                 :            : 
     185                 :          0 :         kmod_load_resources(ctx);
     186                 :          0 :         kmod_set_log_fn(ctx, systemd_kmod_log, NULL);
     187                 :            : 
     188                 :          0 :         r = 0;
     189                 :            : 
     190         [ #  # ]:          0 :         if (argc > optind) {
     191                 :            :                 int i;
     192                 :            : 
     193         [ #  # ]:          0 :                 for (i = optind; i < argc; i++) {
     194                 :          0 :                         k = apply_file(ctx, argv[i], false);
     195   [ #  #  #  # ]:          0 :                         if (k < 0 && r == 0)
     196                 :          0 :                                 r = k;
     197                 :            :                 }
     198                 :            : 
     199                 :            :         } else {
     200         [ #  # ]:          0 :                 _cleanup_strv_free_ char **files = NULL;
     201                 :            :                 char **fn, **i;
     202                 :            : 
     203   [ #  #  #  # ]:          0 :                 STRV_FOREACH(i, arg_proc_cmdline_modules) {
     204                 :          0 :                         k = module_load_and_warn(ctx, *i, true);
     205   [ #  #  #  # ]:          0 :                         if (k < 0 && r == 0)
     206                 :          0 :                                 r = k;
     207                 :            :                 }
     208                 :            : 
     209                 :          0 :                 k = conf_files_list_nulstr(&files, ".conf", NULL, 0, conf_file_dirs);
     210         [ #  # ]:          0 :                 if (k < 0) {
     211         [ #  # ]:          0 :                         log_error_errno(k, "Failed to enumerate modules-load.d files: %m");
     212         [ #  # ]:          0 :                         if (r == 0)
     213                 :          0 :                                 r = k;
     214                 :          0 :                         return r;
     215                 :            :                 }
     216                 :            : 
     217   [ #  #  #  # ]:          0 :                 STRV_FOREACH(fn, files) {
     218                 :          0 :                         k = apply_file(ctx, *fn, true);
     219   [ #  #  #  # ]:          0 :                         if (k < 0 && r == 0)
     220                 :          0 :                                 r = k;
     221                 :            :                 }
     222                 :            :         }
     223                 :            : 
     224                 :          0 :         return r;
     225                 :            : }
     226                 :            : 
     227                 :          0 : DEFINE_MAIN_FUNCTION(run);

Generated by: LCOV version 1.14