Mercurial > hg > toybox
annotate toys/pending/modprobe.c @ 1245:7b3c1238380a draft
Modprobe from Madhur Verma and Kyungwan Han.
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 09 Apr 2014 07:55:08 -0500 |
parents | |
children | b13728c24a58 |
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 #include <fnmatch.h> |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 GLOBALS( |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 struct arg_list *probes; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 struct arg_list *dbase[256]; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 char *cmdopts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 int nudeps; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 uint8_t symreq; |
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 static void (*dbg)(char *format, ...); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 // dummy interface for debugging. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 static void dummy(char *format, ...) |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 // Current probing modules info |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 struct module_s { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 uint32_t flags; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 char *cmdname, *name, *depent, *opts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 struct arg_list *rnames, *dep; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 // Converts path name FILE to module name. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 static char *path2mod(char *file, char *mod) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 int i; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 char *from, *lslash; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 if (!file) return NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 if (!mod) mod = xmalloc(MODNAME_LEN); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 lslash = strrchr(file, '/'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 if (!lslash || (lslash == file && !lslash[1])) from = file; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 else from = lslash + 1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 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
|
79 mod[i] = (from[i] == '-') ? '_' : from[i]; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 mod[i] = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 return mod; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 // locate character in string. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 static char *strchr_nul(char *s, int c) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 while(*s != '\0' && *s != c) s++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 return (char*)s; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 // Add options in opts from toadd. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 static char *add_opts(char *opts, char *toadd) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 if (toadd) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 int optlen = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 if (opts) optlen = strlen(opts); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 opts = xrealloc(opts, optlen + strlen(toadd) + 2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 sprintf(opts + optlen, " %s", toadd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 return opts; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 // 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
|
105 static void *llist_popme(struct arg_list **head) |
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 char *data = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 struct arg_list *temp = *head; |
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 if (temp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 data = temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 *head = temp->next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 free(temp); |
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 return data; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 // 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
|
119 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
|
120 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 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
|
122 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 new->arg = (char*)data; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 new->next = *old; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 *old = new; |
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 // Add new node at tail of list. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 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
|
130 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 while (*head) head = &(*head)->next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 *head = xzalloc(sizeof(struct arg_list)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 (*head)->arg = (char*)data; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 // Reverse list order. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 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
|
138 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 struct arg_list *rev = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 while (list) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 struct arg_list *next = list->next; |
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 list->next = rev; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 rev = list; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 list = next; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 return rev; |
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 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 * Returns struct module_s from the data base if found, NULL otherwise. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 * if ps - create module entry, add it to data base and return the same mod. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 static struct module_s *get_mod(char *mod, uint8_t ps) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 char name[MODNAME_LEN]; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 struct module_s *modentry; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 struct arg_list *temp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 unsigned i, hash = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 path2mod(mod, name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 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
|
164 hash %= DBASE_SIZE; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 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
|
166 modentry = (struct module_s *) temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 if (!strcmp(modentry->name, name)) return modentry; |
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 if (!ps) return NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 modentry = xzalloc(sizeof(*modentry)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 modentry->name = xstrdup(name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 llist_add(&TT.dbase[hash], modentry); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 return modentry; |
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 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 * 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
|
178 * Return the line in allocated string (*li) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 static int read_line(FILE *fl, char **li) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 char *nxtline = NULL, *line; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 int len, nxtlen, linelen, nxtlinelen; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 while (1) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 line = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 linelen = nxtlinelen = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 len = getline(&line, (size_t*)&linelen, fl); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 if (len <= 0) return len; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 // checking for commented lines. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 if (line[0] != '#') break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 for (;;) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 if (line[len - 1] == '\n') len--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 // checking line continuation. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 if (!len || line[len - 1] != '\\') break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 len--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 nxtlen = getline(&nxtline, (size_t*)&nxtlinelen, fl); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 if (nxtlen <= 0) break; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 if (linelen < len + nxtlen + 1) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 linelen = len + nxtlen + 1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 line = xrealloc(line, linelen); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 memcpy(&line[len], nxtline, nxtlen); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 len += nxtlen; |
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 line[len] = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 *li = xstrdup(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 if (line) free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 if (nxtline) free(nxtline); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 return len; |
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 /* |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 * 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
|
217 * checks for aliases, options, install, remove and blacklist |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 static int config_action(struct dirtree *node) |
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 FILE *fc; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 char *filename, *tokens[3], *line, *linecp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 struct module_s *modent; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 int tcount = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 if (!dirtree_notdotdot(node)) return 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 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
|
228 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 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
|
230 filename = dirtree_path(node, NULL); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 if (!(fc = fopen(filename, "r"))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 free(filename); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 return 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 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
|
236 free(line), free(linecp), line = linecp = NULL) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 char *tk = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 if (!strlen(line)) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 linecp = xstrdup(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 for (tk = strtok(linecp, "# \t"), tcount = 0; tk; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 tk = strtok(NULL, "# \t"), tcount++) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 tokens[tcount] = tk; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 if (tcount == 2) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 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
|
246 break; |
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 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 if (!tk) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 // 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
|
251 if (!strcmp(tokens[0], "alias")) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 struct arg_list *temp; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 char aliase[MODNAME_LEN], *realname; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 if (!tokens[2]) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 path2mod(tokens[1], aliase); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 for (temp = TT.probes; temp; temp = temp->next) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 modent = (struct module_s *) temp->arg; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 if (fnmatch(aliase, modent->name, 0)) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 realname = path2mod(tokens[2], NULL); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 llist_add(&modent->rnames, realname); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 if (modent->flags & MOD_NDDEPS) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 modent->flags &= ~MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 TT.nudeps--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 modent = get_mod(realname, 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 if (!(modent->flags & MOD_NDDEPS)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 modent->flags |= MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 TT.nudeps++; |
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 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 } else if (!strcmp(tokens[0], "options")) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 if (!tokens[2]) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 modent = get_mod(tokens[1], 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 modent->opts = add_opts(modent->opts, tokens[2]); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 } else if (!strcmp(tokens[0], "include")) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 dirtree_read(tokens[1], config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 else if (!strcmp(tokens[0], "blacklist")) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 get_mod(tokens[1], 1)->flags |= MOD_BLACKLIST; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 else if (!strcmp(tokens[0], "install")) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 else if (!strcmp(tokens[0], "remove")) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
282 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
|
283 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 fclose(fc); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 free(filename); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 return 0; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 // Show matched modules else return -1 on failure. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 static int depmode_read_entry(char *cmdname) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
291 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 char *line; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 int ret = -1; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 FILE *fe = xfopen("modules.dep", "r"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
295 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 while (read_line(fe, &line) > 0) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 char *tmp = strchr(line, ':'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 if (tmp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 *tmp = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
301 char *name = basename(line); |
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 tmp = strchr(name, '.'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 if (tmp) *tmp = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 if (!cmdname) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 if (tmp) *tmp = '.'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 xprintf("%s\n", line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 ret = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 } else if (!fnmatch(cmdname, name, 0)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 if (tmp) *tmp = '.'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 xprintf("%s\n", line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 ret = 0; |
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 free(line); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 return ret; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 // 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
|
321 static void find_dep(void) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 char *line = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 struct module_s *mod; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 FILE *fe = xfopen("modules.dep", "r"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 for (; read_line(fe, &line) > 0; free(line)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 char *tmp = strchr(line, ':'); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 |
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 *tmp = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 mod = get_mod(line, 0); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 if (!mod) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 if ((mod->flags & MOD_ALOADED) && |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 !(toys.optflags & (FLAG_r | FLAG_D))) continue; |
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 mod->flags |= MOD_FNDDEPMOD; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 if ((mod->flags & MOD_NDDEPS) && (!mod->dep)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
339 TT.nudeps--; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
340 llist_add(&mod->dep, xstrdup(line)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 tmp++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 if (*tmp) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 char *tok; |
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 while ((tok = strsep(&tmp, " \t"))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 if (!*tok) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 llist_add_tail(&mod->dep, xstrdup(tok)); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 } |
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 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
352 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
353 fclose(fe); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
355 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 // 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
|
357 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
|
358 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 errno = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 if (modules) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 int len = strlen(modules); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 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
|
364 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 if (!flags) flags = O_NONBLOCK|O_EXCL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 syscall(__NR_delete_module, modules, flags); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 return errno; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 // Insert module same as insmod implementation. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 static int ins_mod(char *modules, char *flags) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 char *buf = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 int len, res; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 int fd = xopen(modules, O_RDONLY); |
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 len = fdlength(fd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 buf = xmalloc(len); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 xreadall(fd, buf, len); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 xclose(fd); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
381 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 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
|
383 strcat(toybuf, flags); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 strcat(toybuf, " "); |
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 res = syscall(__NR_init_module, buf, len, toybuf); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
387 if (CFG_TOYBOX_FREE && buf != toybuf) free(buf); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 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
|
389 return res; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 } |
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 // Add module in probes list, if not loaded. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 static void add_mod(char *name) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 struct module_s *mod = get_mod(name, 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 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
|
398 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
|
399 return; |
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 dbg("queuing %s\n", name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
402 mod->cmdname = name; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
403 mod->flags |= MOD_NDDEPS; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
404 llist_add_tail(&TT.probes, mod); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 TT.nudeps++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
406 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
|
407 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 // Parse cmdline options suplied for module. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
410 static char *add_cmdopt(char **argv) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
411 { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
412 char *opt = xzalloc(1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
413 int lopt = 0; |
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 while (*++argv) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
416 char *fmt, *var, *val; |
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 var = *argv; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
419 opt = xrealloc(opt, lopt + 2 + strlen(var) + 2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
420 // check for key=val or key = val. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
421 fmt = "%.*s%s "; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 val = strchr_nul(var, '='); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
423 if (*val) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
424 val++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
425 if (strchr(val, ' ')) fmt = "%.*s\"%s\" "; |
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 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
|
428 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 return opt; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 // 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
|
433 static int go_probe(struct module_s *m) |
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 int rc = 0, first = 1; |
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 if (!(m->flags & MOD_FNDDEPMOD)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 if (!(toys.optflags & FLAG_s)) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
439 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
|
440 return -ENOENT; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
441 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 dbg("go_prob'ing %s\n", m->name); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
443 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
|
444 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
445 while (m->dep) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
446 struct module_s *m2; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
447 char *fn, *options; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
448 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
449 rc = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
450 fn = llist_popme(&m->dep); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
451 m2 = get_mod(fn, 1); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
452 // are we removing ? |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
453 if (toys.optflags & FLAG_r) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
454 if (m2->flags & MOD_ALOADED) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
455 if ((rc = rm_mod(m2->name, O_EXCL))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
456 if (first) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
457 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
|
458 break; |
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 } else m2->flags &= ~MOD_ALOADED; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
461 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
462 first = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
463 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
464 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
465 options = m2->opts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
466 m2->opts = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
467 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
|
468 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
469 // are we only checking dependencies ? |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
470 if (toys.optflags & FLAG_D) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
471 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
|
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 if (m2->flags & MOD_ALOADED) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
476 dbg("%s is already loaded, skipping\n", fn); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
477 if (options) free(options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
478 continue; |
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 // none of above is true insert the module. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
481 rc = ins_mod(fn, options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
482 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
|
483 if (rc == EEXIST) rc = 0; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
484 if (options) free(options); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
485 if (rc) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
486 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
|
487 break; |
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 m2->flags |= MOD_ALOADED; |
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 return rc; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
492 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
493 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
494 void modprobe_main(void) |
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 struct utsname uts; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
497 char **argv = toys.optargs, *procline = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
498 FILE *fs; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
499 struct module_s *module; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
500 unsigned flags = toys.optflags; |
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 dbg = dummy; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
503 if (flags & FLAG_v) dbg = xprintf; |
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 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
|
506 ||(!((flags & FLAG_r)||(flags & FLAG_l))))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
507 toys.exithelp++; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
508 error_exit(" Syntex Error."); |
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 // 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
|
511 if ((flags & FLAG_r) && (!toys.optc)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
512 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
|
513 return; |
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 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
516 // change directory to /lib/modules/<release>/ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
517 xchdir("/lib/modules"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
518 uname(&uts); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
519 xchdir(uts.release); |
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 // modules.dep processing for dependency check. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
522 if (flags & FLAG_l) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
523 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
|
524 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
525 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
526 // Read /proc/modules to get loadded modules. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
527 fs = xfopen("/proc/modules", "r"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
528 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
529 while (read_line(fs, &procline) > 0) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
530 *(strchr(procline, ' ')) = '\0'; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
531 get_mod(procline, 1)->flags = MOD_ALOADED; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
532 free(procline); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
533 procline = NULL; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
534 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
535 fclose(fs); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
536 if ((flags & FLAG_a) || (flags & FLAG_r)) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
537 do { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
538 add_mod(*argv++); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
539 } while (*argv); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
540 } else { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
541 add_mod(argv[0]); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
542 TT.cmdopts = add_cmdopt(argv); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
543 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
544 if (!TT.probes) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
545 fprintf(stderr, "All modules loaded successfully. \n"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
546 return; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
547 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
548 dirtree_read("/etc/modprobe.conf", config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
549 dirtree_read("/etc/modprobe.d", config_action); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
550 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
|
551 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
|
552 find_dep(); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
553 while ((module = llist_popme(&TT.probes))) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
554 if (!module->rnames) { |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
555 dbg("probing by module name\n"); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
556 /* 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
|
557 * only if '-b' is given. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
558 */ |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
559 if (!(flags & FLAG_b) || !(module->flags & MOD_BLACKLIST)) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
560 go_probe(module); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
561 continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
562 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
563 do { // Probe all real names for the alias. |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
564 char *real = llist_pop(&module->rnames); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
565 struct module_s *m2 = get_mod(real, 0); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
566 |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
567 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
|
568 if (!m2) continue; |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
569 if (!(m2->flags & MOD_BLACKLIST) |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
570 && (!(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
|
571 go_probe(m2); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
572 free(real); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
573 } while (module->rnames); |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
574 } |
7b3c1238380a
Modprobe from Madhur Verma and Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
575 } |