summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/stage1.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/stage1.c')
-rw-r--r--mdk-stage1/stage1.c234
1 files changed, 20 insertions, 214 deletions
diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c
index 6024f20ca..41456cc5c 100644
--- a/mdk-stage1/stage1.c
+++ b/mdk-stage1/stage1.c
@@ -34,7 +34,6 @@
#include <stdarg.h>
#include <signal.h>
#include <linux/unistd.h>
-_syscall2(int,pivot_root,const char *,new_root,const char *,put_old)
#include "stage1.h"
@@ -45,11 +44,10 @@ _syscall2(int,pivot_root,const char *,new_root,const char *,put_old)
#include "tools.h"
#include "automatic.h"
#include "mount.h"
-#include "insmod.h"
#include "thirdparty.h"
#ifdef ENABLE_PCMCIA
-#include "pcmcia_/pcmcia.h"
+#include "pcmcia/pcmcia.h"
#endif
#ifndef DISABLE_CDROM
@@ -121,7 +119,7 @@ static pid_t shell_pid = 0;
static void spawn_shell(void)
{
int fd;
- char * shell_name[] = { "/tmp/sh", NULL };
+ char * shell_name[] = { "/sbin/sh", NULL };
log_message("spawning a shell");
@@ -236,12 +234,10 @@ static void handle_pcmcia(void)
my_insmod("ds", ANY_DRIVER_TYPE, NULL, 0);
my_insmod("pcmcia", ANY_DRIVER_TYPE, NULL, 0);
- /* call to cardmgr takes time, let's use the wait message */
- wait_message("Enabling PCMCIA extension cards...");
- log_message("cardmgr rc: %d", cardmgr_call());
- remove_wait_message();
+ /* setup a dynamic resource database for non statically mapped PCMCIA sockets */
+ pcmcia_socket_startup(-1);
- add_to_env("PCMCIA", pcmcia_adapter);
+ add_to_env("PCMCIA", pcmcia_adapter);
}
#endif
@@ -283,17 +279,14 @@ static void method_select_and_prepare(void)
#endif
#ifndef DISABLE_CDROM
means[i] = cdrom_install; means_auto[i++] = cdrom_install_auto;
- allow_additional_modules_floppy = 0;
#endif
#ifndef DISABLE_DISK
means[i] = disk_install; means_auto[i++] = disk_install_auto;
- allow_additional_modules_floppy = 0;
#endif
means[i] = thirdparty_install; means_auto[i++] = thirdparty_install_auto;
means[i] = NULL;
unlink(IMAGE_LOCATION);
- rmdir(IMAGE_LOCATION); /* useful if we change the method, eg: we have automatic:cdrom but go back to nfs */
results = ask_from_list_auto("Please choose the installation method.", means, &choice, "method", means_auto);
@@ -314,7 +307,6 @@ static void method_select_and_prepare(void)
if (!strcmp(choice, network_nfs_install))
results = nfs_prepare();
-#ifndef MANDRAKE_MOVE
if (!strcmp(choice, network_ftp_install))
results = ftp_prepare();
@@ -326,7 +318,6 @@ static void method_select_and_prepare(void)
results = ka_prepare();
#endif
#endif
-#endif
if (!strcmp(choice, thirdparty_install)) {
thirdparty_load_modules();
@@ -348,203 +339,30 @@ static enum return_type create_initial_fs_symlinks(char* symlinks)
if (scall(!(f = fopen(symlinks, "rb")), "fopen"))
return RETURN_ERROR;
while (fgets(buf, sizeof(buf), f)) {
- char oldpath[500], newpath[500], newpathfinal[500];
+ char oldpath[500], newpath[500];
buf[strlen(buf)-1] = '\0'; // trim \n
if (sscanf(buf, "%s %s", oldpath, newpath) != 2) {
- sprintf(oldpath, "%s%s", STAGE2_LOCATION_ROOTED, buf);
- sprintf(newpathfinal, "%s%s", SLASH_LOCATION, buf);
- } else {
- sprintf(newpathfinal, "%s%s", SLASH_LOCATION, newpath);
+ sprintf(oldpath, "%s%s", STAGE2_LOCATION, buf);
+ sprintf(newpath, "%s", buf);
}
- log_message("creating symlink %s -> %s", oldpath, newpathfinal);
- if (scall(symlink(oldpath, newpathfinal), "symlink"))
- return RETURN_ERROR;
- }
- fclose(f);
- return RETURN_OK;
-}
-
-static enum return_type create_initial_fs_devices(char* devices)
-{
- FILE *f;
- char buf[5000];
-
- // need to create the few devices needed to start up stage2 in a decent manner, we can't symlink or they will keep CD busy
- if (scall(mkdir(SLASH_LOCATION "/dev", 0755), "mkdir"))
- return RETURN_ERROR;
- if (scall(!(f = fopen(devices, "rb")), "fopen"))
- return RETURN_ERROR;
- while (fgets(buf, sizeof(buf), f)) {
- char name[500], path[500], type;
- int major, minor;
- sscanf(buf, "%s %c %d %d", name, &type, &major, &minor);
- sprintf(path, "%s%s", SLASH_LOCATION, name);
- log_message("creating device %s %c %d %d", path, type, major, minor);
- if (scall(mknod(path, (type == 'c' ? S_IFCHR : S_IFBLK) | 0600, makedev(major, minor)), "mknod"))
+ recursiveRemove_if_it_exists(newpath);
+ log_message("creating symlink %s -> %s", oldpath, newpath);
+ if (scall(symlink(oldpath, newpath), "symlink"))
return RETURN_ERROR;
}
fclose(f);
return RETURN_OK;
}
-#ifdef MANDRAKE_MOVE
-static enum return_type handle_move_clp(char* clp_name, char* live, char* location_live, char* location_mount, int* is_symlink, int preload)
-{
- if (mount_clp_may_preload(clp_name, location_mount, preload) == RETURN_OK) {
- return RETURN_OK;
- } else {
- char *full_live = asprintf_("%s%s", location_live, live);
- log_message("no %s found (or disabled), trying to fallback on plain tree", clp_name);
- if (!access(full_live, R_OK)) {
- if (scall(symlink(location_live, location_mount), "symlink"))
- return RETURN_ERROR;
- *is_symlink = 1;
- return RETURN_OK;
- } else {
- log_message("move: can't find %s nor %s, proceeding hoping files will be there", clp_name, full_live);
- return RETURN_OK;
- }
- }
-}
-
-int mandrake_move_post(void)
-{
- int boot__real_is_symlink_to_raw = 0;
- int always__real_is_symlink_to_raw = 0;
- int totem__real_is_symlink_to_raw = 0;
- int main__real_is_symlink_to_raw = 0;
-
- if (handle_move_clp("live_tree_boot.clp", "/usr/bin/runstage2.pl",
- IMAGE_LOCATION "/live_tree_boot", BOOT_LOCATION,
- &boot__real_is_symlink_to_raw, 1) != RETURN_OK)
- return RETURN_ERROR;
-
- if (handle_move_clp("live_tree_always.clp", "/bin/bash",
- IMAGE_LOCATION "/live_tree_always", ALWAYS_LOCATION,
- &always__real_is_symlink_to_raw, 1) != RETURN_OK)
- return RETURN_ERROR;
-
- if (handle_move_clp("live_tree_totem.clp", "/usr/bin/totem",
- IMAGE_LOCATION "/live_tree_totem", TOTEM_LOCATION,
- &totem__real_is_symlink_to_raw, 1) != RETURN_OK)
- return RETURN_ERROR;
-
- if (handle_move_clp("live_tree.clp", "/etc/fstab",
- IMAGE_LOCATION "/live_tree", STAGE2_LOCATION,
- &main__real_is_symlink_to_raw, 0) != RETURN_OK)
- return RETURN_ERROR;
-
- // in case we didn't mount any clp, because gzloop.o is not available later in /lib/modules
- my_insmod("gzloop", ANY_DRIVER_TYPE, NULL, 0);
-
- // hardcoded :(
- if (!access(TOTEM_LOCATION, R_OK)) {
- if (scall(symlink("/image_totem/usr", SLASH_LOCATION "/usr"), "symlink"))
- return RETURN_ERROR;
- } else
- // need a fallback in case we don't use image_totem.clp nor live_tree_totem, but we're in -u mode
- if (scall(symlink(STAGE2_LOCATION_ROOTED "/usr", SLASH_LOCATION "/usr"), "symlink"))
- return RETURN_ERROR;
-
- if (create_initial_fs_symlinks(STAGE2_LOCATION "/move/symlinks") != RETURN_OK ||
- create_initial_fs_devices(STAGE2_LOCATION "/move/devices") != RETURN_OK)
- return RETURN_ERROR;
-
- if (boot__real_is_symlink_to_raw) {
- if (scall(unlink(BOOT_LOCATION), "unlink"))
- return RETURN_ERROR;
- if (scall(symlink(IMAGE_LOCATION_REL "/live_tree_boot", BOOT_LOCATION), "symlink"))
- return RETURN_ERROR;
- }
-
- if (always__real_is_symlink_to_raw) {
- if (scall(unlink(ALWAYS_LOCATION), "unlink"))
- return RETURN_ERROR;
- if (scall(symlink(IMAGE_LOCATION_REL "/live_tree_always", ALWAYS_LOCATION), "symlink"))
- return RETURN_ERROR;
- }
-
- if (totem__real_is_symlink_to_raw) {
- if (scall(unlink(TOTEM_LOCATION), "unlink"))
- return RETURN_ERROR;
- if (scall(symlink(IMAGE_LOCATION_REL "/live_tree_totem", TOTEM_LOCATION), "symlink"))
- return RETURN_ERROR;
- }
-
- if (main__real_is_symlink_to_raw) {
- if (scall(unlink(STAGE2_LOCATION), "unlink"))
- return RETURN_ERROR;
- if (scall(symlink(IMAGE_LOCATION_REL "/live_tree", STAGE2_LOCATION), "symlink"))
- return RETURN_ERROR;
- }
- return RETURN_OK;
-}
-#endif
-
-int do_pivot_root(void)
-{
- int fd;
- char rootdev[] = "0x0100";
-
- if (IS_DEBUGSTAGE1)
- while (1);
-
- log_message("pivot_rooting");
- // trick so that kernel won't try to mount the root device when initrd exits
- if (scall((fd = open("/proc/sys/kernel/real-root-dev", O_WRONLY)) < 0, "open"))
- return RETURN_ERROR;
- if (scall(write(fd, rootdev, strlen(rootdev)) != (signed)strlen(rootdev), "write")) {
- close(fd);
- return RETURN_ERROR;
- }
- close(fd);
-
- if (scall(mkdir(SLASH_LOCATION "/stage1", 0755), "mkdir"))
- return RETURN_ERROR;
-
- if (scall(pivot_root(SLASH_LOCATION, SLASH_LOCATION "/stage1"), "pivot_root"))
- return RETURN_ERROR;
-
- return RETURN_OK;
-}
-
void finish_preparing(void)
{
-#ifdef MANDRAKE_MOVE
- if (mandrake_move_post() != RETURN_OK)
- stg1_fatal_message("Fatal error when launching MandrakeMove.");
-#else
- mkdir(SLASH_LOCATION "/etc", 0755);
- mkdir(SLASH_LOCATION "/var", 0755);
- if (IS_RESCUE) {
- if (create_initial_fs_symlinks(STAGE2_LOCATION "/usr/share/symlinks") != RETURN_OK)
- stg1_fatal_message("Fatal error finishing initialization.");
-
- } else {
- if (create_initial_fs_symlinks(STAGE2_LOCATION "/usr/share/symlinks") != RETURN_OK ||
- create_initial_fs_devices(STAGE2_LOCATION "/usr/share/devices") != RETURN_OK)
- stg1_fatal_message("Fatal error finishing initialization.");
- }
-#endif
+ recursiveRemove("/init");
+
+ if (create_initial_fs_symlinks(STAGE2_LOCATION "/usr/share/symlinks") != RETURN_OK)
+ stg1_fatal_message("Fatal error finishing initialization.");
/* /tmp/syslog is used by the second init, so it must be copied now, not in stage2 */
/* we remove it to ensure the old one is not copied over it in stage2 */
- copy_file("/tmp/syslog", SLASH_LOCATION "/tmp/syslog", NULL);
- unlink("/tmp/syslog");
- copy_file("/etc/resolv.conf", SLASH_LOCATION "/etc/resolv.conf", NULL);
- mkdir(SLASH_LOCATION "/modules", 0755);
- copy_file("/modules/modules.dep", SLASH_LOCATION "/modules/modules.dep", NULL);
-
- if (!IS_RESCUE) {
- copy_file(STAGE2_LOCATION "/etc/init", SLASH_LOCATION "/etc/init", NULL);
- chmod(SLASH_LOCATION "/etc/init", 0755);
- }
-
- umount("/tmp/tmpfs");
- do_pivot_root();
-
- if (file_size(IS_RESCUE ? "/sbin/init" : "/etc/init") == -1)
- stg1_fatal_message("Fatal error giving hand to second stage.");
#ifdef SPAWN_SHELL
if (shell_pid != 0) {
@@ -576,13 +394,6 @@ int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))
set_param(MODE_TESTING);
}
- if (!IS_TESTING) {
- mkdir(SLASH_LOCATION, 0755);
- if (scall(mount("none", SLASH_LOCATION, "tmpfs", MS_MGC_VAL, NULL), "mount tmpfs"))
- fatal_error("Fatal error initializing.");
- mkdir(SLASH_LOCATION "/tmp", 0755);
- }
-
#ifdef SPAWN_INTERACTIVE
spawn_interactive();
#endif
@@ -618,18 +429,13 @@ int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))
"your own risk. Alternatively, you may reboot your system now.");
}
-#ifdef MANDRAKE_MOVE
- if (total_memory() < MEM_LIMIT_MOVE)
- stg1_info_message(DISTRIB_NAME " typically needs more than %d Mbytes of memory (detected %d Mbytes). You may proceed, but the machine may crash or lock up for no apparent reason. Continue at your own risk. Alternatively, you may reboot your system now.",
- MEM_LIMIT_MOVE, total_memory());
-#endif
method_select_and_prepare();
-#ifndef MANDRAKE_MOVE
+ thirdparty_destroy();
+
if (access(STAGE2_LOCATION, R_OK) != 0)
if (symlink(IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL, STAGE2_LOCATION) != 0)
log_perror("symlink from " IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL " to " STAGE2_LOCATION " failed");
-#endif
#ifdef SPAWN_INTERACTIVE
if (interactive_pid != 0)
@@ -641,9 +447,9 @@ int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))
finish_frontend();
close_log();
- if (IS_TESTING)
- return 0;
+ if (IS_RESCUE)
+ return 66; /* ask init to exec new init */
else
- return 66;
+ return 0x35; /* ask init to run stage2 binary */
#endif
}