Mercurial > hg > toybox
annotate toys/pending/modprobe.c @ 1384:4a7438307429 draft
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sun, 06 Jul 2014 23:21:13 -0500 |
parents | b13728c24a58 |
children | 00c20f410c46 |
rev | line source |
---|---|
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* modprobe.c - modprobe utility. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright 2012 Madhur Verma <mad.flexi@gmail.com> |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 * No Standard. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 USE_MODPROBE(NEWTOY(modprobe, "alrqvsDb", TOYFLAG_SBIN)) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 config MODPROBE |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 bool "modprobe" |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 default n |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 help |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 usage: modprobe [-alrqvsDb] MODULE [symbol=value][...] |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 modprobe utility - inserts modules and dependencies. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 -a Load multiple MODULEs |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 -l List (MODULE is a pattern) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 -r Remove MODULE (stacks) or do autoclean |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 -q Quiet |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 -v Verbose |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 -s Log to syslog |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 -D Show dependencies |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 -b Apply blacklist to module names too |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 #define FOR_modprobe |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 #include "toys.h" |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 #include <sys/syscall.h> |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 GLOBALS( |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 struct arg_list *probes; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 struct arg_list *dbase[256]; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 char *cmdopts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 int nudeps; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 uint8_t symreq; |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
37 void (*dbg)(char *format, ...); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 ) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 /* Note: if "#define DBASE_SIZE" modified, |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 * Please update GLOBALS dbase[256] accordingly. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 #define DBASE_SIZE 256 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 #define MODNAME_LEN 256 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 // Modules flag definations |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 #define MOD_ALOADED 0x0001 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 #define MOD_BLACKLIST 0x0002 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 #define MOD_FNDDEPMOD 0x0004 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 #define MOD_NDDEPS 0x0008 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 // dummy interface for debugging. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 static void dummy(char *format, ...) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 // Current probing modules info |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 struct module_s { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 uint32_t flags; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 char *cmdname, *name, *depent, *opts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 struct arg_list *rnames, *dep; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 }; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 // Converts path name FILE to module name. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 static char *path2mod(char *file, char *mod) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 { |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
67 int i; |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
68 char *from, *lslash; |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
70 if (!file) return NULL; |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
71 if (!mod) mod = xmalloc(MODNAME_LEN); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 lslash = strrchr(file, '/'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 if (!lslash || (lslash == file && !lslash[1])) from = file; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 else from = lslash + 1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 for (i = 0; i < (MODNAME_LEN-1) && from[i] && from[i] != '.'; i++) |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
78 mod[i] = (from[i] == '-') ? '_' : from[i]; |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
79 mod[i] = '\0'; |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
80 return mod; |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 // Add options in opts from toadd. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 static char *add_opts(char *opts, char *toadd) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 if (toadd) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 int optlen = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 if (opts) optlen = strlen(opts); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 opts = xrealloc(opts, optlen + strlen(toadd) + 2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 sprintf(opts + optlen, " %s", toadd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 return opts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 // Remove first element from the list and return it. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 static void *llist_popme(struct arg_list **head) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 char *data = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 struct arg_list *temp = *head; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 if (temp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 data = temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 *head = temp->next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 free(temp); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 return data; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 // Add new node at the beginning of the list. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 static void llist_add(struct arg_list **old, void *data) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 struct arg_list *new = xmalloc(sizeof(struct arg_list)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 new->arg = (char*)data; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 new->next = *old; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 *old = new; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 // Add new node at tail of list. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 static void llist_add_tail(struct arg_list **head, void *data) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 while (*head) head = &(*head)->next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 *head = xzalloc(sizeof(struct arg_list)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 (*head)->arg = (char*)data; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 // Reverse list order. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 static struct arg_list *llist_rev(struct arg_list *list) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 struct arg_list *rev = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 while (list) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 struct arg_list *next = list->next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 list->next = rev; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 rev = list; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 list = next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 return rev; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 * Returns struct module_s from the data base if found, NULL otherwise. |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
145 * if add - create module entry, add it to data base and return the same mod. |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 */ |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
147 static struct module_s *get_mod(char *mod, uint8_t add) |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
149 char name[MODNAME_LEN]; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 struct module_s *modentry; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 struct arg_list *temp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 unsigned i, hash = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 path2mod(mod, name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 for (i = 0; name[i]; i++) hash = ((hash*31) + hash) + name[i]; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 hash %= DBASE_SIZE; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 for (temp = TT.dbase[hash]; temp; temp = temp->next) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 modentry = (struct module_s *) temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 if (!strcmp(modentry->name, name)) return modentry; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 } |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
161 if (!add) return NULL; |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 modentry = xzalloc(sizeof(*modentry)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 modentry->name = xstrdup(name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 llist_add(&TT.dbase[hash], modentry); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 return modentry; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 * Read a line from file with \ continuation and escape commented line. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 * Return the line in allocated string (*li) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 static int read_line(FILE *fl, char **li) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 char *nxtline = NULL, *line; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 int len, nxtlen, linelen, nxtlinelen; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 while (1) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 line = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 linelen = nxtlinelen = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 len = getline(&line, (size_t*)&linelen, fl); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 if (len <= 0) return len; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 // checking for commented lines. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 if (line[0] != '#') break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 for (;;) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 if (line[len - 1] == '\n') len--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 // checking line continuation. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 if (!len || line[len - 1] != '\\') break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 len--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 nxtlen = getline(&nxtline, (size_t*)&nxtlinelen, fl); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 if (nxtlen <= 0) break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 if (linelen < len + nxtlen + 1) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 linelen = len + nxtlen + 1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 line = xrealloc(line, linelen); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 memcpy(&line[len], nxtline, nxtlen); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 len += nxtlen; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 line[len] = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 *li = xstrdup(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 if (line) free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 if (nxtline) free(nxtline); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 return len; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 * Action to be taken on all config files in default directories |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 * checks for aliases, options, install, remove and blacklist |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 static int config_action(struct dirtree *node) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 FILE *fc; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 char *filename, *tokens[3], *line, *linecp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 struct module_s *modent; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 int tcount = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 if (!dirtree_notdotdot(node)) return 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 if (S_ISDIR(node->st.st_mode)) return DIRTREE_RECURSE; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 if (!S_ISREG(node->st.st_mode)) return 0; // process only regular file |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 filename = dirtree_path(node, NULL); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 if (!(fc = fopen(filename, "r"))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 free(filename); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 return 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 for (line = linecp = NULL; read_line(fc, &line) > 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 free(line), free(linecp), line = linecp = NULL) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 char *tk = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 if (!strlen(line)) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 linecp = xstrdup(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 for (tk = strtok(linecp, "# \t"), tcount = 0; tk; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 tk = strtok(NULL, "# \t"), tcount++) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 tokens[tcount] = tk; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 if (tcount == 2) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 tokens[2] = line + strlen(tokens[0]) + strlen(tokens[1]) + 2; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 if (!tk) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 // process the tokens[0] contains first word of config line. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 if (!strcmp(tokens[0], "alias")) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 struct arg_list *temp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 char aliase[MODNAME_LEN], *realname; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
247 if (!tokens[2]) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 path2mod(tokens[1], aliase); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 for (temp = TT.probes; temp; temp = temp->next) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 modent = (struct module_s *) temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 if (fnmatch(aliase, modent->name, 0)) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 realname = path2mod(tokens[2], NULL); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 llist_add(&modent->rnames, realname); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 if (modent->flags & MOD_NDDEPS) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 modent->flags &= ~MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 TT.nudeps--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 modent = get_mod(realname, 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 if (!(modent->flags & MOD_NDDEPS)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 modent->flags |= MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 TT.nudeps++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 } else if (!strcmp(tokens[0], "options")) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 if (!tokens[2]) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 modent = get_mod(tokens[1], 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 modent->opts = add_opts(modent->opts, tokens[2]); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 } else if (!strcmp(tokens[0], "include")) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 dirtree_read(tokens[1], config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 else if (!strcmp(tokens[0], "blacklist")) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 get_mod(tokens[1], 1)->flags |= MOD_BLACKLIST; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 else if (!strcmp(tokens[0], "install")) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 else if (!strcmp(tokens[0], "remove")) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 else error_msg("Invalid option %s found in file %s", tokens[0], filename); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 fclose(fc); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 free(filename); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 return 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 // Show matched modules else return -1 on failure. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
282 static int depmode_read_entry(char *cmdname) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 char *line; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 int ret = -1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 FILE *fe = xfopen("modules.dep", "r"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
288 while (read_line(fe, &line) > 0) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 char *tmp = strchr(line, ':'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
291 if (tmp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 *tmp = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 char *name = basename(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
295 tmp = strchr(name, '.'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 if (tmp) *tmp = '\0'; |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
297 if (!cmdname || !fnmatch(cmdname, name, 0)) { |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 if (tmp) *tmp = '.'; |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
299 TT.dbg("%s\n", line); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 ret = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
301 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
302 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 return ret; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 // Finds dependencies for modules from the modules.dep file. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 static void find_dep(void) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 char *line = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 struct module_s *mod; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
313 FILE *fe = xfopen("modules.dep", "r"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
314 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
315 for (; read_line(fe, &line) > 0; free(line)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 char *tmp = strchr(line, ':'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 if (tmp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 *tmp = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 mod = get_mod(line, 0); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 if (!mod) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 if ((mod->flags & MOD_ALOADED) && |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 !(toys.optflags & (FLAG_r | FLAG_D))) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 mod->flags |= MOD_FNDDEPMOD; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 if ((mod->flags & MOD_NDDEPS) && (!mod->dep)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 TT.nudeps--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 llist_add(&mod->dep, xstrdup(line)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 tmp++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 if (*tmp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 char *tok; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 while ((tok = strsep(&tmp, " \t"))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 if (!*tok) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 llist_add_tail(&mod->dep, xstrdup(tok)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
337 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
339 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
340 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 fclose(fe); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
344 // Remove a module from the Linux Kernel. if !modules does auto remove. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
345 static int rm_mod(char *modules, uint32_t flags) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 if (modules) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 int len = strlen(modules); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
350 if (len > 3 && !strcmp(modules+len-3, ".ko" )) modules[len-3] = 0; |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 } |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
352 |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
353 errno = 0; |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
354 syscall(__NR_delete_module, modules, flags ? flags : O_NONBLOCK|O_EXCL); |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
355 |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 return errno; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 // Insert module same as insmod implementation. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 static int ins_mod(char *modules, char *flags) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 char *buf = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 int len, res; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 int fd = xopen(modules, O_RDONLY); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 len = fdlength(fd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 buf = xmalloc(len); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 xreadall(fd, buf, len); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 xclose(fd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 while (flags && strlen(toybuf) + strlen(flags) + 2 < sizeof(toybuf)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 strcat(toybuf, flags); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 strcat(toybuf, " "); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 res = syscall(__NR_init_module, buf, len, toybuf); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
376 if (CFG_TOYBOX_FREE && buf != toybuf) free(buf); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 if (res) perror_exit("failed to load %s ", toys.optargs[0]); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 return res; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
381 // Add module in probes list, if not loaded. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 static void add_mod(char *name) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
383 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 struct module_s *mod = get_mod(name, 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 if (!(toys.optflags & (FLAG_r | FLAG_D)) && (mod->flags & MOD_ALOADED)) { |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
387 TT.dbg("skipping %s, it is already loaded\n", name); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
389 } |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
390 TT.dbg("queuing %s\n", name); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
391 mod->cmdname = name; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
392 mod->flags |= MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 llist_add_tail(&TT.probes, mod); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 TT.nudeps++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 if (!strncmp(mod->name, "symbol:", 7)) TT.symreq = 1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
398 // Parse cmdline options suplied for module. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
399 static char *add_cmdopt(char **argv) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
401 char *opt = xzalloc(1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
402 int lopt = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
403 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
404 while (*++argv) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 char *fmt, *var, *val; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
406 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
407 var = *argv; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 opt = xrealloc(opt, lopt + 2 + strlen(var) + 2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 // check for key=val or key = val. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
410 fmt = "%.*s%s "; |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
411 for (val = var; *val && *val != '='; val++); |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
412 if (*val && strchr(++val, ' ')) fmt = "%.*s\"%s\" "; |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
413 lopt += sprintf(opt + lopt, fmt, (int) (val - var), var, val); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
414 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
415 return opt; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
416 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
417 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
418 // Probes a single module and loads all its dependencies. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
419 static int go_probe(struct module_s *m) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
420 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
421 int rc = 0, first = 1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
423 if (!(m->flags & MOD_FNDDEPMOD)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
424 if (!(toys.optflags & FLAG_s)) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
425 error_msg("module %s not found in modules.dep", m->name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
426 return -ENOENT; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
427 } |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
428 TT.dbg("go_prob'ing %s\n", m->name); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 if (!(toys.optflags & FLAG_r)) m->dep = llist_rev(m->dep); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
430 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
431 while (m->dep) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 struct module_s *m2; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
433 char *fn, *options; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
434 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
435 rc = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
436 fn = llist_popme(&m->dep); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
437 m2 = get_mod(fn, 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 // are we removing ? |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
439 if (toys.optflags & FLAG_r) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
440 if (m2->flags & MOD_ALOADED) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
441 if ((rc = rm_mod(m2->name, O_EXCL))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 if (first) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
443 perror_msg("can't unload module %s", m2->name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
444 break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
445 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
446 } else m2->flags &= ~MOD_ALOADED; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
447 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
448 first = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
449 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
450 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
451 options = m2->opts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
452 m2->opts = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
453 if (m == m2) options = add_opts(options, TT.cmdopts); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
454 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
455 // are we only checking dependencies ? |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
456 if (toys.optflags & FLAG_D) { |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
457 TT.dbg(options ? "insmod %s %s\n" : "insmod %s\n", fn, options); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
458 if (options) free(options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
459 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
460 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
461 if (m2->flags & MOD_ALOADED) { |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
462 TT.dbg("%s is already loaded, skipping\n", fn); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
463 if (options) free(options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
464 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
465 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
466 // none of above is true insert the module. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
467 rc = ins_mod(fn, options); |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
468 TT.dbg("loaded %s '%s', rc:%d\n", fn, options, rc); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
469 if (rc == EEXIST) rc = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
470 if (options) free(options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
471 if (rc) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
472 perror_msg("can't load module %s (%s)", m2->name, fn); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
473 break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
474 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
475 m2->flags |= MOD_ALOADED; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
476 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
477 return rc; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
478 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
479 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
480 void modprobe_main(void) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
481 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
482 struct utsname uts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
483 char **argv = toys.optargs, *procline = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
484 FILE *fs; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
485 struct module_s *module; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
486 unsigned flags = toys.optflags; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
487 |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
488 TT.dbg = (flags & FLAG_v) ? xprintf : dummy; |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
489 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
490 if ((toys.optc < 1) && (((flags & FLAG_r) && (flags & FLAG_l)) |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
491 ||(!((flags & FLAG_r)||(flags & FLAG_l))))) |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
492 { |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
493 toys.exithelp++; |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
494 error_exit("bad syntax"); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
495 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
496 // Check for -r flag without arg if yes then do auto remove. |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
497 if ((flags & FLAG_r) && !toys.optc) { |
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
498 if (rm_mod(NULL, O_NONBLOCK | O_EXCL)) perror_exit("rmmod"); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
499 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
500 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
501 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
502 // change directory to /lib/modules/<release>/ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
503 xchdir("/lib/modules"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
504 uname(&uts); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
505 xchdir(uts.release); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
506 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
507 // modules.dep processing for dependency check. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
508 if (flags & FLAG_l) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
509 if (depmode_read_entry(toys.optargs[0])) error_exit("no module found."); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
510 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
511 } |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
512 // Read /proc/modules to get loaded modules. |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
513 fs = xfopen("/proc/modules", "r"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
514 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
515 while (read_line(fs, &procline) > 0) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
516 *(strchr(procline, ' ')) = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
517 get_mod(procline, 1)->flags = MOD_ALOADED; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
518 free(procline); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
519 procline = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
520 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
521 fclose(fs); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
522 if ((flags & FLAG_a) || (flags & FLAG_r)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
523 do { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
524 add_mod(*argv++); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
525 } while (*argv); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
526 } else { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
527 add_mod(argv[0]); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
528 TT.cmdopts = add_cmdopt(argv); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
529 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
530 if (!TT.probes) { |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
531 TT.dbg("All modules loaded\n"); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
532 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
533 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
534 dirtree_read("/etc/modprobe.conf", config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
535 dirtree_read("/etc/modprobe.d", config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
536 if (TT.symreq) dirtree_read("modules.symbols", config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
537 if (TT.nudeps) dirtree_read("modules.alias", config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
538 find_dep(); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
539 while ((module = llist_popme(&TT.probes))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
540 if (!module->rnames) { |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
541 TT.dbg("probing by module name\n"); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
542 /* This is not an alias. Literal names are blacklisted |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
543 * only if '-b' is given. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
544 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
545 if (!(flags & FLAG_b) || !(module->flags & MOD_BLACKLIST)) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
546 go_probe(module); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
547 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
548 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
549 do { // Probe all real names for the alias. |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
550 char *real = ((struct arg_list*)llist_pop(&module->rnames))->arg; |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
551 struct module_s *m2 = get_mod(real, 0); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
552 |
1384
4a7438307429
minor cleanup: move a global variable into GLOBALS(), inline strchr_null(), some whitespace and bracket cleanups.
Rob Landley <rob@landley.net>
parents:
1249
diff
changeset
|
553 TT.dbg("probing alias %s by realname %s\n", module->name, real); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
554 if (!m2) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
555 if (!(m2->flags & MOD_BLACKLIST) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
556 && (!(m2->flags & MOD_ALOADED) || (flags & (FLAG_r | FLAG_D)))) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
557 go_probe(m2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
558 free(real); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
559 } while (module->rnames); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
560 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
561 } |