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);
88 fd = open (dev, O_RDONLY);
93 if (ioctl (fd, BLKGETSIZE64, &size) == -1) {
94 perror ("ioctl: BLKGETSIZE64");
99 r = read (fd, buffer, MIN (BUFSIZ, size));
102 _exit (EXIT_FAILURE);
107 if (close (fd) == -1) {
109 _exit (EXIT_FAILURE);
112 printf ("init: test of %s finished successfully\n", dev);
116 /* Originally taken from supermin's init.c */
126 for (i = 0; modules[i] != NULL; ++i) {
127 printf ("init: loading module %s\n", modules[i]);
129 fd = open (modules[i], O_RDONLY);
134 if (fstat (fd, &statbuf) == -1) {
138 char buf[size = statbuf.st_size];
140 r = read (fd, buf, size);
149 if (init_module (buf, statbuf.st_size, "") != 0) {
150 fprintf (stderr, "insmod: ");
157 /* Much less trouble than udev! */
162 char dev[] = "/dev/sda";
164 printf ("init: creating device nodes\n");
166 for (i = 0; i < NR_SCSI_DISKS; ++i) {
168 if (mknod (dev, S_IFBLK, makedev (8, 16*i)) == -1) {