1 /* Try to reproduce RHBZ#1184405.
2 * Note: needs to be linked statically.
3 * By Richard W.M. Jones <rjones@redhat.com>
11 #include <sys/types.h>
12 #include <sys/ioctl.h>
17 extern long init_module (void *, unsigned long, const char *);
19 /* NB! Must match the number of disks in Makefile. */
20 #define NR_SCSI_DISKS 6
22 /* NB! Must match the module list in Makefile. Also they must be
23 * in module dependency order.
25 static const char *modules[] = {
33 static void load_modules (void);
34 static void make_devices (void);
35 static void run_test (const char *dev);
38 main (int argc, char *argv[])
41 char dev[] = "/dev/sda";
42 int child_pids[NR_SCSI_DISKS-1];
44 printf ("init: started\n");
47 /* Really we should wait for the kernel to probe devices, but bleah. */
52 for (i = 0; i < NR_SCSI_DISKS-1; ++i) {
53 child_pids[i] = fork ();
54 if (child_pids[i] == -1) {
58 if (child_pids[i] == 0) { /* child */
59 dev[7] = 'a' + i + 1; /* /dev/sd[b..] */
65 run_test (dev); /* /dev/sda test in parent */
67 for (i = 0; i < NR_SCSI_DISKS-1; ++i) {
68 waitpid (child_pids[i], NULL, 0);
71 printf ("init: parent process exiting\n");
75 static char buffer[BUFSIZ];
76 #define MIN(a,b) ((a)<(b)?(a):(b))
79 run_test (const char *dev)
85 printf ("init: testing %s\n", dev);
87 for (passno = 0; passno < 5; ++passno) {
88 printf ("init: %s: pass %d\n", dev, passno);
91 fd = open (dev, O_RDONLY);
96 if (ioctl (fd, BLKGETSIZE64, &size) == -1) {
97 perror ("ioctl: BLKGETSIZE64");
102 r = read (fd, buffer, MIN (BUFSIZ, size));
105 _exit (EXIT_FAILURE);
110 if (close (fd) == -1) {
112 _exit (EXIT_FAILURE);
116 printf ("init: test of %s finished successfully\n", dev);
120 /* Originally taken from supermin's init.c */
130 for (i = 0; modules[i] != NULL; ++i) {
131 printf ("init: loading module %s\n", modules[i]);
133 fd = open (modules[i], O_RDONLY);
138 if (fstat (fd, &statbuf) == -1) {
142 char buf[size = statbuf.st_size];
144 r = read (fd, buf, size);
153 if (init_module (buf, statbuf.st_size, "") != 0) {
154 fprintf (stderr, "insmod: ");
161 /* Much less trouble than udev! */
166 char dev[] = "/dev/sda";
168 printf ("init: creating device nodes\n");
170 for (i = 0; i < NR_SCSI_DISKS; ++i) {
172 if (mknod (dev, S_IFBLK, makedev (8, 16*i)) == -1) {