1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* HardInfo - Displays System Information
* Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@linuxmag.com.br>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 2.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
void
scan_modules(void)
{
FILE *lsmod;
gchar buffer[1024];
lsmod = popen("/sbin/lsmod", "r");
if (!lsmod)
return;
fgets(buffer, 1024, lsmod); /* Discards the first line */
while (fgets(buffer, 1024, lsmod)) {
gchar *buf, *strmodule, *hashkey;
gchar *author = NULL,
*description = NULL,
*license = NULL,
*deps = NULL, *vermagic = NULL, *filename = NULL, modname[64];
FILE *modi;
glong memory;
shell_status_pulse();
buf = buffer;
sscanf(buf, "%s %ld", modname, &memory);
hashkey = g_strdup_printf("MOD%s", modname);
buf = g_strdup_printf("/sbin/modinfo %s", modname);
modi = popen(buf, "r");
while (fgets(buffer, 1024, modi)) {
gchar **tmp = g_strsplit(buffer, ":", 2);
GET_STR("author", author);
GET_STR("description", description);
GET_STR("license", license);
GET_STR("depends", deps);
GET_STR("vermagic", vermagic);
GET_STR("filename", filename);
g_strfreev(tmp);
}
pclose(modi);
g_free(buf);
/* old modutils includes quotes in some strings; strip them */
/*remove_quotes(modname);
remove_quotes(description);
remove_quotes(vermagic);
remove_quotes(author);
remove_quotes(license); */
/* old modutils displays <none> when there's no value for a
given field; this is not desirable in the module name
display, so change it to an empty string */
if (description && !strcmp(description, "<none>")) {
g_free(description);
description = g_strdup("");
}
/* append this module to the list of modules */
module_list = g_strdup_printf("%s$%s$%s=%s\n",
module_list,
hashkey,
modname,
description ? description : "");
#define NONE_IF_NULL(var) (var) ? (var) : "N/A"
/* create the module information string */
strmodule = g_strdup_printf("[Module Information]\n"
"Path=%s\n"
"Used Memory=%.2fKiB\n"
"[Description]\n"
"Name=%s\n"
"Description=%s\n"
"Version Magic=%s\n"
"[Copyright]\n"
"Author=%s\n"
"License=%s\n",
NONE_IF_NULL(filename),
memory / 1024.0,
NONE_IF_NULL(modname),
NONE_IF_NULL(description),
NONE_IF_NULL(vermagic),
NONE_IF_NULL(author),
NONE_IF_NULL(license));
/* if there are dependencies, append them to that string */
if (deps && strlen(deps)) {
gchar **tmp = g_strsplit(deps, ",", 0);
strmodule = g_strconcat(strmodule,
"\n[Dependencies]\n",
g_strjoinv("=\n", tmp),
"=\n", NULL);
g_strfreev(tmp);
g_free(deps);
}
g_hash_table_insert(devices, hashkey, strmodule);
g_free(license);
g_free(description);
g_free(author);
g_free(vermagic);
g_free(filename);
}
pclose(lsmod);
}
|