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
52enum 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 */
63struct 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
110static 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
126static 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
137int 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
208fail:
209	kmod_module_unref_list(list);
210	mod->init.dep = false;
211	return err;
212}
213
214void kmod_module_set_visited(struct kmod_module *mod, bool visited)
215{
216	mod->visited = visited;
217}
218
219void 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
225void kmod_module_set_required(struct kmod_module *mod, bool required)
226{
227	mod->required = required;
228}
229
230bool 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 */
262static 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 */
329KMOD_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
344int 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 */
387KMOD_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 */
460KMOD_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 */
491KMOD_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 */
536KMOD_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
582finish:
583	DBG(ctx, "lookup %s=%d, list=%p\n", alias, err, *list);
584	return err;
585fail:
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 */
602KMOD_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 */
624KMOD_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
631static 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 */
661KMOD_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
682fail:
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 */
700KMOD_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 */
718KMOD_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 */
737KMOD_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
763extern 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 */
778KMOD_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
799extern 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 */
816KMOD_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);
883init_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
891static 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 */
923KMOD_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
959fail:
960	kmod_module_unref_list(*output);
961	*output = NULL;
962	return -ENOMEM;
963}
964
965static 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
987struct probe_insert_cb {
988	int (*run_install)(struct kmod_module *m, const char *cmd, void *data);
989	void *data;
990};
991
992static 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
1042static 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
1068static 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 */
1074static 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
1110fail:
1111	kmod_module_unref_list(pre);
1112	kmod_module_unref_list(post);
1113
1114	return err;
1115}
1116
1117/* re-entrant */
1118static 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
1166finish:
1167	kmod_module_unref_list(dep);
1168	return err;
1169}
1170
1171static 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 */
1237KMOD_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
1332finish_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 */
1372KMOD_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
1428failed:
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 */
1447KMOD_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
1481void 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
1487static 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 */
1524KMOD_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 */
1576KMOD_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
1610void 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 */
1644KMOD_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		}
1682eat_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 */
1702KMOD_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 */
1731KMOD_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 */
1794KMOD_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;
1858eat_line:
1859		while (line[len - 1] != '\n' && fgets(line, sizeof(line), fp))
1860			len = strlen(line);
1861	}
1862	fclose(fp);
1863
1864done:
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 */
1878KMOD_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 */
1916KMOD_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
1967fail:
1968	closedir(d);
1969	kmod_module_unref_list(list);
1970	return NULL;
1971}
1972
1973struct kmod_module_section {
1974	unsigned long address;
1975	char name[];
1976};
1977
1978static 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 */
1996KMOD_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
2070fail:
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 */
2087KMOD_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 */
2109KMOD_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 */
2126KMOD_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
2134static 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
2153struct kmod_module_info {
2154	char *key;
2155	char value[];
2156};
2157
2158static 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
2175static void kmod_module_info_free(struct kmod_module_info *info)
2176{
2177	free(info);
2178}
2179
2180static 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 */
2214KMOD_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
2311list_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 */
2329KMOD_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 */
2349KMOD_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 */
2366KMOD_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
2374struct kmod_module_version {
2375	uint64_t crc;
2376	char symbol[];
2377};
2378
2379static 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
2393static 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 */
2412KMOD_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
2456list_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 */
2470KMOD_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 */
2490KMOD_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 */
2507KMOD_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
2515struct kmod_module_symbol {
2516	uint64_t crc;
2517	char symbol[];
2518};
2519
2520static 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
2534static 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 */
2553KMOD_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
2597list_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 */
2611KMOD_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 */
2631KMOD_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 */
2648KMOD_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
2656struct kmod_module_dependency_symbol {
2657	uint64_t crc;
2658	uint8_t bind;
2659	char symbol[];
2660};
2661
2662static 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
2677static 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 */
2697KMOD_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
2743list_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 */
2757KMOD_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 */
2777KMOD_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 */
2797KMOD_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 */
2814KMOD_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