diff options
Diffstat (limited to 'mdk-stage1/ka.c')
-rw-r--r-- | mdk-stage1/ka.c | 292 |
1 files changed, 146 insertions, 146 deletions
diff --git a/mdk-stage1/ka.c b/mdk-stage1/ka.c index 1f0b1dedd..670abe5af 100644 --- a/mdk-stage1/ka.c +++ b/mdk-stage1/ka.c @@ -36,163 +36,163 @@ static void save_stuff_for_rescue(void) #endif static void my_pause(void) { - unsigned char t; - fflush(stdout); - read(0, &t, 1); + unsigned char t; + fflush(stdout); + read(0, &t, 1); } static enum return_type ka_wait_for_stage2(int count) { - char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd*/ - char * ka_launch[] = { "/ka/ka-d-client", "-w","-s","getstage2","-e","(cd /tmp/stage2; tar -x -f - )", NULL }; /* The command line for ka_launch */ - char * mkfs_launch[] = { "/sbin/mke2fs", "-m", "0", ramdisk, NULL}; /* The mkfs command for formating the ramdisk */ + char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd*/ + char * ka_launch[] = { "/ka/ka-d-client", "-w","-s","getstage2","-e","(cd /tmp/stage2; tar -x -f - )", NULL }; /* The command line for ka_launch */ + char * mkfs_launch[] = { "/sbin/mke2fs", "-m", "0", ramdisk, NULL}; /* The mkfs command for formating the ramdisk */ - log_message("KA: Preparing to receive stage 2...."); + log_message("KA: Preparing to receive stage 2...."); wait_message("Preparing to receive stage 2"); - int pida, wait_status; + int pida, wait_status; - if (!(pida = fork())) { /* Forking current process for running mkfs */ - //close(1); - close(2); - execv(mkfs_launch[0], mkfs_launch); /* Formating the ramdisk */ - printf("KA: Can't execute %s\n<press Enter>\n", mkfs_launch[0]); - my_pause(); - return KAERR_CANTFORK; - } - while (wait4(-1, &wait_status, 0, NULL) != pida) {}; /* Waiting the end of mkfs */ - remove_wait_message(); + if (!(pida = fork())) { /* Forking current process for running mkfs */ + //close(1); + close(2); + execv(mkfs_launch[0], mkfs_launch); /* Formating the ramdisk */ + printf("KA: Can't execute %s\n<press Enter>\n", mkfs_launch[0]); + my_pause(); + return KAERR_CANTFORK; + } + while (wait4(-1, &wait_status, 0, NULL) != pida) {}; /* Waiting the end of mkfs */ + remove_wait_message(); wait_message("Mounting /dev/ram3 at %s", STAGE2_LOCATION); - if (my_mount(ramdisk, STAGE2_LOCATION, "ext2", 1)) {/* Trying to mount the ramdisk */ - return RETURN_ERROR; - } - remove_wait_message(); - - log_message("KA: Waiting for stage 2...."); - wait_message("Waiting for rescue from KA server (Try %d/%d)", count, KA_MAX_RETRY); - pid_t pid; /* Process ID of the child process */ - pid_t wpid; /* Process ID from wait() */ - int status; /* Exit status from wait() */ - - pid = fork(); - if ( pid == -1 ) { - fprintf(stderr, "%s: Failed to fork()\n", strerror(errno)); - exit(13); - } else if ( pid == 0 ) { - // close(2); - execv(ka_launch[0], ka_launch); - } else { - // wpid = wait(&status); /* Child's exit status */ - wpid = wait4(-1, &status, 0, NULL); - if ( wpid == -1 ) { - fprintf(stderr,"%s: wait()\n", strerror(errno)); - return RETURN_ERROR; - } else if ( wpid != pid ) - abort(); - else { - if ( WIFEXITED(status) ) { - printf("Exited: $? = %d\n", WEXITSTATUS(status)); - } else if ( WIFSIGNALED(status) ) { - printf("Signal: %d%s\n", WTERMSIG(status), WCOREDUMP(status) ? " with core file." : ""); - } - } - } - - remove_wait_message(); - return RETURN_OK; - // if (!(pid = fork())) { /* Froking current process for running ka-deploy (client side) */ - // close(1); /* Closing stdout */ - // close(2); /* Closing stderr */ - // execve(ka_launch[0], ka_launch,grab_env()); /* Running ka-deploy (client side) */ - // printf("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); - // log_message("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); - // my_pause(); - // return KAERR_CANTFORK; - //} - - //while (wait4(-1, &wait_status, 0, NULL) != pid) {}; /* Waiting the end of duplication */ - // log_message("kalaunch ret %d\n", WIFEXITED(wait_status)); - // remove_wait_message(); - //sleep(100000); - // return RETURN_OK; + if (my_mount(ramdisk, STAGE2_LOCATION, "ext2", 1)) {/* Trying to mount the ramdisk */ + return RETURN_ERROR; + } + remove_wait_message(); + + log_message("KA: Waiting for stage 2...."); + wait_message("Waiting for rescue from KA server (Try %d/%d)", count, KA_MAX_RETRY); + pid_t pid; /* Process ID of the child process */ + pid_t wpid; /* Process ID from wait() */ + int status; /* Exit status from wait() */ + + pid = fork(); + if ( pid == -1 ) { + fprintf(stderr, "%s: Failed to fork()\n", strerror(errno)); + exit(13); + } else if ( pid == 0 ) { + // close(2); + execv(ka_launch[0], ka_launch); + } else { + // wpid = wait(&status); /* Child's exit status */ + wpid = wait4(-1, &status, 0, NULL); + if ( wpid == -1 ) { + fprintf(stderr,"%s: wait()\n", strerror(errno)); + return RETURN_ERROR; + } else if ( wpid != pid ) + abort(); + else { + if ( WIFEXITED(status) ) { + printf("Exited: $? = %d\n", WEXITSTATUS(status)); + } else if ( WIFSIGNALED(status) ) { + printf("Signal: %d%s\n", WTERMSIG(status), WCOREDUMP(status) ? " with core file." : ""); + } + } + } + + remove_wait_message(); + return RETURN_OK; + // if (!(pid = fork())) { /* Froking current process for running ka-deploy (client side) */ + // close(1); /* Closing stdout */ + // close(2); /* Closing stderr */ + // execve(ka_launch[0], ka_launch,grab_env()); /* Running ka-deploy (client side) */ + // printf("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); + // log_message("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); + // my_pause(); + // return KAERR_CANTFORK; + //} + + //while (wait4(-1, &wait_status, 0, NULL) != pid) {}; /* Waiting the end of duplication */ + // log_message("kalaunch ret %d\n", WIFEXITED(wait_status)); + // remove_wait_message(); + //sleep(100000); + // return RETURN_OK; } enum return_type perform_ka(void) { - enum return_type results; - int server_failure = 1; /* Number of time we've failed to find a ka server */ - FILE *f = fopen ("/ka/tftpserver","w"); - - if (f != NULL) { - /* Writing the NEXT_SERVER value of the DHCP Request in the /ka/tftpserver file */ - fprintf(f,"%s\n",inet_ntoa(next_server)); - fclose(f); - } - - log_message("KA: Trying to retrieve stage2 from server"); - log_message("KA: ka_wait_for_stage2"); - do { - /* We are trying to get a valid stage 2 (rescue) */ - results=ka_wait_for_stage2(server_failure); - if (results != RETURN_OK) { - return results; - } else { - /* Trying to open STAGE2_LOCATION/ka directory */ - char dir[255] = STAGE2_LOCATION; - strcat(dir,"/ka"); - DIR *dp = opendir(dir); - - /* Does the STAGE2_LOCATION/ka directory exists ? = Does the rescue with ka well downloaded ?*/ - if (!dp) { - log_message("KA: Server not found !"); - /* Be sure that the STAGE2_LOCATION isn't mounted after receiving a wrong rescue */ - if (umount (STAGE2_LOCATION)) { - log_perror("KA: Unable to umount STAGE2"); - } - int cpt; - - if (server_failure++ == KA_MAX_RETRY){ - /* if the KA server can't be reach KA_MAX_RETRY times */ - char * reboot_launch[] = { "/sbin/reboot", NULL}; - for (cpt=5; cpt>0; cpt--) { - wait_message("!!! Can't reach a valid KA server !!! (Rebooting in %d sec)",cpt); - sleep (1); - } - /* Rebooting the computer to avoid infinite loop on ka mode */ - execv(reboot_launch[0], reboot_launch); - } - - for (cpt=5; cpt>0; cpt--) { - wait_message("KA server not found ! (Try %d/%d in %d sec)",server_failure,KA_MAX_RETRY,cpt); - log_message("Ka not found %d/%d", server_failure,KA_MAX_RETRY); - sleep (1); - } - remove_wait_message(); - /* We should try another time*/ - results=RETURN_BACK; - continue; - } - - if (dp) { - log_message("KA: Stage 2 downloaded successfully"); - closedir(dp); /* Closing the /ka directory */ - server_failure=1; /* Resetting server_failure */ - results = RETURN_OK; - } - } - - log_message("KA: Preparing chroot"); - return RETURN_OK; - - // if (IS_RESCUE) { /* if we are in rescue mode */ - // save_stuff_for_rescue(); /* Saving resolve.conf */ - // if (umount (STAGE2_LOCATION)) { /* Unmounting STAGE2 elseif kernel can't mount it ! */ - // log_perror("KA: Unable to umount STAGE2"); - // return RETURN_ERROR; - // } - // } - } while (results == RETURN_BACK); - - // method_name = strdup("ka"); - return RETURN_OK; + enum return_type results; + int server_failure = 1; /* Number of time we've failed to find a ka server */ + FILE *f = fopen ("/ka/tftpserver","w"); + + if (f != NULL) { + /* Writing the NEXT_SERVER value of the DHCP Request in the /ka/tftpserver file */ + fprintf(f,"%s\n",inet_ntoa(next_server)); + fclose(f); + } + + log_message("KA: Trying to retrieve stage2 from server"); + log_message("KA: ka_wait_for_stage2"); + do { + /* We are trying to get a valid stage 2 (rescue) */ + results=ka_wait_for_stage2(server_failure); + if (results != RETURN_OK) { + return results; + } else { + /* Trying to open STAGE2_LOCATION/ka directory */ + char dir[255] = STAGE2_LOCATION; + strcat(dir,"/ka"); + DIR *dp = opendir(dir); + + /* Does the STAGE2_LOCATION/ka directory exists ? = Does the rescue with ka well downloaded ?*/ + if (!dp) { + log_message("KA: Server not found !"); + /* Be sure that the STAGE2_LOCATION isn't mounted after receiving a wrong rescue */ + if (umount (STAGE2_LOCATION)) { + log_perror("KA: Unable to umount STAGE2"); + } + int cpt; + + if (server_failure++ == KA_MAX_RETRY){ + /* if the KA server can't be reach KA_MAX_RETRY times */ + char * reboot_launch[] = { "/sbin/reboot", NULL}; + for (cpt=5; cpt>0; cpt--) { + wait_message("!!! Can't reach a valid KA server !!! (Rebooting in %d sec)",cpt); + sleep (1); + } + /* Rebooting the computer to avoid infinite loop on ka mode */ + execv(reboot_launch[0], reboot_launch); + } + + for (cpt=5; cpt>0; cpt--) { + wait_message("KA server not found ! (Try %d/%d in %d sec)",server_failure,KA_MAX_RETRY,cpt); + log_message("Ka not found %d/%d", server_failure,KA_MAX_RETRY); + sleep (1); + } + remove_wait_message(); + /* We should try another time*/ + results=RETURN_BACK; + continue; + } + + if (dp) { + log_message("KA: Stage 2 downloaded successfully"); + closedir(dp); /* Closing the /ka directory */ + server_failure=1; /* Resetting server_failure */ + results = RETURN_OK; + } + } + + log_message("KA: Preparing chroot"); + return RETURN_OK; + + // if (IS_RESCUE) { /* if we are in rescue mode */ + // save_stuff_for_rescue(); /* Saving resolve.conf */ + // if (umount (STAGE2_LOCATION)) { /* Unmounting STAGE2 elseif kernel can't mount it ! */ + // log_perror("KA: Unable to umount STAGE2"); + // return RETURN_ERROR; + // } + // } + } while (results == RETURN_BACK); + + // method_name = strdup("ka"); + return RETURN_OK; } |