Browse Source

fake, Andreas V. Meier:


			
			
				rocklinux
			
			
		
fake 21 years ago
parent
commit
9cc37ecf5a
1 changed files with 156 additions and 56 deletions
  1. +156
    -56
      target/bootdisk/linuxrc.c

+ 156
- 56
target/bootdisk/linuxrc.c

@ -37,6 +37,8 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/klog.h> #include <sys/klog.h>
#include <sys/utsname.h>
#include <dirent.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <stdarg.h> #include <stdarg.h>
@ -66,6 +68,36 @@ int pivot_root(const char *new_root, const char *put_old);
int exit_linuxrc=0; int exit_linuxrc=0;
char mod_loader[50];
char mod_dir[255];
char mod_suffix[3];
int mod_suffix_len=0;
void mod_load_info(char *mod_loader, char *mod_dir, char *mod_suffix) {
struct utsname uts_name;
if(uname(&uts_name) < 0) {
perror("unable to perform uname syscall correctly");
return;
} else if(strcmp(uts_name.sysname, "Linux") != 0) {
printf("Your operating system is not supported ?!\n");
return;
}
strcpy(mod_loader, "/sbin/insmod");
strcpy(mod_dir, "/lib/modules/");
strcat(mod_dir, uts_name.release);
/* kernel module suffix for <= 2.4 is .o, .ko if above */
if(uts_name.release[2] > '4') {
strcpy(mod_suffix, ".ko");
} else {
strcpy(mod_suffix, ".o");
}
return;
}
void doboot() void doboot()
{ {
if ( mkdir("/mnt_root/old_root", 700) ) if ( mkdir("/mnt_root/old_root", 700) )
@ -198,60 +230,130 @@ void httpload()
doboot(); doboot();
} }
void load_modules(char * dir)
{
/* check wether a file is a directory */
int is_dir(const struct dirent *entry) {
struct stat tmpstat;
stat(entry->d_name, &tmpstat);
return S_ISDIR(tmpstat.st_mode);
}
/* this is used in the module loading shell for sorting dirs before files */
int dirs_first_sort(const struct dirent **a, const struct dirent **b) {
if(is_dir(*a)) {
if(is_dir(*b)) return 0;
else return 1;
} else if(is_dir(*b)) {
return -1;
} else return 0;
}
/* this is used in the modules loading shell to filter out kernel objects */
int module_filter(const struct dirent *entry) {
if(is_dir(entry)) {
if(!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) return 0;
else return 1;
} else if (!strcmp(entry->d_name+(strlen(entry->d_name) - mod_suffix_len), mod_suffix)) return 1;
return 0;
}
/* this starts the module loading shell */
void load_modules(char* directory){
struct dirent **namelist; struct dirent **namelist;
char text[100], filename[200];
int cnt, n, len, needmodhdr = 1, needdirhdr = 1;
int loader_res=0;
char filename[256], input[256];
char *execargs[100]; char *execargs[100];
int n, m=0, len;
int pid; int pid;
n = scandir(dir, &namelist, 0, alphasort);
if (n > 0) {
printf("List of available modules:\n\n ");
printf("module loading shell\n\n");
printf("you can navigate through the filestem with 'cd'. for loading a module\n");
printf("simply enter the shown name, to exit press enter on a blank line.\n\n");
while(1) {
if(chdir(directory)) {
perror("chdir");
}
n = scandir(".", &namelist, module_filter, dirs_first_sort);
if (n < 0) {
perror("scandir");
}
getcwd(directory, 255);
while(n--) { while(n--) {
strcpy(filename, namelist[n]->d_name); strcpy(filename, namelist[n]->d_name);
free(namelist[n]); len = strlen(filename);
if (len > 2 && !strcmp(filename+len-2, ".o")) {
filename[len-2]=0;
printf("%-15s", filename);
if (++m % 4 == 0) printf("\n ");
len = strlen(filename);
if(is_dir(namelist[n])) {
/* first visit to this function, show header */
if(needdirhdr == 1) {
printf("directories:\n ");
needdirhdr = 0; cnt = 1;
}
printf("[%-15s]",filename);
if(cnt % 4 == 0) printf("\n ");
cnt++;
} else {
/* finished directories, show module header */
if(needmodhdr == 1) {
if(needdirhdr == 0) printf("\n");
printf("kernel modules:\n ");
needmodhdr = 0; cnt = 1;
}
filename[len-mod_suffix_len] = 0;
printf("%-15s",filename);
if(cnt % 4 == 0) printf("\n ");
cnt++;
} }
free(namelist[n]);
} }
if (m % 4 != 0) printf("\n");
printf("\n");
free(namelist); free(namelist);
} else {
printf("No modules found!\n");
if (n == 0) free(namelist);
return;
}
printf("Enter module name (and optional parameters): ");
fflush(stdout);
while (1) {
trygets(text, 100);
if (text[0] == 0) return;
snprintf(filename, 200, "%s/%s.o", dir, strtok(text, " "));
execargs[0] = "insmod"; execargs[1] = "-v";
execargs[2] = "-f"; execargs[3] = filename;
for (n=4; (execargs[n] = strtok(NULL, " ")) != NULL; n++) ;
if ( ! access(filename, R_OK) ) break;
printf("No such module found. Try again (enter=back): ");
needmodhdr = 1; needdirhdr = 1;
printf("\n[%s]> ", directory);
fflush(stdout); fflush(stdout);
}
input[0]=0; fgets(input, 256, stdin); input[255]=0;
if (strlen(input) > 0) input[strlen(input)-1]=0;
if (input[0] == 0) return;
if(!strncmp(input, "cd ", 3)) {
/* absolute or relative pathname? */
if(input[3] == '/') {
strcpy(filename, input+3);
} else {
strcpy(filename, directory);
strcat(filename, "/");
strcat(filename, input+3);
}
free(directory);
directory = (char*)malloc(strlen(filename)+1);
strcpy(directory, filename);
} else {
snprintf(filename, 256, "%s%s", strtok(input, " "), mod_suffix);
execargs[0] = mod_loader; execargs[1] = filename;
for (n=2; (execargs[n] = strtok(NULL, " ")) != NULL; n++) ;
if ( ! access(filename, R_OK) ) {
if ( fork() == 0 ) {
execvp(execargs[0], execargs);
printf("Can't start %s!\n", execargs[0]);
exit(1);
}
wait(&loader_res);
if(WEXITSTATUS(loader_res) != 0)
printf("error: module loader finished unsuccesfully!\n");
else
printf("module loader finished succesfully.\n");
} else {
printf("%s: no such module found! try again... (enter=exit)\n", filename);
}
}
if ( (pid = fork()) == 0 ) {
execvp(execargs[0], execargs);
printf("Can't start %s!\n", execargs[0]);
exit(1);
fflush(stdout);
} }
trywait(pid);
return;
} }
int getdevice(char* devstr, int devlen, int cdroms, int floppies) int getdevice(char* devstr, int devlen, int cdroms, int floppies)
@ -504,6 +606,9 @@ int main()
/* Only print important stuff to console */ /* Only print important stuff to console */
klogctl(8, NULL, 3); klogctl(8, NULL, 3);
mod_load_info(mod_loader, mod_dir, mod_suffix);
mod_suffix_len = strlen(mod_suffix);
autoload_modules(); autoload_modules();
printf("\n\ printf("\n\
@ -523,12 +628,11 @@ drivers (if needed) and configure the installation source so the\n\
0. Load 2nd stage system from local device\n\ 0. Load 2nd stage system from local device\n\
1. Load 2nd stage system from network\n\ 1. Load 2nd stage system from network\n\
2. Configure network interfaces (IPv4 only)\n\ 2. Configure network interfaces (IPv4 only)\n\
3. Load kernel networking modules from this disk\n\
4. Load kernel SCSI modules from this disk\n\
5. Load kernel modules from another disk\n\
6. Activate already formatted swap device\n\
7. Execute a (kiss) shell if present (for experts!)\n\
8. Validate a CD/DVD against its embedded checksum\n\
3. Load kernel modules from this disk\n\
4. Load kernel modules from another disk\n\
5. Activate already formatted swap device\n\
6. Execute a (kiss) shell if present (for experts!)\n\
7. Validate a CD/DVD against its embedded checksum\n\
\n\ \n\
What do you want to do [0-8] (default=0)? "); What do you want to do [0-8] (default=0)? ");
fflush(stdout); fflush(stdout);
@ -550,14 +654,10 @@ What do you want to do [0-8] (default=0)? ");
break; break;
case 3: case 3:
load_modules("/lib/modules/net");
load_modules(mod_dir);
break; break;
case 4: case 4:
load_modules("/lib/modules/scsi");
break;
case 5:
if ( mkdir("/mnt_floppy", 700) ) if ( mkdir("/mnt_floppy", 700) )
perror("Can't create /mnt_floppy"); perror("Can't create /mnt_floppy");
@ -571,15 +671,15 @@ What do you want to do [0-8] (default=0)? ");
perror("Can't remove /mnt_floppy"); perror("Can't remove /mnt_floppy");
break; break;
case 6:
case 5:
activate_swap(); activate_swap();
break; break;
case 7:
case 6:
exec_sh(); exec_sh();
break; break;
case 8:
case 7:
checkisomd5(); checkisomd5();
break; break;

Loading…
Cancel
Save