13 #include <sys/utsname.h>
14 #include <asm/unistd.h>
15 #include <sys/types.h>
21 /* We don't use all of these. */
22 static int modtest_uname(struct utsname
*buf
) __attribute__((unused
));
23 static long modtest_create_module(const char *name
, size_t size
)
24 __attribute__((unused
));
25 static void *modtest_fopen(const char *path
, const char *mode
)
26 __attribute__((unused
));
27 static int modtest_open(const char *path
, int flags
, mode_t mode
)
28 __attribute__((unused
));
29 static int modtest_stat(const char *file_name
, struct stat
*buf
)
30 __attribute__((unused
));
31 static int modtest_lstat(const char *file_name
, struct stat
*buf
)
32 __attribute__((unused
));
33 static DIR *modtest_opendir(const char *name
) __attribute__((unused
));
34 static int modtest_system(const char *string
) __attribute__((unused
));
35 static int modtest_rename(const char *oldpath
, const char *newpath
)
36 __attribute__((unused
));
37 static long modtest_init_module(void *map
, unsigned long size
,
38 const char *optstring
) __attribute__((unused
));
39 static long modtest_delete_module(const char *modname
, unsigned int flags
)
40 __attribute__((unused
));
42 static int modtest_readlink(const char *path
, char *buf
, size_t bufsiz
)
43 __attribute__((unused
));
44 static int modtest_unlink(const char *path
)
45 __attribute__((unused
));
47 static int modtest_uname(struct utsname
*buf
)
51 strcpy(buf
->sysname
, "Linux");
52 strcpy(buf
->nodename
, "fakenodename");
53 if ((release
= getenv("MODTEST_UNAME")))
54 strcpy(buf
->release
, release
);
56 printf("MODTEST_OVERRIDE_ROOT used but MODTEST_UNAME not set.\n");
59 strcpy(buf
->version
, "Fakeversion");
60 strcpy(buf
->machine
, "fakemachine");
64 static long modtest_create_module(const char *name
, size_t size
)
66 if (getenv("MODTEST_DO_CREATE_MODULE"))
72 static const struct timespec modtest_delay
= {
74 .tv_nsec
= 500 * 1000 * 1000
77 static long modtest_init_module(void *map
, unsigned long size
,
78 const char *optstring
)
81 if (getenv("MODPROBE_WAIT")) {
83 const char *file
= getenv("MODPROBE_WAIT");
85 printf("Looping on %s\n", file
);
87 while ((fd
= open(file
, O_RDONLY
)) < 0)
88 nanosleep(&modtest_delay
, NULL
);
90 printf("Removing %s\n", file
);
93 if (getenv("MODTEST_DUMP_INIT")) {
96 ret
= write(2, map
, size
);
102 printf("INIT_MODULE: %lu %s\n", size
, optstring
);
107 static long modtest_delete_module(const char *modname
, unsigned int flags
)
111 if (getenv("MODPROBE_WAIT")) {
113 const char *file
= getenv("MODPROBE_WAIT");
115 printf("Looping on %s\n", file
);
117 while ((fd
= open(file
, O_RDONLY
)) < 0)
118 nanosleep(&modtest_delay
, NULL
);
120 printf("Removing %s\n", file
);
126 strcat(flagnames
, "EXCL ");
128 strcat(flagnames
, "TRUNC ");
129 if (flags
& O_NONBLOCK
)
130 strcat(flagnames
, "NONBLOCK ");
131 if (flags
& ~(O_EXCL
|O_TRUNC
|O_NONBLOCK
))
132 strcat(flagnames
, "UNKNOWN ");
134 printf("DELETE_MODULE: %s %s\n", modname
, flagnames
);
138 /* Add prefix to absolute paths; relative paths are left unchanged */
139 static const char *modtest_mapname(const char *path
, char *buf
, size_t buflen
)
146 root
= getenv("MODTEST_OVERRIDE_ROOT");
150 snprintf(buf
, buflen
, "%s%s", root
, path
);
154 static void *modtest_fopen(const char *path
, const char *mode
)
156 char path_buf
[PATH_MAX
];
158 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
159 return fopen(path
, mode
);
162 static int modtest_open(const char *path
, int flags
, mode_t mode
)
164 char path_buf
[PATH_MAX
];
166 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
167 return open(path
, flags
, mode
);
170 static int modtest_stat(const char *path
, struct stat
*buf
)
172 char path_buf
[PATH_MAX
];
174 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
175 return stat(path
, buf
);
178 static int modtest_lstat(const char *path
, struct stat
*buf
)
180 char path_buf
[PATH_MAX
];
182 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
183 return lstat(path
, buf
);
186 static DIR *modtest_opendir(const char *path
)
188 char path_buf
[PATH_MAX
];
190 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
191 return opendir(path
);
194 static int modtest_system(const char *string
)
196 if (getenv("MODTEST_DO_SYSTEM"))
197 return system(string
);
198 printf("SYSTEM: %s\n", string
);
202 static int modtest_rename(const char *oldpath
, const char *newpath
)
204 char oldpath_buf
[PATH_MAX
];
205 char newpath_buf
[PATH_MAX
];
207 oldpath
= modtest_mapname(oldpath
, oldpath_buf
, sizeof(oldpath_buf
));
208 newpath
= modtest_mapname(newpath
, newpath_buf
, sizeof(newpath_buf
));
209 return rename(oldpath
, newpath
);
212 static int modtest_readlink(const char *path
, char *buf
, size_t bufsiz
)
214 char path_buf
[PATH_MAX
];
216 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
217 return readlink(path
, buf
, bufsiz
);
220 static int modtest_unlink(const char *path
)
222 char path_buf
[PATH_MAX
];
224 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
228 #ifdef CONFIG_USE_ZLIB
230 static gzFile
*modtest_gzopen(const char *path
, const char *mode
)
231 __attribute__((unused
));
233 static gzFile
*modtest_gzopen(const char *path
, const char *mode
)
235 char path_buf
[PATH_MAX
];
237 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
238 return gzopen(path
, mode
);
242 /* create_module call */
244 #define create_module modtest_create_module
246 #define uname modtest_uname
247 #define delete_module modtest_delete_module
248 #define init_module modtest_init_module
249 #define open modtest_open
250 #define fopen modtest_fopen
251 #define stat(name, ptr) modtest_stat(name, ptr)
252 #define lstat(name, ptr) modtest_lstat(name, ptr)
253 #define opendir modtest_opendir
254 #define system modtest_system
255 #define rename modtest_rename
256 #define readlink modtest_readlink
257 #define unlink modtest_unlink
258 #define gzopen modtest_gzopen
260 #endif /* JUST_TESTING */
261 #endif /* _TESTING_H */