1 /* 2 * libkmod - interface to kernel module operations 3 * 4 * Copyright (C) 2011-2013 ProFUSION embedded systems 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #include <assert.h> 21 #include <ctype.h> 22 #include <dirent.h> 23 #include <errno.h> 24 #include <fnmatch.h> 25 #include <inttypes.h> 26 #include <limits.h> 27 #include <stdarg.h> 28 #include <stddef.h> 29 #include <stdio.h> 30 #include <stdlib.h> 31 #include <string.h> 32 #include <unistd.h> 33 #include <sys/mman.h> 34 #include <sys/stat.h> 35 #include <sys/syscall.h> 36 #include <sys/types.h> 37 #include <sys/wait.h> 38 #ifdef HAVE_LINUX_MODULE_H 39 #include <linux/module.h> 40 #endif 41 42 #include <shared/util.h> 43 44 #include "libkmod.h" 45 #include "libkmod-internal.h" 46 47 /** 48 * SECTION:libkmod-module 49 * @short_description: operate on kernel modules 50 */ 51 52 enum kmod_module_builtin { 53 KMOD_MODULE_BUILTIN_UNKNOWN, 54 KMOD_MODULE_BUILTIN_NO, 55 KMOD_MODULE_BUILTIN_YES, 56 }; 57 58 /** 59 * kmod_module: 60 * 61 * Opaque object representing a module. 62 */ 63 struct kmod_module { 64 struct kmod_ctx *ctx; 65 char *hashkey; 66 char *name; 67 char *path; 68 struct kmod_list *dep; 69 char *options; 70 const char *install_commands; /* owned by kmod_config */ 71 const char *remove_commands; /* owned by kmod_config */ 72 char *alias; /* only set if this module was created from an alias */ 73 struct kmod_file *file; 74 int n_dep; 75 int refcount; 76 struct { 77 bool dep : 1; 78 bool options : 1; 79 bool install_commands : 1; 80 bool remove_commands : 1; 81 } init; 82 83 /* 84 * mark if module is builtin, i.e. it's present on modules.builtin 85 * file. This is set as soon as it is needed or as soon as we know 86 * about it, i.e. the module was created from builtin lookup. 87 */ 88 enum kmod_module_builtin builtin; 89 90 /* 91 * private field used by kmod_module_get_probe_list() to detect 92 * dependency loops 93 */ 94 bool visited : 1; 95 96 /* 97 * set by kmod_module_get_probe_list: indicates for probe_insert() 98 * whether the module's command and softdep should be ignored 99 */ 100 bool ignorecmd : 1; 101 102 /* 103 * set by kmod_module_get_probe_list: indicates whether this is the 104 * module the user asked for or its dependency, or whether this 105 * is a softdep only 106 */ 107 bool required : 1; 108 }; 109 110 static inline const char *path_join(const char *path, size_t prefixlen, 111 char buf[PATH_MAX]) 112 { 113 size_t pathlen; 114 115 if (path[0] == '/') 116 return path; 117 118 pathlen = strlen(path); 119 if (prefixlen + pathlen + 1 >= PATH_MAX) 120 return NULL; 121 122 memcpy(buf + prefixlen, path, pathlen + 1); 123 return buf; 124 } 125 126 static inline bool module_is_inkernel(struct kmod_module *mod) 127 { 128 int state = kmod_module_get_initstate(mod); 129 130 if (state == KMOD_MODULE_LIVE || 131 state == KMOD_MODULE_BUILTIN) 132 return true; 133 134 return false; 135 } 136 137 int kmod_module_parse_depline(struct kmod_module *mod, char *line) 138 { 139 struct kmod_ctx *ctx = mod->ctx; 140 struct kmod_list *list = NULL; 141 const char *dirname; 142 char buf[PATH_MAX]; 143 char *p, *saveptr; 144 int err = 0, n = 0; 145 size_t dirnamelen; 146 147 if (mod->init.dep) 148 return mod->n_dep; 149 assert(mod->dep == NULL); 150 mod->init.dep = true; 151 152 p = strchr(line, ':'); 153 if (p == NULL) 154 return 0; 155 156 *p = '\0'; 157 dirname = kmod_get_dirname(mod->ctx); 158 dirnamelen = strlen(dirname); 159 if (dirnamelen + 2 >= PATH_MAX) 160 return 0; 161 162 memcpy(buf, dirname, dirnamelen); 163 buf[dirnamelen] = '/'; 164 dirnamelen++; 165 buf[dirnamelen] = '\0'; 166 167 if (mod->path == NULL) { 168 const char *str = path_join(line, dirnamelen, buf); 169 if (str == NULL) 170 return 0; 171 mod->path = strdup(str); 172 if (mod->path == NULL) 173 return 0; 174 } 175 176 p++; 177 for (p = strtok_r(p, " \t", &saveptr); p != NULL; 178 p = strtok_r(NULL, " \t", &saveptr)) { 179 struct kmod_module *depmod = NULL; 180 const char *path; 181 182 path = path_join(p, dirnamelen, buf); 183 if (path == NULL) { 184 ERR(ctx, "could not join path '%s' and '%s'.\n", 185 dirname, p); 186 goto fail; 187 } 188 189 err = kmod_module_new_from_path(ctx, path, &depmod); 190 if (err < 0) { 191 ERR(ctx, "ctx=%p path=%s error=%s\n", 192 ctx, path, strerror(-err)); 193 goto fail; 194 } 195 196 DBG(ctx, "add dep: %s\n", path); 197 198 list = kmod_list_prepend(list, depmod); 199 n++; 200 } 201 202 DBG(ctx, "%d dependencies for %s\n", n, mod->name); 203 204 mod->dep = list; 205 mod->n_dep = n; 206 return n; 207 208 fail: 209 kmod_module_unref_list(list); 210 mod->init.dep = false; 211 return err; 212 } 213 214 void kmod_module_set_visited(struct kmod_module *mod, bool visited) 215 { 216 mod->visited = visited; 217 } 218 219 void kmod_module_set_builtin(struct kmod_module *mod, bool builtin) 220 { 221 mod->builtin = 222 builtin ? KMOD_MODULE_BUILTIN_YES : KMOD_MODULE_BUILTIN_NO; 223 } 224 225 void kmod_module_set_required(struct kmod_module *mod, bool required) 226 { 227 mod->required = required; 228 } 229 230 bool kmod_module_is_builtin(struct kmod_module *mod) 231 { 232 if (mod->builtin == KMOD_MODULE_BUILTIN_UNKNOWN) { 233 kmod_module_set_builtin(mod, 234 kmod_lookup_alias_is_builtin(mod->ctx, mod->name)); 235 } 236 237 return mod->builtin == KMOD_MODULE_BUILTIN_YES; 238 } 239 /* 240 * Memory layout with alias: 241 * 242 * struct kmod_module { 243 * hashkey -----. 244 * alias -----. | 245 * name ----. | | 246 * } | | | 247 * name <----------' | | 248 * alias <-----------' | 249 * name\alias <--------' 250 * 251 * Memory layout without alias: 252 * 253 * struct kmod_module { 254 * hashkey ---. 255 * alias -----|----> NULL 256 * name ----. | 257 * } | | 258 * name <----------'-' 259 * 260 * @key is "name\alias" or "name" (in which case alias == NULL) 261 */ 262 static int kmod_module_new(struct kmod_ctx *ctx, const char *key, 263 const char *name, size_t namelen, 264 const char *alias, size_t aliaslen, 265 struct kmod_module **mod) 266 { 267 struct kmod_module *m; 268 size_t keylen; 269 270 m = kmod_pool_get_module(ctx, key); 271 if (m != NULL) { 272 *mod = kmod_module_ref(m); 273 return 0; 274 } 275 276 if (alias == NULL) 277 keylen = namelen; 278 else 279 keylen = namelen + aliaslen + 1; 280 281 m = malloc(sizeof(*m) + (alias == NULL ? 1 : 2) * (keylen + 1)); 282 if (m == NULL) 283 return -ENOMEM; 284 285 memset(m, 0, sizeof(*m)); 286 287 m->ctx = kmod_ref(ctx); 288 m->name = (char *)m + sizeof(*m); 289 memcpy(m->name, key, keylen + 1); 290 if (alias == NULL) { 291 m->hashkey = m->name; 292 m->alias = NULL; 293 } else { 294 m->name[namelen] = '\0'; 295 m->alias = m->name + namelen + 1; 296 m->hashkey = m->name + keylen + 1; 297 memcpy(m->hashkey, key, keylen + 1); 298 } 299 300 m->refcount = 1; 301 kmod_pool_add_module(ctx, m, m->hashkey); 302 *mod = m; 303 304 return 0; 305 } 306 307 /** 308 * kmod_module_new_from_name: 309 * @ctx: kmod library context 310 * @name: name of the module 311 * @mod: where to save the created struct kmod_module 312 * 313 * Create a new struct kmod_module using the module name. @name can not be an 314 * alias, file name or anything else; it must be a module name. There's no 315 * check if the module exists in the system. 316 * 317 * This function is also used internally by many others that return a new 318 * struct kmod_module or a new list of modules. 319 * 320 * The initial refcount is 1, and needs to be decremented to release the 321 * resources of the kmod_module. Since libkmod keeps track of all 322 * kmod_modules created, they are all released upon @ctx destruction too. Do 323 * not unref @ctx before all the desired operations with the returned 324 * kmod_module are done. 325 * 326 * Returns: 0 on success or < 0 otherwise. It fails if name is not a valid 327 * module name or if memory allocation failed. 328 */ 329 KMOD_EXPORT int kmod_module_new_from_name(struct kmod_ctx *ctx, 330 const char *name, 331 struct kmod_module **mod) 332 { 333 size_t namelen; 334 char name_norm[PATH_MAX]; 335 336 if (ctx == NULL || name == NULL || mod == NULL) 337 return -ENOENT; 338 339 modname_normalize(name, name_norm, &namelen); 340 341 return kmod_module_new(ctx, name_norm, name_norm, namelen, NULL, 0, mod); 342 } 343 344 int kmod_module_new_from_alias(struct kmod_ctx *ctx, const char *alias, 345 const char *name, struct kmod_module **mod) 346 { 347 int err; 348 char key[PATH_MAX]; 349 size_t namelen = strlen(name); 350 size_t aliaslen = strlen(alias); 351 352 if (namelen + aliaslen + 2 > PATH_MAX) 353 return -ENAMETOOLONG; 354 355 memcpy(key, name, namelen); 356 memcpy(key + namelen + 1, alias, aliaslen + 1); 357 key[namelen] = '\\'; 358 359 err = kmod_module_new(ctx, key, name, namelen, alias, aliaslen, mod); 360 if (err < 0) 361 return err; 362 363 return 0; 364 } 365 366 /** 367 * kmod_module_new_from_path: 368 * @ctx: kmod library context 369 * @path: path where to find the given module 370 * @mod: where to save the created struct kmod_module 371 * 372 * Create a new struct kmod_module using the module path. @path must be an 373 * existent file with in the filesystem and must be accessible to libkmod. 374 * 375 * The initial refcount is 1, and needs to be decremented to release the 376 * resources of the kmod_module. Since libkmod keeps track of all 377 * kmod_modules created, they are all released upon @ctx destruction too. Do 378 * not unref @ctx before all the desired operations with the returned 379 * kmod_module are done. 380 * 381 * If @path is relative, it's treated as relative to the current working 382 * directory. Otherwise, give an absolute path. 383 * 384 * Returns: 0 on success or < 0 otherwise. It fails if file does not exist, if 385 * it's not a valid file for a kmod_module or if memory allocation failed. 386 */ 387 KMOD_EXPORT int kmod_module_new_from_path(struct kmod_ctx *ctx, 388 const char *path, 389 struct kmod_module **mod) 390 { 391 struct kmod_module *m; 392 int err; 393 struct stat st; 394 char name[PATH_MAX]; 395 char *abspath; 396 size_t namelen; 397 398 if (ctx == NULL || path == NULL || mod == NULL) 399 return -ENOENT; 400 401 abspath = path_make_absolute_cwd(path); 402 if (abspath == NULL) { 403 DBG(ctx, "no absolute path for %s\n", path); 404 return -ENOMEM; 405 } 406 407 err = stat(abspath, &st); 408 if (err < 0) { 409 err = -errno; 410 DBG(ctx, "stat %s: %s\n", path, strerror(errno)); 411 free(abspath); 412 return err; 413 } 414 415 if (path_to_modname(path, name, &namelen) == NULL) { 416 DBG(ctx, "could not get modname from path %s\n", path); 417 free(abspath); 418 return -ENOENT; 419 } 420 421 m = kmod_pool_get_module(ctx, name); 422 if (m != NULL) { 423 if (m->path == NULL) 424 m->path = abspath; 425 else if (streq(m->path, abspath)) 426 free(abspath); 427 else { 428 ERR(ctx, "kmod_module '%s' already exists with different path: new-path='%s' old-path='%s'\n", 429 name, abspath, m->path); 430 free(abspath); 431 return -EEXIST; 432 } 433 434 *mod = kmod_module_ref(m); 435 return 0; 436 } 437 438 err = kmod_module_new(ctx, name, name, namelen, NULL, 0, &m); 439 if (err < 0) { 440 free(abspath); 441 return err; 442 } 443 444 m->path = abspath; 445 *mod = m; 446 447 return 0; 448 } 449 450 /** 451 * kmod_module_unref: 452 * @mod: kmod module 453 * 454 * Drop a reference of the kmod module. If the refcount reaches zero, its 455 * resources are released. 456 * 457 * Returns: NULL if @mod is NULL or if the module was released. Otherwise it 458 * returns the passed @mod with its refcount decremented. 459 */ 460 KMOD_EXPORT struct kmod_module *kmod_module_unref(struct kmod_module *mod) 461 { 462 if (mod == NULL) 463 return NULL; 464 465 if (--mod->refcount > 0) 466 return mod; 467 468 DBG(mod->ctx, "kmod_module %p released\n", mod); 469 470 kmod_pool_del_module(mod->ctx, mod, mod->hashkey); 471 kmod_module_unref_list(mod->dep); 472 473 if (mod->file) 474 kmod_file_unref(mod->file); 475 476 kmod_unref(mod->ctx); 477 free(mod->options); 478 free(mod->path); 479 free(mod); 480 return NULL; 481 } 482 483 /** 484 * kmod_module_ref: 485 * @mod: kmod module 486 * 487 * Take a reference of the kmod module, incrementing its refcount. 488 * 489 * Returns: the passed @module with its refcount incremented. 490 */ 491 KMOD_EXPORT struct kmod_module *kmod_module_ref(struct kmod_module *mod) 492 { 493 if (mod == NULL) 494 return NULL; 495 496 mod->refcount++; 497 498 return mod; 499 } 500 501 #define CHECK_ERR_AND_FINISH(_err, _label_err, _list, label_finish) \ 502 do { \ 503 if ((_err) < 0) \ 504 goto _label_err; \ 505 if (*(_list) != NULL) \ 506 goto finish; \ 507 } while (0) 508 509 /** 510 * kmod_module_new_from_lookup: 511 * @ctx: kmod library context 512 * @given_alias: alias to look for 513 * @list: an empty list where to save the list of modules matching 514 * @given_alias 515 * 516 * Create a new list of kmod modules using an alias or module name and lookup 517 * libkmod's configuration files and indexes in order to find the module. 518 * Once it's found in one of the places, it stops searching and create the 519 * list of modules that is saved in @list. 520 * 521 * The search order is: 1. aliases in configuration file; 2. module names in 522 * modules.dep index; 3. symbol aliases in modules.symbols index; 4. aliases 523 * in modules.alias index. 524 * 525 * The initial refcount is 1, and needs to be decremented to release the 526 * resources of the kmod_module. The returned @list must be released by 527 * calling kmod_module_unref_list(). Since libkmod keeps track of all 528 * kmod_modules created, they are all released upon @ctx destruction too. Do 529 * not unref @ctx before all the desired operations with the returned list are 530 * completed. 531 * 532 * Returns: 0 on success or < 0 otherwise. It fails if any of the lookup 533 * methods failed, which is basically due to memory allocation fail. If module 534 * is not found, it still returns 0, but @list is an empty list. 535 */ 536 KMOD_EXPORT int kmod_module_new_from_lookup(struct kmod_ctx *ctx, 537 const char *given_alias, 538 struct kmod_list **list) 539 { 540 int err; 541 char alias[PATH_MAX]; 542 543 if (ctx == NULL || given_alias == NULL) 544 return -ENOENT; 545 546 if (list == NULL || *list != NULL) { 547 ERR(ctx, "An empty list is needed to create lookup\n"); 548 return -ENOSYS; 549 } 550 551 if (alias_normalize(given_alias, alias, NULL) < 0) { 552 DBG(ctx, "invalid alias: %s\n", given_alias); 553 return -EINVAL; 554 } 555 556 DBG(ctx, "input alias=%s, normalized=%s\n", given_alias, alias); 557 558 /* Aliases from config file override all the others */ 559 err = kmod_lookup_alias_from_config(ctx, alias, list); 560 CHECK_ERR_AND_FINISH(err, fail, list, finish); 561 562 DBG(ctx, "lookup modules.dep %s\n", alias); 563 err = kmod_lookup_alias_from_moddep_file(ctx, alias, list); 564 CHECK_ERR_AND_FINISH(err, fail, list, finish); 565 566 DBG(ctx, "lookup modules.symbols %s\n", alias); 567 err = kmod_lookup_alias_from_symbols_file(ctx, alias, list); 568 CHECK_ERR_AND_FINISH(err, fail, list, finish); 569 570 DBG(ctx, "lookup install and remove commands %s\n", alias); 571 err = kmod_lookup_alias_from_commands(ctx, alias, list); 572 CHECK_ERR_AND_FINISH(err, fail, list, finish); 573 574 DBG(ctx, "lookup modules.aliases %s\n", alias); 575 err = kmod_lookup_alias_from_aliases_file(ctx, alias, list); 576 CHECK_ERR_AND_FINISH(err, fail, list, finish); 577 578 DBG(ctx, "lookup modules.builtin %s\n", alias); 579 err = kmod_lookup_alias_from_builtin_file(ctx, alias, list); 580 CHECK_ERR_AND_FINISH(err, fail, list, finish); 581 582 finish: 583 DBG(ctx, "lookup %s=%d, list=%p\n", alias, err, *list); 584 return err; 585 fail: 586 DBG(ctx, "Failed to lookup %s\n", alias); 587 kmod_module_unref_list(*list); 588 *list = NULL; 589 return err; 590 } 591 #undef CHECK_ERR_AND_FINISH 592 593 /** 594 * kmod_module_unref_list: 595 * @list: list of kmod modules 596 * 597 * Drop a reference of each kmod module in @list and releases the resources 598 * taken by the list itself. 599 * 600 * Returns: 0 601 */ 602 KMOD_EXPORT int kmod_module_unref_list(struct kmod_list *list) 603 { 604 for (; list != NULL; list = kmod_list_remove(list)) 605 kmod_module_unref(list->data); 606 607 return 0; 608 } 609 610 /** 611 * kmod_module_get_filtered_blacklist: 612 * @ctx: kmod library context 613 * @input: list of kmod_module to be filtered with blacklist 614 * @output: where to save the new list 615 * 616 * This function should not be used. Use kmod_module_apply_filter instead. 617 * 618 * Given a list @input, this function filter it out with config's blacklist 619 * and save it in @output. 620 * 621 * Returns: 0 on success or < 0 otherwise. @output is saved with the updated 622 * list. 623 */ 624 KMOD_EXPORT int kmod_module_get_filtered_blacklist(const struct kmod_ctx *ctx, 625 const struct kmod_list *input, 626 struct kmod_list **output) 627 { 628 return kmod_module_apply_filter(ctx, KMOD_FILTER_BLACKLIST, input, output); 629 } 630 631 static const struct kmod_list *module_get_dependencies_noref(const struct kmod_module *mod) 632 { 633 if (!mod->init.dep) { 634 /* lazy init */ 635 char *line = kmod_search_moddep(mod->ctx, mod->name); 636 637 if (line == NULL) 638 return NULL; 639 640 kmod_module_parse_depline((struct kmod_module *)mod, line); 641 free(line); 642 643 if (!mod->init.dep) 644 return NULL; 645 } 646 647 return mod->dep; 648 } 649 650 /** 651 * kmod_module_get_dependencies: 652 * @mod: kmod module 653 * 654 * Search the modules.dep index to find the dependencies of the given @mod. 655 * The result is cached in @mod, so subsequent calls to this function will 656 * return the already searched list of modules. 657 * 658 * Returns: NULL on failure. Otherwise it returns a list of kmod modules 659 * that can be released by calling kmod_module_unref_list(). 660 */ 661 KMOD_EXPORT struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod) 662 { 663 struct kmod_list *l, *l_new, *list_new = NULL; 664 665 if (mod == NULL) 666 return NULL; 667 668 module_get_dependencies_noref(mod); 669 670 kmod_list_foreach(l, mod->dep) { 671 l_new = kmod_list_append(list_new, kmod_module_ref(l->data)); 672 if (l_new == NULL) { 673 kmod_module_unref(l->data); 674 goto fail; 675 } 676 677 list_new = l_new; 678 } 679 680 return list_new; 681 682 fail: 683 ERR(mod->ctx, "out of memory\n"); 684 kmod_module_unref_list(list_new); 685 return NULL; 686 } 687 688 /** 689 * kmod_module_get_module: 690 * @entry: an entry in a list of kmod modules. 691 * 692 * Get the kmod module of this @entry in the list, increasing its refcount. 693 * After it's used, unref it. Since the refcount is incremented upon return, 694 * you still have to call kmod_module_unref_list() to release the list of kmod 695 * modules. 696 * 697 * Returns: NULL on failure or the kmod_module contained in this list entry 698 * with its refcount incremented. 699 */ 700 KMOD_EXPORT struct kmod_module *kmod_module_get_module(const struct kmod_list *entry) 701 { 702 if (entry == NULL) 703 return NULL; 704 705 return kmod_module_ref(entry->data); 706 } 707 708 /** 709 * kmod_module_get_name: 710 * @mod: kmod module 711 * 712 * Get the name of this kmod module. Name is always available, independently 713 * if it was created by kmod_module_new_from_name() or another function and 714 * it's always normalized (dashes are replaced with underscores). 715 * 716 * Returns: the name of this kmod module. 717 */ 718 KMOD_EXPORT const char *kmod_module_get_name(const struct kmod_module *mod) 719 { 720 if (mod == NULL) 721 return NULL; 722 723 return mod->name; 724 } 725 726 /** 727 * kmod_module_get_path: 728 * @mod: kmod module 729 * 730 * Get the path of this kmod module. If this kmod module was not created by 731 * path, it can search the modules.dep index in order to find out the module 732 * under context's dirname. 733 * 734 * Returns: the path of this kmod module or NULL if such information is not 735 * available. 736 */ 737 KMOD_EXPORT const char *kmod_module_get_path(const struct kmod_module *mod) 738 { 739 char *line; 740 741 if (mod == NULL) 742 return NULL; 743 744 DBG(mod->ctx, "name='%s' path='%s'\n", mod->name, mod->path); 745 746 if (mod->path != NULL) 747 return mod->path; 748 if (mod->init.dep) 749 return NULL; 750 751 /* lazy init */ 752 line = kmod_search_moddep(mod->ctx, mod->name); 753 if (line == NULL) 754 return NULL; 755 756 kmod_module_parse_depline((struct kmod_module *) mod, line); 757 free(line); 758 759 return mod->path; 760 } 761 762 763 extern long delete_module(const char *name, unsigned int flags); 764 765 /** 766 * kmod_module_remove_module: 767 * @mod: kmod module 768 * @flags: flags to pass to Linux kernel when removing the module. The only valid flag is 769 * KMOD_REMOVE_FORCE: force remove module regardless if it's still in 770 * use by a kernel subsystem or other process; 771 * KMOD_REMOVE_NOWAIT is always enforced, causing us to pass O_NONBLOCK to 772 * delete_module(2). 773 * 774 * Remove a module from Linux kernel. 775 * 776 * Returns: 0 on success or < 0 on failure. 777 */ 778 KMOD_EXPORT int kmod_module_remove_module(struct kmod_module *mod, 779 unsigned int flags) 780 { 781 int err; 782 783 if (mod == NULL) 784 return -ENOENT; 785 786 /* Filter out other flags and force ONONBLOCK */ 787 flags &= KMOD_REMOVE_FORCE; 788 flags |= KMOD_REMOVE_NOWAIT; 789 790 err = delete_module(mod->name, flags); 791 if (err != 0) { 792 err = -errno; 793 ERR(mod->ctx, "could not remove '%s': %m\n", mod->name); 794 } 795 796 return err; 797 } 798 799 extern long init_module(const void *mem, unsigned long len, const char *args); 800 801 /** 802 * kmod_module_insert_module: 803 * @mod: kmod module 804 * @flags: flags are not passed to Linux Kernel, but instead they dictate the 805 * behavior of this function, valid flags are 806 * KMOD_INSERT_FORCE_VERMAGIC: ignore kernel version magic; 807 * KMOD_INSERT_FORCE_MODVERSION: ignore symbol version hashes. 808 * @options: module's options to pass to Linux Kernel. 809 * 810 * Insert a module in Linux kernel. It opens the file pointed by @mod, 811 * mmap'ing it and passing to kernel. 812 * 813 * Returns: 0 on success or < 0 on failure. If module is already loaded it 814 * returns -EEXIST. 815 */ 816 KMOD_EXPORT int kmod_module_insert_module(struct kmod_module *mod, 817 unsigned int flags, 818 const char *options) 819 { 820 int err; 821 const void *mem; 822 off_t size; 823 struct kmod_elf *elf; 824 const char *path; 825 const char *args = options ? options : ""; 826 827 if (mod == NULL) 828 return -ENOENT; 829 830 path = kmod_module_get_path(mod); 831 if (path == NULL) { 832 ERR(mod->ctx, "could not find module by name='%s'\n", mod->name); 833 return -ENOENT; 834 } 835 836 if (!mod->file) { 837 mod->file = kmod_file_open(mod->ctx, path); 838 if (mod->file == NULL) { 839 err = -errno; 840 return err; 841 } 842 } 843 844 if (kmod_file_get_direct(mod->file)) { 845 unsigned int kernel_flags = 0; 846 847 if (flags & KMOD_INSERT_FORCE_VERMAGIC) 848 kernel_flags |= MODULE_INIT_IGNORE_VERMAGIC; 849 if (flags & KMOD_INSERT_FORCE_MODVERSION) 850 kernel_flags |= MODULE_INIT_IGNORE_MODVERSIONS; 851 852 err = finit_module(kmod_file_get_fd(mod->file), args, kernel_flags); 853 if (err == 0 || errno != ENOSYS) 854 goto init_finished; 855 } 856 857 if (flags & (KMOD_INSERT_FORCE_VERMAGIC | KMOD_INSERT_FORCE_MODVERSION)) { 858 elf = kmod_file_get_elf(mod->file); 859 if (elf == NULL) { 860 err = -errno; 861 return err; 862 } 863 864 if (flags & KMOD_INSERT_FORCE_MODVERSION) { 865 err = kmod_elf_strip_section(elf, "__versions"); 866 if (err < 0) 867 INFO(mod->ctx, "Failed to strip modversion: %s\n", strerror(-err)); 868 } 869 870 if (flags & KMOD_INSERT_FORCE_VERMAGIC) { 871 err = kmod_elf_strip_vermagic(elf); 872 if (err < 0) 873 INFO(mod->ctx, "Failed to strip vermagic: %s\n", strerror(-err)); 874 } 875 876 mem = kmod_elf_get_memory(elf); 877 } else { 878 mem = kmod_file_get_contents(mod->file); 879 } 880 size = kmod_file_get_size(mod->file); 881 882 err = init_module(mem, size, args); 883 init_finished: 884 if (err < 0) { 885 err = -errno; 886 INFO(mod->ctx, "Failed to insert module '%s': %m\n", path); 887 } 888 return err; 889 } 890 891 static bool module_is_blacklisted(struct kmod_module *mod) 892 { 893 struct kmod_ctx *ctx = mod->ctx; 894 const struct kmod_config *config = kmod_get_config(ctx); 895 const struct kmod_list *bl = config->blacklists; 896 const struct kmod_list *l; 897 898 kmod_list_foreach(l, bl) { 899 const char *modname = kmod_blacklist_get_modname(l); 900 901 if (streq(modname, mod->name)) 902 return true; 903 } 904 905 return false; 906 } 907 908 /** 909 * kmod_module_apply_filter 910 * @ctx: kmod library context 911 * @filter_type: bitmask to filter modules out, valid types are 912 * KMOD_FILTER_BLACKLIST: filter modules in blacklist out; 913 * KMOD_FILTER_BUILTIN: filter builtin modules out. 914 * @input: list of kmod_module to be filtered 915 * @output: where to save the new list 916 * 917 * Given a list @input, this function filter it out by the filter mask 918 * and save it in @output. 919 * 920 * Returns: 0 on success or < 0 otherwise. @output is saved with the updated 921 * list. 922 */ 923 KMOD_EXPORT int kmod_module_apply_filter(const struct kmod_ctx *ctx, 924 enum kmod_filter filter_type, 925 const struct kmod_list *input, 926 struct kmod_list **output) 927 { 928 const struct kmod_list *li; 929 930 if (ctx == NULL || output == NULL) 931 return -ENOENT; 932 933 *output = NULL; 934 if (input == NULL) 935 return 0; 936 937 kmod_list_foreach(li, input) { 938 struct kmod_module *mod = li->data; 939 struct kmod_list *node; 940 941 if ((filter_type & KMOD_FILTER_BLACKLIST) && 942 module_is_blacklisted(mod)) 943 continue; 944 945 if ((filter_type & KMOD_FILTER_BUILTIN) 946 && kmod_module_is_builtin(mod)) 947 continue; 948 949 node = kmod_list_append(*output, mod); 950 if (node == NULL) 951 goto fail; 952 953 *output = node; 954 kmod_module_ref(mod); 955 } 956 957 return 0; 958 959 fail: 960 kmod_module_unref_list(*output); 961 *output = NULL; 962 return -ENOMEM; 963 } 964 965 static int command_do(struct kmod_module *mod, const char *type, 966 const char *cmd) 967 { 968 const char *modname = kmod_module_get_name(mod); 969 int err; 970 971 DBG(mod->ctx, "%s %s\n", type, cmd); 972 973 setenv("MODPROBE_MODULE", modname, 1); 974 err = system(cmd); 975 unsetenv("MODPROBE_MODULE"); 976 977 if (err == -1 || WEXITSTATUS(err)) { 978 ERR(mod->ctx, "Error running %s command for %s\n", 979 type, modname); 980 if (err != -1) 981 err = -WEXITSTATUS(err); 982 } 983 984 return err; 985 } 986 987 struct probe_insert_cb { 988 int (*run_install)(struct kmod_module *m, const char *cmd, void *data); 989 void *data; 990 }; 991 992 static int module_do_install_commands(struct kmod_module *mod, 993 const char *options, 994 struct probe_insert_cb *cb) 995 { 996 const char *command = kmod_module_get_install_commands(mod); 997 char *p; 998 _cleanup_free_ char *cmd; 999 int err; 1000 size_t cmdlen, options_len, varlen; 1001 1002 assert(command); 1003 1004 if (options == NULL) 1005 options = ""; 1006 1007 options_len = strlen(options); 1008 cmdlen = strlen(command); 1009 varlen = sizeof("$CMDLINE_OPTS") - 1; 1010 1011 cmd = memdup(command, cmdlen + 1); 1012 if (cmd == NULL) 1013 return -ENOMEM; 1014 1015 while ((p = strstr(cmd, "$CMDLINE_OPTS")) != NULL) { 1016 size_t prefixlen = p - cmd; 1017 size_t suffixlen = cmdlen - prefixlen - varlen; 1018 size_t slen = cmdlen - varlen + options_len; 1019 char *suffix = p + varlen; 1020 char *s = malloc(slen + 1); 1021 if (!s) 1022 return -ENOMEM; 1023 1024 memcpy(s, cmd, p - cmd); 1025 memcpy(s + prefixlen, options, options_len); 1026 memcpy(s + prefixlen + options_len, suffix, suffixlen); 1027 s[slen] = '\0'; 1028 1029 free(cmd); 1030 cmd = s; 1031 cmdlen = slen; 1032 } 1033 1034 if (cb->run_install != NULL) 1035 err = cb->run_install(mod, cmd, cb->data); 1036 else 1037 err = command_do(mod, "install", cmd); 1038 1039 return err; 1040 } 1041 1042 static char *module_options_concat(const char *opt, const char *xopt) 1043 { 1044 // TODO: we might need to check if xopt overrides options on opt 1045 size_t optlen = opt == NULL ? 0 : strlen(opt); 1046 size_t xoptlen = xopt == NULL ? 0 : strlen(xopt); 1047 char *r; 1048 1049 if (optlen == 0 && xoptlen == 0) 1050 return NULL; 1051 1052 r = malloc(optlen + xoptlen + 2); 1053 1054 if (opt != NULL) { 1055 memcpy(r, opt, optlen); 1056 r[optlen] = ' '; 1057 optlen++; 1058 } 1059 1060 if (xopt != NULL) 1061 memcpy(r + optlen, xopt, xoptlen); 1062 1063 r[optlen + xoptlen] = '\0'; 1064 1065 return r; 1066 } 1067 1068 static int __kmod_module_get_probe_list(struct kmod_module *mod, 1069 bool required, 1070 bool ignorecmd, 1071 struct kmod_list **list); 1072 1073 /* re-entrant */ 1074 static int __kmod_module_fill_softdep(struct kmod_module *mod, 1075 struct kmod_list **list) 1076 { 1077 struct kmod_list *pre = NULL, *post = NULL, *l; 1078 int err; 1079 1080 err = kmod_module_get_softdeps(mod, &pre, &post); 1081 if (err < 0) { 1082 ERR(mod->ctx, "could not get softdep: %s\n", 1083 strerror(-err)); 1084 goto fail; 1085 } 1086 1087 kmod_list_foreach(l, pre) { 1088 struct kmod_module *m = l->data; 1089 err = __kmod_module_get_probe_list(m, false, false, list); 1090 if (err < 0) 1091 goto fail; 1092 } 1093 1094 l = kmod_list_append(*list, kmod_module_ref(mod)); 1095 if (l == NULL) { 1096 kmod_module_unref(mod); 1097 err = -ENOMEM; 1098 goto fail; 1099 } 1100 *list = l; 1101 mod->ignorecmd = (pre != NULL || post != NULL); 1102 1103 kmod_list_foreach(l, post) { 1104 struct kmod_module *m = l->data; 1105 err = __kmod_module_get_probe_list(m, false, false, list); 1106 if (err < 0) 1107 goto fail; 1108 } 1109 1110 fail: 1111 kmod_module_unref_list(pre); 1112 kmod_module_unref_list(post); 1113 1114 return err; 1115 } 1116 1117 /* re-entrant */ 1118 static int __kmod_module_get_probe_list(struct kmod_module *mod, 1119 bool required, 1120 bool ignorecmd, 1121 struct kmod_list **list) 1122 { 1123 struct kmod_list *dep, *l; 1124 int err = 0; 1125 1126 if (mod->visited) { 1127 DBG(mod->ctx, "Ignore module '%s': already visited\n", 1128 mod->name); 1129 return 0; 1130 } 1131 mod->visited = true; 1132 1133 dep = kmod_module_get_dependencies(mod); 1134 if (required) { 1135 /* 1136 * Called from kmod_module_probe_insert_module(); set the 1137 * ->required flag on mod and all its dependencies before 1138 * they are possibly visited through some softdeps. 1139 */ 1140 mod->required = true; 1141 kmod_list_foreach(l, dep) { 1142 struct kmod_module *m = l->data; 1143 m->required = true; 1144 } 1145 } 1146 1147 kmod_list_foreach(l, dep) { 1148 struct kmod_module *m = l->data; 1149 err = __kmod_module_fill_softdep(m, list); 1150 if (err < 0) 1151 goto finish; 1152 } 1153 1154 if (ignorecmd) { 1155 l = kmod_list_append(*list, kmod_module_ref(mod)); 1156 if (l == NULL) { 1157 kmod_module_unref(mod); 1158 err = -ENOMEM; 1159 goto finish; 1160 } 1161 *list = l; 1162 mod->ignorecmd = true; 1163 } else 1164 err = __kmod_module_fill_softdep(mod, list); 1165 1166 finish: 1167 kmod_module_unref_list(dep); 1168 return err; 1169 } 1170 1171 static int kmod_module_get_probe_list(struct kmod_module *mod, 1172 bool ignorecmd, 1173 struct kmod_list **list) 1174 { 1175 int err; 1176 1177 assert(mod != NULL); 1178 assert(list != NULL && *list == NULL); 1179 1180 /* 1181 * Make sure we don't get screwed by previous calls to this function 1182 */ 1183 kmod_set_modules_visited(mod->ctx, false); 1184 kmod_set_modules_required(mod->ctx, false); 1185 1186 err = __kmod_module_get_probe_list(mod, true, ignorecmd, list); 1187 if (err < 0) { 1188 kmod_module_unref_list(*list); 1189 *list = NULL; 1190 } 1191 1192 return err; 1193 } 1194 1195 /** 1196 * kmod_module_probe_insert_module: 1197 * @mod: kmod module 1198 * @flags: flags are not passed to Linux Kernel, but instead they dictate the 1199 * behavior of this function, valid flags are 1200 * KMOD_PROBE_FORCE_VERMAGIC: ignore kernel version magic; 1201 * KMOD_PROBE_FORCE_MODVERSION: ignore symbol version hashes; 1202 * KMOD_PROBE_IGNORE_COMMAND: whether the probe should ignore install 1203 * commands and softdeps configured in the system; 1204 * KMOD_PROBE_IGNORE_LOADED: do not check whether the module is already 1205 * live in kernel or not; 1206 * KMOD_PROBE_DRY_RUN: dry run, do not insert module, just call the 1207 * associated callback function; 1208 * KMOD_PROBE_FAIL_ON_LOADED: if KMOD_PROBE_IGNORE_LOADED is not specified 1209 * and the module is already live in kernel, the function will fail if this 1210 * flag is specified; 1211 * KMOD_PROBE_APPLY_BLACKLIST_ALL: probe will apply KMOD_FILTER_BLACKLIST 1212 * filter to this module and its dependencies. If any of the dependencies (or 1213 * the module) is blacklisted, the probe will fail, unless the blacklisted 1214 * module is already live in kernel; 1215 * KMOD_PROBE_APPLY_BLACKLIST: probe will fail if the module is blacklisted; 1216 * KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY: probe will fail if the module is an 1217 * alias and is blacklisted. 1218 * @extra_options: module's options to pass to Linux Kernel. It applies only 1219 * to @mod, not to its dependencies. 1220 * @run_install: function to run when @mod is backed by an install command. 1221 * @data: data to give back to @run_install callback 1222 * @print_action: function to call with the action being taken (install or 1223 * insmod). It's useful for tools like modprobe when running with verbose 1224 * output or in dry-run mode. 1225 * 1226 * Insert a module in Linux kernel resolving dependencies, soft dependencies, 1227 * install commands and applying blacklist. 1228 * 1229 * If @run_install is NULL, this function will fork and exec by calling 1230 * system(3). Don't pass a NULL argument in @run_install if your binary is 1231 * setuid/setgid (see warning in system(3)). If you need control over the 1232 * execution of an install command, give a callback function instead. 1233 * 1234 * Returns: 0 on success, > 0 if stopped by a reason given in @flags or < 0 on 1235 * failure. 1236 */ 1237 KMOD_EXPORT int kmod_module_probe_insert_module(struct kmod_module *mod, 1238 unsigned int flags, const char *extra_options, 1239 int (*run_install)(struct kmod_module *m, 1240 const char *cmd, void *data), 1241 const void *data, 1242 void (*print_action)(struct kmod_module *m, 1243 bool install, 1244 const char *options)) 1245 { 1246 struct kmod_list *list = NULL, *l; 1247 struct probe_insert_cb cb; 1248 int err; 1249 1250 if (mod == NULL) 1251 return -ENOENT; 1252 1253 if (!(flags & KMOD_PROBE_IGNORE_LOADED) 1254 && module_is_inkernel(mod)) { 1255 if (flags & KMOD_PROBE_FAIL_ON_LOADED) 1256 return -EEXIST; 1257 else 1258 return 0; 1259 } 1260 1261 /* 1262 * Ugly assignement + check. We need to check if we were told to check 1263 * blacklist and also return the reason why we failed. 1264 * KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY will take effect only if the 1265 * module is an alias, so we also need to check it 1266 */ 1267 if ((mod->alias != NULL && ((err = flags & KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY))) 1268 || (err = flags & KMOD_PROBE_APPLY_BLACKLIST_ALL) 1269 || (err = flags & KMOD_PROBE_APPLY_BLACKLIST)) { 1270 if (module_is_blacklisted(mod)) 1271 return err; 1272 } 1273 1274 err = kmod_module_get_probe_list(mod, 1275 !!(flags & KMOD_PROBE_IGNORE_COMMAND), &list); 1276 if (err < 0) 1277 return err; 1278 1279 if (flags & KMOD_PROBE_APPLY_BLACKLIST_ALL) { 1280 struct kmod_list *filtered = NULL; 1281 1282 err = kmod_module_apply_filter(mod->ctx, 1283 KMOD_FILTER_BLACKLIST, list, &filtered); 1284 if (err < 0) 1285 return err; 1286 1287 kmod_module_unref_list(list); 1288 if (filtered == NULL) 1289 return KMOD_PROBE_APPLY_BLACKLIST_ALL; 1290 1291 list = filtered; 1292 } 1293 1294 cb.run_install = run_install; 1295 cb.data = (void *) data; 1296 1297 kmod_list_foreach(l, list) { 1298 struct kmod_module *m = l->data; 1299 const char *moptions = kmod_module_get_options(m); 1300 const char *cmd = kmod_module_get_install_commands(m); 1301 char *options; 1302 1303 if (!(flags & KMOD_PROBE_IGNORE_LOADED) 1304 && module_is_inkernel(m)) { 1305 DBG(mod->ctx, "Ignoring module '%s': already loaded\n", 1306 m->name); 1307 err = -EEXIST; 1308 goto finish_module; 1309 } 1310 1311 options = module_options_concat(moptions, 1312 m == mod ? extra_options : NULL); 1313 1314 if (cmd != NULL && !m->ignorecmd) { 1315 if (print_action != NULL) 1316 print_action(m, true, options ?: ""); 1317 1318 if (!(flags & KMOD_PROBE_DRY_RUN)) 1319 err = module_do_install_commands(m, options, 1320 &cb); 1321 } else { 1322 if (print_action != NULL) 1323 print_action(m, false, options ?: ""); 1324 1325 if (!(flags & KMOD_PROBE_DRY_RUN)) 1326 err = kmod_module_insert_module(m, flags, 1327 options); 1328 } 1329 1330 free(options); 1331 1332 finish_module: 1333 /* 1334 * Treat "already loaded" error. If we were told to stop on 1335 * already loaded and the module being loaded is not a softdep 1336 * or dep, bail out. Otherwise, just ignore and continue. 1337 * 1338 * We need to check here because of race conditions. We 1339 * checked first if module was already loaded but it may have 1340 * been loaded between the check and the moment we try to 1341 * insert it. 1342 */ 1343 if (err == -EEXIST && m == mod && 1344 (flags & KMOD_PROBE_FAIL_ON_LOADED)) 1345 break; 1346 1347 /* 1348 * Ignore errors from softdeps 1349 */ 1350 if (err == -EEXIST || !m->required) 1351 err = 0; 1352 1353 else if (err < 0) 1354 break; 1355 } 1356 1357 kmod_module_unref_list(list); 1358 return err; 1359 } 1360 1361 /** 1362 * kmod_module_get_options: 1363 * @mod: kmod module 1364 * 1365 * Get options of this kmod module. Options come from the configuration file 1366 * and are cached in @mod. The first call to this function will search for 1367 * this module in configuration and subsequent calls return the cached string. 1368 * 1369 * Returns: a string with all the options separated by spaces. This string is 1370 * owned by @mod, do not free it. 1371 */ 1372 KMOD_EXPORT const char *kmod_module_get_options(const struct kmod_module *mod) 1373 { 1374 if (mod == NULL) 1375 return NULL; 1376 1377 if (!mod->init.options) { 1378 /* lazy init */ 1379 struct kmod_module *m = (struct kmod_module *)mod; 1380 const struct kmod_list *l; 1381 const struct kmod_config *config; 1382 char *opts = NULL; 1383 size_t optslen = 0; 1384 1385 config = kmod_get_config(mod->ctx); 1386 1387 kmod_list_foreach(l, config->options) { 1388 const char *modname = kmod_option_get_modname(l); 1389 const char *str; 1390 size_t len; 1391 void *tmp; 1392 1393 DBG(mod->ctx, "modname=%s mod->name=%s mod->alias=%s\n", modname, mod->name, mod->alias); 1394 if (!(streq(modname, mod->name) || (mod->alias != NULL && 1395 streq(modname, mod->alias)))) 1396 continue; 1397 1398 DBG(mod->ctx, "passed = modname=%s mod->name=%s mod->alias=%s\n", modname, mod->name, mod->alias); 1399 str = kmod_option_get_options(l); 1400 len = strlen(str); 1401 if (len < 1) 1402 continue; 1403 1404 tmp = realloc(opts, optslen + len + 2); 1405 if (tmp == NULL) { 1406 free(opts); 1407 goto failed; 1408 } 1409 1410 opts = tmp; 1411 1412 if (optslen > 0) { 1413 opts[optslen] = ' '; 1414 optslen++; 1415 } 1416 1417 memcpy(opts + optslen, str, len); 1418 optslen += len; 1419 opts[optslen] = '\0'; 1420 } 1421 1422 m->init.options = true; 1423 m->options = opts; 1424 } 1425 1426 return mod->options; 1427 1428 failed: 1429 ERR(mod->ctx, "out of memory\n"); 1430 return NULL; 1431 } 1432 1433 /** 1434 * kmod_module_get_install_commands: 1435 * @mod: kmod module 1436 * 1437 * Get install commands for this kmod module. Install commands come from the 1438 * configuration file and are cached in @mod. The first call to this function 1439 * will search for this module in configuration and subsequent calls return 1440 * the cached string. The install commands are returned as they were in the 1441 * configuration, concatenated by ';'. No other processing is made in this 1442 * string. 1443 * 1444 * Returns: a string with all install commands separated by semicolons. This 1445 * string is owned by @mod, do not free it. 1446 */ 1447 KMOD_EXPORT const char *kmod_module_get_install_commands(const struct kmod_module *mod) 1448 { 1449 if (mod == NULL) 1450 return NULL; 1451 1452 if (!mod->init.install_commands) { 1453 /* lazy init */ 1454 struct kmod_module *m = (struct kmod_module *)mod; 1455 const struct kmod_list *l; 1456 const struct kmod_config *config; 1457 1458 config = kmod_get_config(mod->ctx); 1459 1460 kmod_list_foreach(l, config->install_commands) { 1461 const char *modname = kmod_command_get_modname(l); 1462 1463 if (fnmatch(modname, mod->name, 0) != 0) 1464 continue; 1465 1466 m->install_commands = kmod_command_get_command(l); 1467 1468 /* 1469 * find only the first command, as modprobe from 1470 * module-init-tools does 1471 */ 1472 break; 1473 } 1474 1475 m->init.install_commands = true; 1476 } 1477 1478 return mod->install_commands; 1479 } 1480 1481 void kmod_module_set_install_commands(struct kmod_module *mod, const char *cmd) 1482 { 1483 mod->init.install_commands = true; 1484 mod->install_commands = cmd; 1485 } 1486 1487 static struct kmod_list *lookup_softdep(struct kmod_ctx *ctx, const char * const * array, unsigned int count) 1488 { 1489 struct kmod_list *ret = NULL; 1490 unsigned i; 1491 1492 for (i = 0; i < count; i++) { 1493 const char *depname = array[i]; 1494 struct kmod_list *lst = NULL; 1495 int err; 1496 1497 err = kmod_module_new_from_lookup(ctx, depname, &lst); 1498 if (err < 0) { 1499 ERR(ctx, "failed to lookup soft dependency '%s', continuing anyway.\n", depname); 1500 continue; 1501 } else if (lst != NULL) 1502 ret = kmod_list_append_list(ret, lst); 1503 } 1504 return ret; 1505 } 1506 1507 /** 1508 * kmod_module_get_softdeps: 1509 * @mod: kmod module 1510 * @pre: where to save the list of preceding soft dependencies. 1511 * @post: where to save the list of post soft dependencies. 1512 * 1513 * Get soft dependencies for this kmod module. Soft dependencies come 1514 * from configuration file and are not cached in @mod because it may include 1515 * dependency cycles that would make we leak kmod_module. Any call 1516 * to this function will search for this module in configuration, allocate a 1517 * list and return the result. 1518 * 1519 * Both @pre and @post are newly created list of kmod_module and 1520 * should be unreferenced with kmod_module_unref_list(). 1521 * 1522 * Returns: 0 on success or < 0 otherwise. 1523 */ 1524 KMOD_EXPORT int kmod_module_get_softdeps(const struct kmod_module *mod, 1525 struct kmod_list **pre, 1526 struct kmod_list **post) 1527 { 1528 const struct kmod_list *l; 1529 const struct kmod_config *config; 1530 1531 if (mod == NULL || pre == NULL || post == NULL) 1532 return -ENOENT; 1533 1534 assert(*pre == NULL); 1535 assert(*post == NULL); 1536 1537 config = kmod_get_config(mod->ctx); 1538 1539 kmod_list_foreach(l, config->softdeps) { 1540 const char *modname = kmod_softdep_get_name(l); 1541 const char * const *array; 1542 unsigned count; 1543 1544 if (fnmatch(modname, mod->name, 0) != 0) 1545 continue; 1546 1547 array = kmod_softdep_get_pre(l, &count); 1548 *pre = lookup_softdep(mod->ctx, array, count); 1549 array = kmod_softdep_get_post(l, &count); 1550 *post = lookup_softdep(mod->ctx, array, count); 1551 1552 /* 1553 * find only the first command, as modprobe from 1554 * module-init-tools does 1555 */ 1556 break; 1557 } 1558 1559 return 0; 1560 } 1561 1562 /** 1563 * kmod_module_get_remove_commands: 1564 * @mod: kmod module 1565 * 1566 * Get remove commands for this kmod module. Remove commands come from the 1567 * configuration file and are cached in @mod. The first call to this function 1568 * will search for this module in configuration and subsequent calls return 1569 * the cached string. The remove commands are returned as they were in the 1570 * configuration, concatenated by ';'. No other processing is made in this 1571 * string. 1572 * 1573 * Returns: a string with all remove commands separated by semicolons. This 1574 * string is owned by @mod, do not free it. 1575 */ 1576 KMOD_EXPORT const char *kmod_module_get_remove_commands(const struct kmod_module *mod) 1577 { 1578 if (mod == NULL) 1579 return NULL; 1580 1581 if (!mod->init.remove_commands) { 1582 /* lazy init */ 1583 struct kmod_module *m = (struct kmod_module *)mod; 1584 const struct kmod_list *l; 1585 const struct kmod_config *config; 1586 1587 config = kmod_get_config(mod->ctx); 1588 1589 kmod_list_foreach(l, config->remove_commands) { 1590 const char *modname = kmod_command_get_modname(l); 1591 1592 if (fnmatch(modname, mod->name, 0) != 0) 1593 continue; 1594 1595 m->remove_commands = kmod_command_get_command(l); 1596 1597 /* 1598 * find only the first command, as modprobe from 1599 * module-init-tools does 1600 */ 1601 break; 1602 } 1603 1604 m->init.remove_commands = true; 1605 } 1606 1607 return mod->remove_commands; 1608 } 1609 1610 void kmod_module_set_remove_commands(struct kmod_module *mod, const char *cmd) 1611 { 1612 mod->init.remove_commands = true; 1613 mod->remove_commands = cmd; 1614 } 1615 1616 /** 1617 * SECTION:libkmod-loaded 1618 * @short_description: currently loaded modules 1619 * 1620 * Information about currently loaded modules, as reported by Linux kernel. 1621 * These information are not cached by libkmod and are always read from /sys 1622 * and /proc/modules. 1623 */ 1624 1625 /** 1626 * kmod_module_new_from_loaded: 1627 * @ctx: kmod library context 1628 * @list: where to save the list of loaded modules 1629 * 1630 * Create a new list of kmod modules with all modules currently loaded in 1631 * kernel. It uses /proc/modules to get the names of loaded modules and to 1632 * create kmod modules by calling kmod_module_new_from_name() in each of them. 1633 * They are put in @list in no particular order. 1634 * 1635 * The initial refcount is 1, and needs to be decremented to release the 1636 * resources of the kmod_module. The returned @list must be released by 1637 * calling kmod_module_unref_list(). Since libkmod keeps track of all 1638 * kmod_modules created, they are all released upon @ctx destruction too. Do 1639 * not unref @ctx before all the desired operations with the returned list are 1640 * completed. 1641 * 1642 * Returns: 0 on success or < 0 on error. 1643 */ 1644 KMOD_EXPORT int kmod_module_new_from_loaded(struct kmod_ctx *ctx, 1645 struct kmod_list **list) 1646 { 1647 struct kmod_list *l = NULL; 1648 FILE *fp; 1649 char line[4096]; 1650 1651 if (ctx == NULL || list == NULL) 1652 return -ENOENT; 1653 1654 fp = fopen("/proc/modules", "re"); 1655 if (fp == NULL) { 1656 int err = -errno; 1657 ERR(ctx, "could not open /proc/modules: %s\n", strerror(errno)); 1658 return err; 1659 } 1660 1661 while (fgets(line, sizeof(line), fp)) { 1662 struct kmod_module *m; 1663 struct kmod_list *node; 1664 int err; 1665 size_t len = strlen(line); 1666 char *saveptr, *name = strtok_r(line, " \t", &saveptr); 1667 1668 err = kmod_module_new_from_name(ctx, name, &m); 1669 if (err < 0) { 1670 ERR(ctx, "could not get module from name '%s': %s\n", 1671 name, strerror(-err)); 1672 goto eat_line; 1673 } 1674 1675 node = kmod_list_append(l, m); 1676 if (node) 1677 l = node; 1678 else { 1679 ERR(ctx, "out of memory\n"); 1680 kmod_module_unref(m); 1681 } 1682 eat_line: 1683 while (line[len - 1] != '\n' && fgets(line, sizeof(line), fp)) 1684 len = strlen(line); 1685 } 1686 1687 fclose(fp); 1688 *list = l; 1689 1690 return 0; 1691 } 1692 1693 /** 1694 * kmod_module_initstate_str: 1695 * @state: the state as returned by kmod_module_get_initstate() 1696 * 1697 * Translate a initstate to a string. 1698 * 1699 * Returns: the string associated to the @state. This string is statically 1700 * allocated, do not free it. 1701 */ 1702 KMOD_EXPORT const char *kmod_module_initstate_str(enum kmod_module_initstate state) 1703 { 1704 switch (state) { 1705 case KMOD_MODULE_BUILTIN: 1706 return "builtin"; 1707 case KMOD_MODULE_LIVE: 1708 return "live"; 1709 case KMOD_MODULE_COMING: 1710 return "coming"; 1711 case KMOD_MODULE_GOING: 1712 return "going"; 1713 default: 1714 return NULL; 1715 } 1716 } 1717 1718 /** 1719 * kmod_module_get_initstate: 1720 * @mod: kmod module 1721 * 1722 * Get the initstate of this @mod, as returned by Linux Kernel, by reading 1723 * /sys filesystem. 1724 * 1725 * Returns: < 0 on error or module state if module is found in kernel, valid states are 1726 * KMOD_MODULE_BUILTIN: module is builtin; 1727 * KMOD_MODULE_LIVE: module is live in kernel; 1728 * KMOD_MODULE_COMING: module is being loaded; 1729 * KMOD_MODULE_GOING: module is being unloaded. 1730 */ 1731 KMOD_EXPORT int kmod_module_get_initstate(const struct kmod_module *mod) 1732 { 1733 char path[PATH_MAX], buf[32]; 1734 int fd, err, pathlen; 1735 1736 if (mod == NULL) 1737 return -ENOENT; 1738 1739 /* remove const: this can only change internal state */ 1740 if (kmod_module_is_builtin((struct kmod_module *)mod)) 1741 return KMOD_MODULE_BUILTIN; 1742 1743 pathlen = snprintf(path, sizeof(path), 1744 "/sys/module/%s/initstate", mod->name); 1745 fd = open(path, O_RDONLY|O_CLOEXEC); 1746 if (fd < 0) { 1747 err = -errno; 1748 1749 DBG(mod->ctx, "could not open '%s': %s\n", 1750 path, strerror(-err)); 1751 1752 if (pathlen > (int)sizeof("/initstate") - 1) { 1753 struct stat st; 1754 path[pathlen - (sizeof("/initstate") - 1)] = '\0'; 1755 if (stat(path, &st) == 0 && S_ISDIR(st.st_mode)) 1756 return KMOD_MODULE_COMING; 1757 } 1758 1759 DBG(mod->ctx, "could not open '%s': %s\n", 1760 path, strerror(-err)); 1761 return err; 1762 } 1763 1764 err = read_str_safe(fd, buf, sizeof(buf)); 1765 close(fd); 1766 if (err < 0) { 1767 ERR(mod->ctx, "could not read from '%s': %s\n", 1768 path, strerror(-err)); 1769 return err; 1770 } 1771 1772 if (streq(buf, "live\n")) 1773 return KMOD_MODULE_LIVE; 1774 else if (streq(buf, "coming\n")) 1775 return KMOD_MODULE_COMING; 1776 else if (streq(buf, "going\n")) 1777 return KMOD_MODULE_GOING; 1778 1779 ERR(mod->ctx, "unknown %s: '%s'\n", path, buf); 1780 return -EINVAL; 1781 } 1782 1783 /** 1784 * kmod_module_get_size: 1785 * @mod: kmod module 1786 * 1787 * Get the size of this kmod module as returned by Linux kernel. If supported, 1788 * the size is read from the coresize attribute in /sys/module. For older 1789 * kernels, this falls back on /proc/modules and searches for the specified 1790 * module to get its size. 1791 * 1792 * Returns: the size of this kmod module. 1793 */ 1794 KMOD_EXPORT long kmod_module_get_size(const struct kmod_module *mod) 1795 { 1796 FILE *fp; 1797 char line[4096]; 1798 int lineno = 0; 1799 long size = -ENOENT; 1800 int dfd, cfd; 1801 1802 if (mod == NULL) 1803 return -ENOENT; 1804 1805 /* try to open the module dir in /sys. If this fails, don't 1806 * bother trying to find the size as we know the module isn't 1807 * loaded. 1808 */ 1809 snprintf(line, sizeof(line), "/sys/module/%s", mod->name); 1810 dfd = open(line, O_RDONLY|O_CLOEXEC); 1811 if (dfd < 0) 1812 return -errno; 1813 1814 /* available as of linux 3.3.x */ 1815 cfd = openat(dfd, "coresize", O_RDONLY|O_CLOEXEC); 1816 if (cfd >= 0) { 1817 if (read_str_long(cfd, &size, 10) < 0) 1818 ERR(mod->ctx, "failed to read coresize from %s\n", line); 1819 close(cfd); 1820 goto done; 1821 } 1822 1823 /* fall back on parsing /proc/modules */ 1824 fp = fopen("/proc/modules", "re"); 1825 if (fp == NULL) { 1826 int err = -errno; 1827 ERR(mod->ctx, 1828 "could not open /proc/modules: %s\n", strerror(errno)); 1829 close(dfd); 1830 return err; 1831 } 1832 1833 while (fgets(line, sizeof(line), fp)) { 1834 size_t len = strlen(line); 1835 char *saveptr, *endptr, *tok = strtok_r(line, " \t", &saveptr); 1836 long value; 1837 1838 lineno++; 1839 if (tok == NULL || !streq(tok, mod->name)) 1840 goto eat_line; 1841 1842 tok = strtok_r(NULL, " \t", &saveptr); 1843 if (tok == NULL) { 1844 ERR(mod->ctx, 1845 "invalid line format at /proc/modules:%d\n", lineno); 1846 break; 1847 } 1848 1849 value = strtol(tok, &endptr, 10); 1850 if (endptr == tok || *endptr != '\0') { 1851 ERR(mod->ctx, 1852 "invalid line format at /proc/modules:%d\n", lineno); 1853 break; 1854 } 1855 1856 size = value; 1857 break; 1858 eat_line: 1859 while (line[len - 1] != '\n' && fgets(line, sizeof(line), fp)) 1860 len = strlen(line); 1861 } 1862 fclose(fp); 1863 1864 done: 1865 close(dfd); 1866 return size; 1867 } 1868 1869 /** 1870 * kmod_module_get_refcnt: 1871 * @mod: kmod module 1872 * 1873 * Get the ref count of this @mod, as returned by Linux Kernel, by reading 1874 * /sys filesystem. 1875 * 1876 * Returns: the reference count on success or < 0 on failure. 1877 */ 1878 KMOD_EXPORT int kmod_module_get_refcnt(const struct kmod_module *mod) 1879 { 1880 char path[PATH_MAX]; 1881 long refcnt; 1882 int fd, err; 1883 1884 if (mod == NULL) 1885 return -ENOENT; 1886 1887 snprintf(path, sizeof(path), "/sys/module/%s/refcnt", mod->name); 1888 fd = open(path, O_RDONLY|O_CLOEXEC); 1889 if (fd < 0) { 1890 err = -errno; 1891 DBG(mod->ctx, "could not open '%s': %s\n", 1892 path, strerror(errno)); 1893 return err; 1894 } 1895 1896 err = read_str_long(fd, &refcnt, 10); 1897 close(fd); 1898 if (err < 0) { 1899 ERR(mod->ctx, "could not read integer from '%s': '%s'\n", 1900 path, strerror(-err)); 1901 return err; 1902 } 1903 1904 return (int)refcnt; 1905 } 1906 1907 /** 1908 * kmod_module_get_holders: 1909 * @mod: kmod module 1910 * 1911 * Get a list of kmod modules that are holding this @mod, as returned by Linux 1912 * Kernel. After use, free the @list by calling kmod_module_unref_list(). 1913 * 1914 * Returns: a new list of kmod modules on success or NULL on failure. 1915 */ 1916 KMOD_EXPORT struct kmod_list *kmod_module_get_holders(const struct kmod_module *mod) 1917 { 1918 char dname[PATH_MAX]; 1919 struct kmod_list *list = NULL; 1920 struct dirent *dent; 1921 DIR *d; 1922 1923 if (mod == NULL || mod->ctx == NULL) 1924 return NULL; 1925 1926 snprintf(dname, sizeof(dname), "/sys/module/%s/holders", mod->name); 1927 1928 d = opendir(dname); 1929 if (d == NULL) { 1930 ERR(mod->ctx, "could not open '%s': %s\n", 1931 dname, strerror(errno)); 1932 return NULL; 1933 } 1934 1935 for (dent = readdir(d); dent != NULL; dent = readdir(d)) { 1936 struct kmod_module *holder; 1937 struct kmod_list *l; 1938 int err; 1939 1940 if (dent->d_name[0] == '.') { 1941 if (dent->d_name[1] == '\0' || 1942 (dent->d_name[1] == '.' && dent->d_name[2] == '\0')) 1943 continue; 1944 } 1945 1946 err = kmod_module_new_from_name(mod->ctx, dent->d_name, 1947 &holder); 1948 if (err < 0) { 1949 ERR(mod->ctx, "could not create module for '%s': %s\n", 1950 dent->d_name, strerror(-err)); 1951 goto fail; 1952 } 1953 1954 l = kmod_list_append(list, holder); 1955 if (l != NULL) { 1956 list = l; 1957 } else { 1958 ERR(mod->ctx, "out of memory\n"); 1959 kmod_module_unref(holder); 1960 goto fail; 1961 } 1962 } 1963 1964 closedir(d); 1965 return list; 1966 1967 fail: 1968 closedir(d); 1969 kmod_module_unref_list(list); 1970 return NULL; 1971 } 1972 1973 struct kmod_module_section { 1974 unsigned long address; 1975 char name[]; 1976 }; 1977 1978 static void kmod_module_section_free(struct kmod_module_section *section) 1979 { 1980 free(section); 1981 } 1982 1983 /** 1984 * kmod_module_get_sections: 1985 * @mod: kmod module 1986 * 1987 * Get a list of kmod sections of this @mod, as returned by Linux Kernel. The 1988 * structure contained in this list is internal to libkmod and their fields 1989 * can be obtained by calling kmod_module_section_get_name() and 1990 * kmod_module_section_get_address(). 1991 * 1992 * After use, free the @list by calling kmod_module_section_free_list(). 1993 * 1994 * Returns: a new list of kmod module sections on success or NULL on failure. 1995 */ 1996 KMOD_EXPORT struct kmod_list *kmod_module_get_sections(const struct kmod_module *mod) 1997 { 1998 char dname[PATH_MAX]; 1999 struct kmod_list *list = NULL; 2000 struct dirent *dent; 2001 DIR *d; 2002 int dfd; 2003 2004 if (mod == NULL) 2005 return NULL; 2006 2007 snprintf(dname, sizeof(dname), "/sys/module/%s/sections", mod->name); 2008 2009 d = opendir(dname); 2010 if (d == NULL) { 2011 ERR(mod->ctx, "could not open '%s': %s\n", 2012 dname, strerror(errno)); 2013 return NULL; 2014 } 2015 2016 dfd = dirfd(d); 2017 2018 for (dent = readdir(d); dent; dent = readdir(d)) { 2019 struct kmod_module_section *section; 2020 struct kmod_list *l; 2021 unsigned long address; 2022 size_t namesz; 2023 int fd, err; 2024 2025 if (dent->d_name[0] == '.') { 2026 if (dent->d_name[1] == '\0' || 2027 (dent->d_name[1] == '.' && dent->d_name[2] == '\0')) 2028 continue; 2029 } 2030 2031 fd = openat(dfd, dent->d_name, O_RDONLY|O_CLOEXEC); 2032 if (fd < 0) { 2033 ERR(mod->ctx, "could not open '%s/%s': %m\n", 2034 dname, dent->d_name); 2035 goto fail; 2036 } 2037 2038 err = read_str_ulong(fd, &address, 16); 2039 close(fd); 2040 if (err < 0) { 2041 ERR(mod->ctx, "could not read long from '%s/%s': %m\n", 2042 dname, dent->d_name); 2043 goto fail; 2044 } 2045 2046 namesz = strlen(dent->d_name) + 1; 2047 section = malloc(sizeof(*section) + namesz); 2048 2049 if (section == NULL) { 2050 ERR(mod->ctx, "out of memory\n"); 2051 goto fail; 2052 } 2053 2054 section->address = address; 2055 memcpy(section->name, dent->d_name, namesz); 2056 2057 l = kmod_list_append(list, section); 2058 if (l != NULL) { 2059 list = l; 2060 } else { 2061 ERR(mod->ctx, "out of memory\n"); 2062 free(section); 2063 goto fail; 2064 } 2065 } 2066 2067 closedir(d); 2068 return list; 2069 2070 fail: 2071 closedir(d); 2072 kmod_module_unref_list(list); 2073 return NULL; 2074 } 2075 2076 /** 2077 * kmod_module_section_get_module_name: 2078 * @entry: a list entry representing a kmod module section 2079 * 2080 * Get the name of a kmod module section. 2081 * 2082 * After use, free the @list by calling kmod_module_section_free_list(). 2083 * 2084 * Returns: the name of this kmod module section on success or NULL on 2085 * failure. The string is owned by the section, do not free it. 2086 */ 2087 KMOD_EXPORT const char *kmod_module_section_get_name(const struct kmod_list *entry) 2088 { 2089 struct kmod_module_section *section; 2090 2091 if (entry == NULL) 2092 return NULL; 2093 2094 section = entry->data; 2095 return section->name; 2096 } 2097 2098 /** 2099 * kmod_module_section_get_address: 2100 * @entry: a list entry representing a kmod module section 2101 * 2102 * Get the address of a kmod module section. 2103 * 2104 * After use, free the @list by calling kmod_module_section_free_list(). 2105 * 2106 * Returns: the address of this kmod module section on success or ULONG_MAX 2107 * on failure. 2108 */ 2109 KMOD_EXPORT unsigned long kmod_module_section_get_address(const struct kmod_list *entry) 2110 { 2111 struct kmod_module_section *section; 2112 2113 if (entry == NULL) 2114 return (unsigned long)-1; 2115 2116 section = entry->data; 2117 return section->address; 2118 } 2119 2120 /** 2121 * kmod_module_section_free_list: 2122 * @list: kmod module section list 2123 * 2124 * Release the resources taken by @list 2125 */ 2126 KMOD_EXPORT void kmod_module_section_free_list(struct kmod_list *list) 2127 { 2128 while (list) { 2129 kmod_module_section_free(list->data); 2130 list = kmod_list_remove(list); 2131 } 2132 } 2133 2134 static struct kmod_elf *kmod_module_get_elf(const struct kmod_module *mod) 2135 { 2136 if (mod->file == NULL) { 2137 const char *path = kmod_module_get_path(mod); 2138 2139 if (path == NULL) { 2140 errno = ENOENT; 2141 return NULL; 2142 } 2143 2144 ((struct kmod_module *)mod)->file = kmod_file_open(mod->ctx, 2145 path); 2146 if (mod->file == NULL) 2147 return NULL; 2148 } 2149 2150 return kmod_file_get_elf(mod->file); 2151 } 2152 2153 struct kmod_module_info { 2154 char *key; 2155 char value[]; 2156 }; 2157 2158 static struct kmod_module_info *kmod_module_info_new(const char *key, size_t keylen, const char *value, size_t valuelen) 2159 { 2160 struct kmod_module_info *info; 2161 2162 info = malloc(sizeof(struct kmod_module_info) + keylen + valuelen + 2); 2163 if (info == NULL) 2164 return NULL; 2165 2166 info->key = (char *)info + sizeof(struct kmod_module_info) 2167 + valuelen + 1; 2168 memcpy(info->key, key, keylen); 2169 info->key[keylen] = '\0'; 2170 memcpy(info->value, value, valuelen); 2171 info->value[valuelen] = '\0'; 2172 return info; 2173 } 2174 2175 static void kmod_module_info_free(struct kmod_module_info *info) 2176 { 2177 free(info); 2178 } 2179 2180 static struct kmod_list *kmod_module_info_append(struct kmod_list **list, const char *key, size_t keylen, const char *value, size_t valuelen) 2181 { 2182 struct kmod_module_info *info; 2183 struct kmod_list *n; 2184 2185 info = kmod_module_info_new(key, keylen, value, valuelen); 2186 if (info == NULL) 2187 return NULL; 2188 n = kmod_list_append(*list, info); 2189 if (n != NULL) 2190 *list = n; 2191 else 2192 kmod_module_info_free(info); 2193 return n; 2194 } 2195 2196 /** 2197 * kmod_module_get_info: 2198 * @mod: kmod module 2199 * @list: where to return list of module information. Use 2200 * kmod_module_info_get_key() and 2201 * kmod_module_info_get_value(). Release this list with 2202 * kmod_module_info_free_list() 2203 * 2204 * Get a list of entries in ELF section ".modinfo", these contain 2205 * alias, license, depends, vermagic and other keys with respective 2206 * values. If the module is signed (CONFIG_MODULE_SIG), information 2207 * about the module signature is included as well: signer, 2208 * sig_key and sig_hashalgo. 2209 * 2210 * After use, free the @list by calling kmod_module_info_free_list(). 2211 * 2212 * Returns: 0 on success or < 0 otherwise. 2213 */ 2214 KMOD_EXPORT int kmod_module_get_info(const struct kmod_module *mod, struct kmod_list **list) 2215 { 2216 struct kmod_elf *elf; 2217 char **strings; 2218 int i, count, ret = -ENOMEM; 2219 struct kmod_signature_info sig_info; 2220 2221 if (mod == NULL || list == NULL) 2222 return -ENOENT; 2223 2224 assert(*list == NULL); 2225 2226 elf = kmod_module_get_elf(mod); 2227 if (elf == NULL) 2228 return -errno; 2229 2230 count = kmod_elf_get_strings(elf, ".modinfo", &strings); 2231 if (count < 0) 2232 return count; 2233 2234 for (i = 0; i < count; i++) { 2235 struct kmod_list *n; 2236 const char *key, *value; 2237 size_t keylen, valuelen; 2238 2239 key = strings[i]; 2240 value = strchr(key, '='); 2241 if (value == NULL) { 2242 keylen = strlen(key); 2243 valuelen = 0; 2244 value = key; 2245 } else { 2246 keylen = value - key; 2247 value++; 2248 valuelen = strlen(value); 2249 } 2250 2251 n = kmod_module_info_append(list, key, keylen, value, valuelen); 2252 if (n == NULL) 2253 goto list_error; 2254 } 2255 2256 if (kmod_module_signature_info(mod->file, &sig_info)) { 2257 struct kmod_list *n; 2258 char *key_hex; 2259 2260 n = kmod_module_info_append(list, "signature", strlen("sig_id"), 2261 sig_info.id_type, strlen(sig_info.id_type)); 2262 if (n == NULL) 2263 goto list_error; 2264 count++; 2265 2266 n = kmod_module_info_append(list, "signer", strlen("signer"), 2267 sig_info.signer, sig_info.signer_len); 2268 if (n == NULL) 2269 goto list_error; 2270 count++; 2271 2272 if (sig_info.key_id_len) { 2273 /* Display the key id as 01:12:DE:AD:BE:EF:... */ 2274 key_hex = malloc(sig_info.key_id_len * 3); 2275 if (key_hex == NULL) 2276 goto list_error; 2277 for (i = 0; i < (int)sig_info.key_id_len; i++) { 2278 sprintf(key_hex + i * 3, "%02X", 2279 (unsigned char)sig_info.key_id[i]); 2280 if (i < (int)sig_info.key_id_len - 1) 2281 key_hex[i * 3 + 2] = ':'; 2282 } 2283 n = kmod_module_info_append(list, "sig_key", strlen("sig_key"), 2284 key_hex, sig_info.key_id_len * 3 - 1); 2285 free(key_hex); 2286 if (n == NULL) 2287 goto list_error; 2288 count++; 2289 } else { 2290 n = kmod_module_info_append(list, "sig_key", strlen("sig_key"), 2291 NULL, 0); 2292 if (n == NULL) 2293 goto list_error; 2294 count++; 2295 } 2296 2297 n = kmod_module_info_append(list, 2298 "sig_hashalgo", strlen("sig_hashalgo"), 2299 sig_info.hash_algo, strlen(sig_info.hash_algo)); 2300 if (n == NULL) 2301 goto list_error; 2302 count++; 2303 2304 /* 2305 * Omit sig_info.algo for now, as these 2306 * are currently constant. 2307 */ 2308 } 2309 ret = count; 2310 2311 list_error: 2312 if (ret < 0) { 2313 kmod_module_info_free_list(*list); 2314 *list = NULL; 2315 } 2316 free(strings); 2317 return ret; 2318 } 2319 2320 /** 2321 * kmod_module_info_get_key: 2322 * @entry: a list entry representing a kmod module info 2323 * 2324 * Get the key of a kmod module info. 2325 * 2326 * Returns: the key of this kmod module info on success or NULL on 2327 * failure. The string is owned by the info, do not free it. 2328 */ 2329 KMOD_EXPORT const char *kmod_module_info_get_key(const struct kmod_list *entry) 2330 { 2331 struct kmod_module_info *info; 2332 2333 if (entry == NULL) 2334 return NULL; 2335 2336 info = entry->data; 2337 return info->key; 2338 } 2339 2340 /** 2341 * kmod_module_info_get_value: 2342 * @entry: a list entry representing a kmod module info 2343 * 2344 * Get the value of a kmod module info. 2345 * 2346 * Returns: the value of this kmod module info on success or NULL on 2347 * failure. The string is owned by the info, do not free it. 2348 */ 2349 KMOD_EXPORT const char *kmod_module_info_get_value(const struct kmod_list *entry) 2350 { 2351 struct kmod_module_info *info; 2352 2353 if (entry == NULL) 2354 return NULL; 2355 2356 info = entry->data; 2357 return info->value; 2358 } 2359 2360 /** 2361 * kmod_module_info_free_list: 2362 * @list: kmod module info list 2363 * 2364 * Release the resources taken by @list 2365 */ 2366 KMOD_EXPORT void kmod_module_info_free_list(struct kmod_list *list) 2367 { 2368 while (list) { 2369 kmod_module_info_free(list->data); 2370 list = kmod_list_remove(list); 2371 } 2372 } 2373 2374 struct kmod_module_version { 2375 uint64_t crc; 2376 char symbol[]; 2377 }; 2378 2379 static struct kmod_module_version *kmod_module_versions_new(uint64_t crc, const char *symbol) 2380 { 2381 struct kmod_module_version *mv; 2382 size_t symbollen = strlen(symbol) + 1; 2383 2384 mv = malloc(sizeof(struct kmod_module_version) + symbollen); 2385 if (mv == NULL) 2386 return NULL; 2387 2388 mv->crc = crc; 2389 memcpy(mv->symbol, symbol, symbollen); 2390 return mv; 2391 } 2392 2393 static void kmod_module_version_free(struct kmod_module_version *version) 2394 { 2395 free(version); 2396 } 2397 2398 /** 2399 * kmod_module_get_versions: 2400 * @mod: kmod module 2401 * @list: where to return list of module versions. Use 2402 * kmod_module_version_get_symbol() and 2403 * kmod_module_version_get_crc(). Release this list with 2404 * kmod_module_versions_free_list() 2405 * 2406 * Get a list of entries in ELF section "__versions". 2407 * 2408 * After use, free the @list by calling kmod_module_versions_free_list(). 2409 * 2410 * Returns: 0 on success or < 0 otherwise. 2411 */ 2412 KMOD_EXPORT int kmod_module_get_versions(const struct kmod_module *mod, struct kmod_list **list) 2413 { 2414 struct kmod_elf *elf; 2415 struct kmod_modversion *versions; 2416 int i, count, ret = 0; 2417 2418 if (mod == NULL || list == NULL) 2419 return -ENOENT; 2420 2421 assert(*list == NULL); 2422 2423 elf = kmod_module_get_elf(mod); 2424 if (elf == NULL) 2425 return -errno; 2426 2427 count = kmod_elf_get_modversions(elf, &versions); 2428 if (count < 0) 2429 return count; 2430 2431 for (i = 0; i < count; i++) { 2432 struct kmod_module_version *mv; 2433 struct kmod_list *n; 2434 2435 mv = kmod_module_versions_new(versions[i].crc, versions[i].symbol); 2436 if (mv == NULL) { 2437 ret = -errno; 2438 kmod_module_versions_free_list(*list); 2439 *list = NULL; 2440 goto list_error; 2441 } 2442 2443 n = kmod_list_append(*list, mv); 2444 if (n != NULL) 2445 *list = n; 2446 else { 2447 kmod_module_version_free(mv); 2448 kmod_module_versions_free_list(*list); 2449 *list = NULL; 2450 ret = -ENOMEM; 2451 goto list_error; 2452 } 2453 } 2454 ret = count; 2455 2456 list_error: 2457 free(versions); 2458 return ret; 2459 } 2460 2461 /** 2462 * kmod_module_version_get_symbol: 2463 * @entry: a list entry representing a kmod module versions 2464 * 2465 * Get the symbol of a kmod module versions. 2466 * 2467 * Returns: the symbol of this kmod module versions on success or NULL 2468 * on failure. The string is owned by the versions, do not free it. 2469 */ 2470 KMOD_EXPORT const char *kmod_module_version_get_symbol(const struct kmod_list *entry) 2471 { 2472 struct kmod_module_version *version; 2473 2474 if (entry == NULL) 2475 return NULL; 2476 2477 version = entry->data; 2478 return version->symbol; 2479 } 2480 2481 /** 2482 * kmod_module_version_get_crc: 2483 * @entry: a list entry representing a kmod module version 2484 * 2485 * Get the crc of a kmod module version. 2486 * 2487 * Returns: the crc of this kmod module version on success or NULL on 2488 * failure. The string is owned by the version, do not free it. 2489 */ 2490 KMOD_EXPORT uint64_t kmod_module_version_get_crc(const struct kmod_list *entry) 2491 { 2492 struct kmod_module_version *version; 2493 2494 if (entry == NULL) 2495 return 0; 2496 2497 version = entry->data; 2498 return version->crc; 2499 } 2500 2501 /** 2502 * kmod_module_versions_free_list: 2503 * @list: kmod module versions list 2504 * 2505 * Release the resources taken by @list 2506 */ 2507 KMOD_EXPORT void kmod_module_versions_free_list(struct kmod_list *list) 2508 { 2509 while (list) { 2510 kmod_module_version_free(list->data); 2511 list = kmod_list_remove(list); 2512 } 2513 } 2514 2515 struct kmod_module_symbol { 2516 uint64_t crc; 2517 char symbol[]; 2518 }; 2519 2520 static struct kmod_module_symbol *kmod_module_symbols_new(uint64_t crc, const char *symbol) 2521 { 2522 struct kmod_module_symbol *mv; 2523 size_t symbollen = strlen(symbol) + 1; 2524 2525 mv = malloc(sizeof(struct kmod_module_symbol) + symbollen); 2526 if (mv == NULL) 2527 return NULL; 2528 2529 mv->crc = crc; 2530 memcpy(mv->symbol, symbol, symbollen); 2531 return mv; 2532 } 2533 2534 static void kmod_module_symbol_free(struct kmod_module_symbol *symbol) 2535 { 2536 free(symbol); 2537 } 2538 2539 /** 2540 * kmod_module_get_symbols: 2541 * @mod: kmod module 2542 * @list: where to return list of module symbols. Use 2543 * kmod_module_symbol_get_symbol() and 2544 * kmod_module_symbol_get_crc(). Release this list with 2545 * kmod_module_symbols_free_list() 2546 * 2547 * Get a list of entries in ELF section ".symtab" or "__ksymtab_strings". 2548 * 2549 * After use, free the @list by calling kmod_module_symbols_free_list(). 2550 * 2551 * Returns: 0 on success or < 0 otherwise. 2552 */ 2553 KMOD_EXPORT int kmod_module_get_symbols(const struct kmod_module *mod, struct kmod_list **list) 2554 { 2555 struct kmod_elf *elf; 2556 struct kmod_modversion *symbols; 2557 int i, count, ret = 0; 2558 2559 if (mod == NULL || list == NULL) 2560 return -ENOENT; 2561 2562 assert(*list == NULL); 2563 2564 elf = kmod_module_get_elf(mod); 2565 if (elf == NULL) 2566 return -errno; 2567 2568 count = kmod_elf_get_symbols(elf, &symbols); 2569 if (count < 0) 2570 return count; 2571 2572 for (i = 0; i < count; i++) { 2573 struct kmod_module_symbol *mv; 2574 struct kmod_list *n; 2575 2576 mv = kmod_module_symbols_new(symbols[i].crc, symbols[i].symbol); 2577 if (mv == NULL) { 2578 ret = -errno; 2579 kmod_module_symbols_free_list(*list); 2580 *list = NULL; 2581 goto list_error; 2582 } 2583 2584 n = kmod_list_append(*list, mv); 2585 if (n != NULL) 2586 *list = n; 2587 else { 2588 kmod_module_symbol_free(mv); 2589 kmod_module_symbols_free_list(*list); 2590 *list = NULL; 2591 ret = -ENOMEM; 2592 goto list_error; 2593 } 2594 } 2595 ret = count; 2596 2597 list_error: 2598 free(symbols); 2599 return ret; 2600 } 2601 2602 /** 2603 * kmod_module_symbol_get_symbol: 2604 * @entry: a list entry representing a kmod module symbols 2605 * 2606 * Get the symbol of a kmod module symbols. 2607 * 2608 * Returns: the symbol of this kmod module symbols on success or NULL 2609 * on failure. The string is owned by the symbols, do not free it. 2610 */ 2611 KMOD_EXPORT const char *kmod_module_symbol_get_symbol(const struct kmod_list *entry) 2612 { 2613 struct kmod_module_symbol *symbol; 2614 2615 if (entry == NULL) 2616 return NULL; 2617 2618 symbol = entry->data; 2619 return symbol->symbol; 2620 } 2621 2622 /** 2623 * kmod_module_symbol_get_crc: 2624 * @entry: a list entry representing a kmod module symbol 2625 * 2626 * Get the crc of a kmod module symbol. 2627 * 2628 * Returns: the crc of this kmod module symbol on success or NULL on 2629 * failure. The string is owned by the symbol, do not free it. 2630 */ 2631 KMOD_EXPORT uint64_t kmod_module_symbol_get_crc(const struct kmod_list *entry) 2632 { 2633 struct kmod_module_symbol *symbol; 2634 2635 if (entry == NULL) 2636 return 0; 2637 2638 symbol = entry->data; 2639 return symbol->crc; 2640 } 2641 2642 /** 2643 * kmod_module_symbols_free_list: 2644 * @list: kmod module symbols list 2645 * 2646 * Release the resources taken by @list 2647 */ 2648 KMOD_EXPORT void kmod_module_symbols_free_list(struct kmod_list *list) 2649 { 2650 while (list) { 2651 kmod_module_symbol_free(list->data); 2652 list = kmod_list_remove(list); 2653 } 2654 } 2655 2656 struct kmod_module_dependency_symbol { 2657 uint64_t crc; 2658 uint8_t bind; 2659 char symbol[]; 2660 }; 2661 2662 static struct kmod_module_dependency_symbol *kmod_module_dependency_symbols_new(uint64_t crc, uint8_t bind, const char *symbol) 2663 { 2664 struct kmod_module_dependency_symbol *mv; 2665 size_t symbollen = strlen(symbol) + 1; 2666 2667 mv = malloc(sizeof(struct kmod_module_dependency_symbol) + symbollen); 2668 if (mv == NULL) 2669 return NULL; 2670 2671 mv->crc = crc; 2672 mv->bind = bind; 2673 memcpy(mv->symbol, symbol, symbollen); 2674 return mv; 2675 } 2676 2677 static void kmod_module_dependency_symbol_free(struct kmod_module_dependency_symbol *dependency_symbol) 2678 { 2679 free(dependency_symbol); 2680 } 2681 2682 /** 2683 * kmod_module_get_dependency_symbols: 2684 * @mod: kmod module 2685 * @list: where to return list of module dependency_symbols. Use 2686 * kmod_module_dependency_symbol_get_symbol() and 2687 * kmod_module_dependency_symbol_get_crc(). Release this list with 2688 * kmod_module_dependency_symbols_free_list() 2689 * 2690 * Get a list of entries in ELF section ".symtab" or "__ksymtab_strings". 2691 * 2692 * After use, free the @list by calling 2693 * kmod_module_dependency_symbols_free_list(). 2694 * 2695 * Returns: 0 on success or < 0 otherwise. 2696 */ 2697 KMOD_EXPORT int kmod_module_get_dependency_symbols(const struct kmod_module *mod, struct kmod_list **list) 2698 { 2699 struct kmod_elf *elf; 2700 struct kmod_modversion *symbols; 2701 int i, count, ret = 0; 2702 2703 if (mod == NULL || list == NULL) 2704 return -ENOENT; 2705 2706 assert(*list == NULL); 2707 2708 elf = kmod_module_get_elf(mod); 2709 if (elf == NULL) 2710 return -errno; 2711 2712 count = kmod_elf_get_dependency_symbols(elf, &symbols); 2713 if (count < 0) 2714 return count; 2715 2716 for (i = 0; i < count; i++) { 2717 struct kmod_module_dependency_symbol *mv; 2718 struct kmod_list *n; 2719 2720 mv = kmod_module_dependency_symbols_new(symbols[i].crc, 2721 symbols[i].bind, 2722 symbols[i].symbol); 2723 if (mv == NULL) { 2724 ret = -errno; 2725 kmod_module_dependency_symbols_free_list(*list); 2726 *list = NULL; 2727 goto list_error; 2728 } 2729 2730 n = kmod_list_append(*list, mv); 2731 if (n != NULL) 2732 *list = n; 2733 else { 2734 kmod_module_dependency_symbol_free(mv); 2735 kmod_module_dependency_symbols_free_list(*list); 2736 *list = NULL; 2737 ret = -ENOMEM; 2738 goto list_error; 2739 } 2740 } 2741 ret = count; 2742 2743 list_error: 2744 free(symbols); 2745 return ret; 2746 } 2747 2748 /** 2749 * kmod_module_dependency_symbol_get_symbol: 2750 * @entry: a list entry representing a kmod module dependency_symbols 2751 * 2752 * Get the dependency symbol of a kmod module 2753 * 2754 * Returns: the symbol of this kmod module dependency_symbols on success or NULL 2755 * on failure. The string is owned by the dependency_symbols, do not free it. 2756 */ 2757 KMOD_EXPORT const char *kmod_module_dependency_symbol_get_symbol(const struct kmod_list *entry) 2758 { 2759 struct kmod_module_dependency_symbol *dependency_symbol; 2760 2761 if (entry == NULL) 2762 return NULL; 2763 2764 dependency_symbol = entry->data; 2765 return dependency_symbol->symbol; 2766 } 2767 2768 /** 2769 * kmod_module_dependency_symbol_get_crc: 2770 * @entry: a list entry representing a kmod module dependency_symbol 2771 * 2772 * Get the crc of a kmod module dependency_symbol. 2773 * 2774 * Returns: the crc of this kmod module dependency_symbol on success or NULL on 2775 * failure. The string is owned by the dependency_symbol, do not free it. 2776 */ 2777 KMOD_EXPORT uint64_t kmod_module_dependency_symbol_get_crc(const struct kmod_list *entry) 2778 { 2779 struct kmod_module_dependency_symbol *dependency_symbol; 2780 2781 if (entry == NULL) 2782 return 0; 2783 2784 dependency_symbol = entry->data; 2785 return dependency_symbol->crc; 2786 } 2787 2788 /** 2789 * kmod_module_dependency_symbol_get_bind: 2790 * @entry: a list entry representing a kmod module dependency_symbol 2791 * 2792 * Get the bind type of a kmod module dependency_symbol. 2793 * 2794 * Returns: the bind of this kmod module dependency_symbol on success 2795 * or < 0 on failure. 2796 */ 2797 KMOD_EXPORT int kmod_module_dependency_symbol_get_bind(const struct kmod_list *entry) 2798 { 2799 struct kmod_module_dependency_symbol *dependency_symbol; 2800 2801 if (entry == NULL) 2802 return 0; 2803 2804 dependency_symbol = entry->data; 2805 return dependency_symbol->bind; 2806 } 2807 2808 /** 2809 * kmod_module_dependency_symbols_free_list: 2810 * @list: kmod module dependency_symbols list 2811 * 2812 * Release the resources taken by @list 2813 */ 2814 KMOD_EXPORT void kmod_module_dependency_symbols_free_list(struct kmod_list *list) 2815 { 2816 while (list) { 2817 kmod_module_dependency_symbol_free(list->data); 2818 list = kmod_list_remove(list); 2819 } 2820 } 2821