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
));
45 static int modtest_uname(struct utsname
*buf
)
49 strcpy(buf
->sysname
, "Linux");
50 strcpy(buf
->nodename
, "fakenodename");
51 if ((release
= getenv("MODTEST_UNAME")))
52 strcpy(buf
->release
, release
);
54 printf("MODTEST_OVERRIDE_ROOT used but MODTEST_UNAME not set.\n");
57 strcpy(buf
->version
, "Fakeversion");
58 strcpy(buf
->machine
, "fakemachine");
62 static long modtest_create_module(const char *name
, size_t size
)
64 if (getenv("MODTEST_DO_CREATE_MODULE"))
70 static const struct timespec modtest_delay
= {
72 .tv_nsec
= 500 * 1000 * 1000
75 static long modtest_init_module(void *map
, unsigned long size
,
76 const char *optstring
)
79 if (getenv("MODPROBE_WAIT")) {
81 const char *file
= getenv("MODPROBE_WAIT");
83 printf("Looping on %s\n", file
);
85 while ((fd
= open(file
, O_RDONLY
)) < 0)
86 nanosleep(&modtest_delay
, NULL
);
88 printf("Removing %s\n", file
);
91 if (getenv("MODTEST_DUMP_INIT")) {
94 ret
= write(2, map
, size
);
100 printf("INIT_MODULE: %lu %s\n", size
, optstring
);
105 static long modtest_delete_module(const char *modname
, unsigned int flags
)
109 if (getenv("MODPROBE_WAIT")) {
111 const char *file
= getenv("MODPROBE_WAIT");
113 printf("Looping on %s\n", file
);
115 while ((fd
= open(file
, O_RDONLY
)) < 0)
116 nanosleep(&modtest_delay
, NULL
);
118 printf("Removing %s\n", file
);
124 strcat(flagnames
, "EXCL ");
126 strcat(flagnames
, "TRUNC ");
127 if (flags
& O_NONBLOCK
)
128 strcat(flagnames
, "NONBLOCK ");
129 if (flags
& ~(O_EXCL
|O_TRUNC
|O_NONBLOCK
))
130 strcat(flagnames
, "UNKNOWN ");
132 printf("DELETE_MODULE: %s %s\n", modname
, flagnames
);
136 /* Add prefix to absolute paths; relative paths are left unchanged */
137 static const char *modtest_mapname(const char *path
, char *buf
, size_t buflen
)
144 root
= getenv("MODTEST_OVERRIDE_ROOT");
148 snprintf(buf
, buflen
, "%s%s", root
, path
);
152 static void *modtest_fopen(const char *path
, const char *mode
)
154 char path_buf
[PATH_MAX
];
156 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
157 return fopen(path
, mode
);
160 static int modtest_open(const char *path
, int flags
, mode_t mode
)
162 char path_buf
[PATH_MAX
];
164 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
165 return open(path
, flags
, mode
);
168 static int modtest_stat(const char *path
, struct stat
*buf
)
170 char path_buf
[PATH_MAX
];
172 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
173 return stat(path
, buf
);
176 static int modtest_lstat(const char *path
, struct stat
*buf
)
178 char path_buf
[PATH_MAX
];
180 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
181 return lstat(path
, buf
);
184 static DIR *modtest_opendir(const char *path
)
186 char path_buf
[PATH_MAX
];
188 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
189 return opendir(path
);
192 static int modtest_system(const char *string
)
194 if (getenv("MODTEST_DO_SYSTEM"))
195 return system(string
);
196 printf("SYSTEM: %s\n", string
);
200 static int modtest_rename(const char *oldpath
, const char *newpath
)
202 char oldpath_buf
[PATH_MAX
];
203 char newpath_buf
[PATH_MAX
];
205 oldpath
= modtest_mapname(oldpath
, oldpath_buf
, sizeof(oldpath_buf
));
206 newpath
= modtest_mapname(newpath
, newpath_buf
, sizeof(newpath_buf
));
207 return rename(oldpath
, newpath
);
210 static int modtest_readlink(const char *path
, char *buf
, size_t bufsiz
)
212 char path_buf
[PATH_MAX
];
214 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
215 return readlink(path
, buf
, bufsiz
);
218 #ifdef CONFIG_USE_ZLIB
220 static gzFile
*modtest_gzopen(const char *path
, const char *mode
)
221 __attribute__((unused
));
223 static gzFile
*modtest_gzopen(const char *path
, const char *mode
)
225 char path_buf
[PATH_MAX
];
227 path
= modtest_mapname(path
, path_buf
, sizeof(path_buf
));
228 return gzopen(path
, mode
);
232 /* create_module call */
234 #define create_module modtest_create_module
236 #define uname modtest_uname
237 #define delete_module modtest_delete_module
238 #define init_module modtest_init_module
239 #define open modtest_open
240 #define fopen modtest_fopen
241 #define stat(name, ptr) modtest_stat(name, ptr)
242 #define lstat(name, ptr) modtest_lstat(name, ptr)
243 #define opendir modtest_opendir
244 #define system modtest_system
245 #define rename modtest_rename
246 #define readlink modtest_readlink
247 #define gzopen modtest_gzopen
249 #endif /* JUST_TESTING */
250 #endif /* _TESTING_H */