Update copyright notices in manual pages.
[febootstrap.git] / helper / init.c
index 8690f22..34a8450 100644 (file)
 
 extern long init_module (void *, unsigned long, const char *);
 
+/* translation taken from module-init-tools/insmod.c  */
+static const char *moderror(int err)
+{
+  switch (err) {
+  case ENOEXEC:
+    return "Invalid module format";
+  case ENOENT:
+    return "Unknown symbol in module";
+  case ESRCH:
+    return "Module has wrong symbol version";
+  case EINVAL:
+    return "Invalid parameters";
+  default:
+    return strerror(err);
+  }
+}
+
 /* Leave this enabled for now.  When we get more confident in the boot
  * process we can turn this off or make it configurable.
  */
 #define verbose 1
 
+static void mount_proc (void);
 static void print_uptime (void);
 static void insmod (const char *filename);
 static void show_directory (const char *dir);
@@ -54,6 +72,8 @@ static char line[1024];
 int
 main ()
 {
+  mount_proc ();
+
   print_uptime ();
   fprintf (stderr, "febootstrap: ext2 mini initrd starting up\n");
 
@@ -207,13 +227,30 @@ insmod (const char *filename)
   close (fd);
 
   if (init_module (buf, st.st_size, "") != 0) {
-    fprintf (stderr, "insmod: init_module: %s: %m\n", filename);
+    fprintf (stderr, "insmod: init_module: %s: %s\n", filename, moderror (errno));
     /* However ignore the error because this can just happen because
      * of a missing device.
      */
   }
 }
 
+/* Mount /proc unless it's mounted already. */
+static void
+mount_proc (void)
+{
+  if (access ("/proc/uptime", R_OK) == -1) {
+    mkdir ("/proc", 0755);
+
+    if (verbose)
+      fprintf (stderr, "febootstrap: mounting /proc\n");
+
+    if (mount ("proc", "/proc", "proc", 0, "") == -1) {
+      perror ("mount: /proc");
+      /* Non-fatal. */
+    }
+  }
+}
+
 /* Print contents of /proc/uptime. */
 static void
 print_uptime (void)
@@ -271,9 +308,9 @@ show_directory (const char *dirname)
   }
 
   while ((d = readdir (dir)) != NULL) {
-    fprintf (stderr, "%5d %c %-16s", d->d_ino, dirtype (d->d_type), d->d_name);
+    fprintf (stderr, "%5lu %c %-16s", d->d_ino, dirtype (d->d_type), d->d_name);
     if (lstat (d->d_name, &statbuf) >= 0) {
-      fprintf (stderr, " %06o %d %d:%d",
+      fprintf (stderr, " %06o %ld %d:%d",
                statbuf.st_mode, statbuf.st_size,
                statbuf.st_uid, statbuf.st_gid);
       if (S_ISLNK (statbuf.st_mode)) {