mirror of
https://github.com/AuxXxilium/kmod.git
synced 2024-12-27 13:55:35 +07:00
99 lines
2.5 KiB
C
99 lines
2.5 KiB
C
/*
|
|
* libkmod - interface to kernel module operations
|
|
*
|
|
* Copyright (C) 2011 ProFUSION embedded systems
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation version 2.1.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stddef.h>
|
|
#include <stdarg.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <inttypes.h>
|
|
|
|
#include "libkmod.h"
|
|
#include "libkmod-private.h"
|
|
|
|
/**
|
|
* SECTION:libkmod-loaded
|
|
* @short_description: currently loaded modules
|
|
*
|
|
* Information about currently loaded modules, as reported by Linux kernel
|
|
*/
|
|
|
|
/**
|
|
* kmod_loaded_get_list:
|
|
* @ctx: kmod library context
|
|
* @list: where to save the list of loaded modules
|
|
*
|
|
* Get a list of all modules currently loaded in kernel. It uses /proc/modules
|
|
* to get a list of loaded modules and create kmod_module objects that are put
|
|
* in @list in no particular order.
|
|
*
|
|
* All the returned modules get their refcount incremented (or are created if
|
|
* they do not exist yet). After using the list, release the resources by
|
|
* calling kmod_module_unref_list().
|
|
*
|
|
* Returns: 0 on success or < 0 on error.
|
|
*/
|
|
KMOD_EXPORT int kmod_loaded_get_list(struct kmod_ctx *ctx,
|
|
struct kmod_list **list)
|
|
{
|
|
struct kmod_list *l = NULL;
|
|
FILE *fp;
|
|
char line[4096];
|
|
|
|
if (ctx == NULL || list == NULL)
|
|
return -ENOENT;
|
|
|
|
fp = fopen("/proc/modules", "r");
|
|
if (fp == NULL) {
|
|
int err = -errno;
|
|
ERR(ctx, "could not open /proc/modules: %s\n", strerror(errno));
|
|
return err;
|
|
}
|
|
|
|
while (fgets(line, sizeof(line), fp)) {
|
|
struct kmod_module *m;
|
|
struct kmod_list *node;
|
|
int err;
|
|
char *saveptr, *name = strtok_r(line, " \t", &saveptr);
|
|
|
|
err = kmod_module_new_from_name(ctx, name, &m);
|
|
if (err < 0) {
|
|
ERR(ctx, "could not get module from name '%s': %s\n",
|
|
name, strerror(-err));
|
|
continue;
|
|
}
|
|
|
|
node = kmod_list_append(l, m);
|
|
if (node)
|
|
l = node;
|
|
else {
|
|
ERR(ctx, "out of memory\n");
|
|
kmod_module_unref(m);
|
|
}
|
|
}
|
|
|
|
fclose(fp);
|
|
*list = l;
|
|
|
|
return 0;
|
|
}
|