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);
int
main ()
{
+ mount_proc ();
+
print_uptime ();
fprintf (stderr, "febootstrap: ext2 mini initrd starting up\n");
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)
}
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)) {