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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }