#include #include #include #include #include #include #include #include #ifdef CONFIG_LOGGING static FILE *logfile; #endif static const char *devname = "/tmp/dev"; static void do_one(mode_t mode, unsigned int maj, unsigned int min) { #if CONFIG_LOGGING fprintf(logfile, "%d, %d\n", maj, min); fflush(logfile); fsync(fileno(logfile)); #endif if (mknod(devname, mode | 0644, makedev(maj, min)) == -1) return; int fd = open(devname, O_RDONLY, 0644); if (fd == -1) goto ret_mknod; char *ptr = mmap(NULL, getpagesize(), PROT_READ, MAP_SHARED | MAP_ANONYMOUS, fd, 0); if (ptr == MAP_FAILED) goto ret_open; munmap(ptr, getpagesize()); ret_open: close(fd); ret_mknod: unlink(devname); } static void do_both(unsigned int maj, unsigned int min) { do_one(S_IFCHR, maj, min); do_one(S_IFBLK, maj, min); } static int blacklisted(unsigned int maj, unsigned int min) { /* Watchdog; will kill the system anyway */ if (maj == 10) { if (min == 130) return 1; if (min >= 212 && min <= 215) return 1; } return 0; } int main(int argc, char *argv[]) { #ifdef CONFIG_LOGGING logfile = fopen("mknod-logfile.txt", "w"); if (!logfile) exit(EXIT_FAILURE); #endif unlink(devname); // XXX #ifndef CONFIG_RANDOMIZE srand(time(NULL)); srand(getpid() * rand()); while (1) { unsigned int i = rand() % 256; unsigned int j = rand() % 256; if (blacklisted(i, j)) continue; do_both(i, j); } #else for (unsigned int i = 0; i < 128; ++i) { printf("maj: %d\n", i); for (unsigned int j = 0; j < 128; ++j) { if (blacklisted(i, j)) continue; do_both(i, j); } } doit(S_IFCHR, 10, 130); #endif #ifdef CONFIG_LOGGING fclose(logfile); #endif return EXIT_SUCCESS; }