2
0
mirror of https://github.com/xcat2/xNBA.git synced 2025-08-29 22:38:23 +00:00
Files
xNBA/src/filo/main/filo_x.c
2005-03-08 18:53:11 +00:00

130 lines
2.4 KiB
C

#include <etherboot.h>
#include <fs.h>
#include <lib.h>
#include <sys_info.h>
#define ENTER '\r'
#define ESCAPE '\x1b'
#ifndef AUTOBOOT_FILE
#define autoboot() ((void) 0) /* nop */
#endif
#ifndef AUTOBOOT_DELAY
#define autoboot_delay() 0 /* success */
#endif
struct sys_info sys_info;
static void init(void)
{
collect_sys_info(&sys_info);
printf("%s version %s\n", program_name, program_version);
}
static void boot(const char *line)
{
char file[256], *param;
/* Split filename and parameter */
memcpy(file, line,256);
// file = strdup(line);
param = strchr(file, ' ');
if (param) {
*param = '\0';
param++;
}
if (elf_load(&sys_info, file, param) == LOADER_NOT_SUPPORT){
if (linux_load(&sys_info, file, param) == LOADER_NOT_SUPPORT)
printf("Unsupported image format\n");
}
// free(file);
}
#ifdef AUTOBOOT_FILE
#if AUTOBOOT_DELAY
static inline int autoboot_delay(void)
{
unsigned int timeout;
int sec, tmp;
int key;
key = 0;
printf("Press <Enter> for default boot, or <Esc> for boot prompt... ");
for (sec = AUTOBOOT_DELAY; sec>0 && key==0; sec--) {
printf("%d", sec);
timeout = currticks() + TICKS_PER_SEC;
while (currticks() < timeout) {
if (iskey()) {
key = getchar();
if (key==ENTER || key==ESCAPE)
break;
}
}
for (tmp = sec; tmp; tmp /= 10)
printf("\b \b");
}
if (key == 0) {
printf("timed out\n");
return 0; /* success */
} else {
putchar('\n');
if (key == ESCAPE)
return -1; /* canceled */
else
return 0; /* default accepted */
}
}
#endif /* AUTOBOOT_DELAY */
static void autoboot(void)
{
/* If Escape key is pressed already, skip autoboot */
if (iskey() && getchar()==ESCAPE)
return;
if (autoboot_delay()==0) {
printf("boot: %s\n", AUTOBOOT_FILE);
boot(AUTOBOOT_FILE);
}
}
#endif /* AUTOBOOT_FILE */
/* The main routine */
int filo(void)
{
char line[256];
/* Initialize */
init();
/* Try default image */
autoboot();
/* The above didn't work, ask user */
while (iskey())
getchar();
#ifdef AUTOBOOT_FILE
strncpy(line, AUTOBOOT_FILE, sizeof(line)-1);
line[sizeof(line)-1] = '\0';
#else
line[0] = '\0';
#endif
for (;;) {
printf("boot: ");
getline(line, sizeof line);
// BY LYH add "quit" to exit filo
if (strcmp(line,"quit")==0) break;
// if (memcmp(line,"quit",4)==0) break;
if (line[0])
boot(line);
}
return 0;
}