Mercurial > hg > toybox
annotate toys/pending/modprobe.c @ 1265:0ecfaa7022e8 draft
usage: is lower case (the help generator looks for that, might as well be consistent).
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 23 Apr 2014 08:37:07 -0500 |
parents | b13728c24a58 |
children | 4a7438307429 |
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; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 ) |
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 /* Note: if "#define DBASE_SIZE" modified, |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 * Please update GLOBALS dbase[256] accordingly. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 #define DBASE_SIZE 256 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 #define MODNAME_LEN 256 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 // Modules flag definations |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 #define MOD_ALOADED 0x0001 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 #define MOD_BLACKLIST 0x0002 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 #define MOD_FNDDEPMOD 0x0004 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 #define MOD_NDDEPS 0x0008 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 static void (*dbg)(char *format, ...); |
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 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 int i; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 char *from, *lslash; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 if (!file) return NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 if (!mod) mod = xmalloc(MODNAME_LEN); |
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++) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 mod[i] = (from[i] == '-') ? '_' : from[i]; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 mod[i] = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 return mod; |
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 // locate character in string. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 static char *strchr_nul(char *s, int c) |
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 while(*s != '\0' && *s != c) s++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 return (char*)s; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 // Add options in opts from toadd. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 static char *add_opts(char *opts, char *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 if (toadd) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 int optlen = 0; |
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 if (opts) optlen = strlen(opts); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 opts = xrealloc(opts, optlen + strlen(toadd) + 2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 sprintf(opts + optlen, " %s", toadd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 return opts; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 // 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
|
104 static void *llist_popme(struct arg_list **head) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 char *data = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 struct arg_list *temp = *head; |
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 if (temp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 data = temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 *head = temp->next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 free(temp); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 return data; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 // 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
|
118 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
|
119 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 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
|
121 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 new->arg = (char*)data; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 new->next = *old; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 *old = new; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 } |
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 // Add new node at tail of list. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 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
|
129 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 while (*head) head = &(*head)->next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 *head = xzalloc(sizeof(struct arg_list)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 (*head)->arg = (char*)data; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 // Reverse list order. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 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
|
137 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 struct arg_list *rev = NULL; |
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 while (list) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 struct arg_list *next = list->next; |
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 list->next = rev; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 rev = list; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 list = next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 return rev; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 * 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
|
152 * 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
|
153 */ |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
154 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
|
155 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 char name[MODNAME_LEN]; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 struct module_s *modentry; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 struct arg_list *temp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 unsigned i, hash = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 path2mod(mod, name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 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
|
163 hash %= DBASE_SIZE; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 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
|
165 modentry = (struct module_s *) temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 if (!strcmp(modentry->name, name)) return modentry; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 } |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
168 if (!add) return NULL; |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 modentry = xzalloc(sizeof(*modentry)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 modentry->name = xstrdup(name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 llist_add(&TT.dbase[hash], modentry); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 return modentry; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 * 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
|
177 * Return the line in allocated string (*li) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 static int read_line(FILE *fl, char **li) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 char *nxtline = NULL, *line; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 int len, nxtlen, linelen, nxtlinelen; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 while (1) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 line = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 linelen = nxtlinelen = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 len = getline(&line, (size_t*)&linelen, fl); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 if (len <= 0) return len; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 // checking for commented lines. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 if (line[0] != '#') break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 for (;;) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 if (line[len - 1] == '\n') len--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 // checking line continuation. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 if (!len || line[len - 1] != '\\') break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 len--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 nxtlen = getline(&nxtline, (size_t*)&nxtlinelen, fl); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 if (nxtlen <= 0) break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 if (linelen < len + nxtlen + 1) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 linelen = len + nxtlen + 1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 line = xrealloc(line, linelen); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 memcpy(&line[len], nxtline, nxtlen); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 len += nxtlen; |
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 line[len] = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 *li = xstrdup(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 if (line) free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 if (nxtline) free(nxtline); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 return len; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 * 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
|
216 * checks for aliases, options, install, remove and blacklist |
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 static int config_action(struct dirtree *node) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 FILE *fc; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 char *filename, *tokens[3], *line, *linecp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 struct module_s *modent; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 int tcount = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 if (!dirtree_notdotdot(node)) return 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 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
|
227 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 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
|
229 filename = dirtree_path(node, NULL); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 if (!(fc = fopen(filename, "r"))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 free(filename); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 return 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 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
|
235 free(line), free(linecp), line = linecp = NULL) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 char *tk = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 if (!strlen(line)) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 linecp = xstrdup(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 for (tk = strtok(linecp, "# \t"), tcount = 0; tk; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 tk = strtok(NULL, "# \t"), tcount++) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 tokens[tcount] = tk; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 if (tcount == 2) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 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
|
245 break; |
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 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 if (!tk) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 // 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
|
250 if (!strcmp(tokens[0], "alias")) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 struct arg_list *temp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 char aliase[MODNAME_LEN], *realname; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 if (!tokens[2]) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 path2mod(tokens[1], aliase); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 for (temp = TT.probes; temp; temp = temp->next) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 modent = (struct module_s *) temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 if (fnmatch(aliase, modent->name, 0)) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 realname = path2mod(tokens[2], NULL); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 llist_add(&modent->rnames, realname); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 if (modent->flags & MOD_NDDEPS) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 modent->flags &= ~MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 TT.nudeps--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 modent = get_mod(realname, 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 if (!(modent->flags & MOD_NDDEPS)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 modent->flags |= MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 TT.nudeps++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 } else if (!strcmp(tokens[0], "options")) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 if (!tokens[2]) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 modent = get_mod(tokens[1], 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 modent->opts = add_opts(modent->opts, tokens[2]); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 } else if (!strcmp(tokens[0], "include")) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 dirtree_read(tokens[1], config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 else if (!strcmp(tokens[0], "blacklist")) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 get_mod(tokens[1], 1)->flags |= MOD_BLACKLIST; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 else if (!strcmp(tokens[0], "install")) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 else if (!strcmp(tokens[0], "remove")) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 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
|
282 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 fclose(fc); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 free(filename); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 return 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 } |
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 // Show matched modules else return -1 on failure. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 static int depmode_read_entry(char *cmdname) |
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 char *line; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 int ret = -1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 FILE *fe = xfopen("modules.dep", "r"); |
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 while (read_line(fe, &line) > 0) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 char *tmp = strchr(line, ':'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 if (tmp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 *tmp = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 char *name = basename(line); |
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 tmp = strchr(name, '.'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 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
|
304 if (!cmdname || !fnmatch(cmdname, name, 0)) { |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 if (tmp) *tmp = '.'; |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
306 dbg("%s\n", line); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 ret = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 return ret; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
313 } |
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 // 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
|
316 static void find_dep(void) |
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 char *line = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 struct module_s *mod; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 FILE *fe = xfopen("modules.dep", "r"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 for (; read_line(fe, &line) > 0; free(line)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 char *tmp = strchr(line, ':'); |
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 if (tmp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 *tmp = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 mod = get_mod(line, 0); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 if (!mod) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 if ((mod->flags & MOD_ALOADED) && |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 !(toys.optflags & (FLAG_r | FLAG_D))) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 mod->flags |= MOD_FNDDEPMOD; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 if ((mod->flags & MOD_NDDEPS) && (!mod->dep)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 TT.nudeps--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 llist_add(&mod->dep, xstrdup(line)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 tmp++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
337 if (*tmp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 char *tok; |
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 while ((tok = strsep(&tmp, " \t"))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 if (!*tok) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 llist_add_tail(&mod->dep, xstrdup(tok)); |
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 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
345 } |
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 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 fclose(fe); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 // 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
|
352 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
|
353 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 errno = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
355 if (modules) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 int len = strlen(modules); |
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 if (len > 3 && !strcmp(&modules[len-3], ".ko" )) modules[len-3] = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 if (!flags) flags = O_NONBLOCK|O_EXCL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 syscall(__NR_delete_module, modules, flags); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 return errno; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 // Insert module same as insmod implementation. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 static int ins_mod(char *modules, char *flags) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 char *buf = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 int len, res; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 int fd = xopen(modules, O_RDONLY); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 len = fdlength(fd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 buf = xmalloc(len); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 xreadall(fd, buf, len); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 xclose(fd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
376 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 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
|
378 strcat(toybuf, flags); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 strcat(toybuf, " "); |
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 res = syscall(__NR_init_module, buf, len, toybuf); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 if (CFG_TOYBOX_FREE && buf != toybuf) free(buf); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
383 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
|
384 return res; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
387 // Add module in probes list, if not loaded. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 static void add_mod(char *name) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
389 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 struct module_s *mod = get_mod(name, 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
391 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
392 if (!(toys.optflags & (FLAG_r | FLAG_D)) && (mod->flags & MOD_ALOADED)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 dbg("skipping %s, it is already loaded\n", name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 dbg("queuing %s\n", name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 mod->cmdname = name; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
398 mod->flags |= MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
399 llist_add_tail(&TT.probes, mod); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 TT.nudeps++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
401 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
|
402 } |
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 // Parse cmdline options suplied for module. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 static char *add_cmdopt(char **argv) |
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 char *opt = xzalloc(1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 int lopt = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
410 while (*++argv) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
411 char *fmt, *var, *val; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
412 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
413 var = *argv; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
414 opt = xrealloc(opt, lopt + 2 + strlen(var) + 2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
415 // check for key=val or key = val. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
416 fmt = "%.*s%s "; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
417 val = strchr_nul(var, '='); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
418 if (*val) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
419 val++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
420 if (strchr(val, ' ')) fmt = "%.*s\"%s\" "; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
421 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 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
|
423 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
424 return opt; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
425 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
426 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
427 // 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
|
428 static int go_probe(struct module_s *m) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
430 int rc = 0, first = 1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
431 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 if (!(m->flags & MOD_FNDDEPMOD)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
433 if (!(toys.optflags & FLAG_s)) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
434 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
|
435 return -ENOENT; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
436 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
437 dbg("go_prob'ing %s\n", m->name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 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
|
439 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
440 while (m->dep) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
441 struct module_s *m2; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 char *fn, *options; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
443 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
444 rc = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
445 fn = llist_popme(&m->dep); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
446 m2 = get_mod(fn, 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
447 // are we removing ? |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
448 if (toys.optflags & FLAG_r) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
449 if (m2->flags & MOD_ALOADED) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
450 if ((rc = rm_mod(m2->name, O_EXCL))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
451 if (first) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
452 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
|
453 break; |
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 } else m2->flags &= ~MOD_ALOADED; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
456 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
457 first = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
458 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
459 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
460 options = m2->opts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
461 m2->opts = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
462 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
|
463 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
464 // are we only checking dependencies ? |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
465 if (toys.optflags & FLAG_D) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
466 dbg(options ? "insmod %s %s\n" : "insmod %s\n", fn, options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
467 if (options) free(options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
468 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
469 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
470 if (m2->flags & MOD_ALOADED) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
471 dbg("%s is already loaded, skipping\n", fn); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
472 if (options) free(options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
473 continue; |
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 // none of above is true insert the module. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
476 rc = ins_mod(fn, options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
477 dbg("loaded %s '%s', rc:%d\n", fn, options, rc); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
478 if (rc == EEXIST) rc = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
479 if (options) free(options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
480 if (rc) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
481 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
|
482 break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
483 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
484 m2->flags |= MOD_ALOADED; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
485 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
486 return rc; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
487 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
488 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
489 void modprobe_main(void) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
490 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
491 struct utsname uts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
492 char **argv = toys.optargs, *procline = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
493 FILE *fs; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
494 struct module_s *module; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
495 unsigned flags = toys.optflags; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
496 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
497 dbg = dummy; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
498 if (flags & FLAG_v) dbg = xprintf; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
499 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
500 if ((toys.optc < 1) && (((flags & FLAG_r) && (flags & FLAG_l)) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
501 ||(!((flags & FLAG_r)||(flags & FLAG_l))))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
502 toys.exithelp++; |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
503 error_exit("bad syntax"); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
504 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
505 // Check for -r flag without arg if yes then do auto remove. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
506 if ((flags & FLAG_r) && (!toys.optc)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
507 if (rm_mod(NULL, O_NONBLOCK | O_EXCL) != 0) perror_exit("rmmod"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
508 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
509 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
510 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
511 // change directory to /lib/modules/<release>/ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
512 xchdir("/lib/modules"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
513 uname(&uts); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
514 xchdir(uts.release); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
515 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
516 // modules.dep processing for dependency check. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
517 if (flags & FLAG_l) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
518 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
|
519 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
520 } |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
521 // Read /proc/modules to get loaded modules. |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
522 fs = xfopen("/proc/modules", "r"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
523 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
524 while (read_line(fs, &procline) > 0) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
525 *(strchr(procline, ' ')) = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
526 get_mod(procline, 1)->flags = MOD_ALOADED; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
527 free(procline); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
528 procline = NULL; |
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 fclose(fs); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
531 if ((flags & FLAG_a) || (flags & FLAG_r)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
532 do { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
533 add_mod(*argv++); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
534 } while (*argv); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
535 } else { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
536 add_mod(argv[0]); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
537 TT.cmdopts = add_cmdopt(argv); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
538 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
539 if (!TT.probes) { |
1249
b13728c24a58
modprobe: cleanup, incorporate Ashwini's fix for alias loading
Isaac Dunham <ibid.ag@gmail.com>
parents:
1245
diff
changeset
|
540 dbg("All modules loaded\n"); |
1245
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
541 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
542 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
543 dirtree_read("/etc/modprobe.conf", config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
544 dirtree_read("/etc/modprobe.d", config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
545 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
|
546 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
|
547 find_dep(); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
548 while ((module = llist_popme(&TT.probes))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
549 if (!module->rnames) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
550 dbg("probing by module name\n"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
551 /* 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
|
552 * only if '-b' is given. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
553 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
554 if (!(flags & FLAG_b) || !(module->flags & MOD_BLACKLIST)) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
555 go_probe(module); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
556 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
557 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
558 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
|
559 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
|
560 struct module_s *m2 = get_mod(real, 0); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
561 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
562 dbg("probing alias %s by realname %s\n", module->name, real); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
563 if (!m2) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
564 if (!(m2->flags & MOD_BLACKLIST) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
565 && (!(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
|
566 go_probe(m2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
567 free(real); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
568 } while (module->rnames); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
569 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
570 } |