e4d731b693
fixed, we should be able to fully set up the user's disk. Still to come with next commit: filesystem setup, distribution extraction, final configuration.
260 lines
5.3 KiB
C
260 lines
5.3 KiB
C
/*
|
|
* The new sysinstall program.
|
|
*
|
|
* This is probably the last program in the `sysinstall' line - the next
|
|
* generation being essentially a complete rewrite.
|
|
*
|
|
* $Id: system.c,v 1.3 1995/05/01 21:56:31 jkh Exp $
|
|
*
|
|
* Jordan Hubbard
|
|
*
|
|
* My contributions are in the public domain.
|
|
*
|
|
* Parts of this file are also blatently stolen from Poul-Henning Kamp's
|
|
* previous version of sysinstall, and as such fall under his "BEERWARE"
|
|
* license, so buy him a beer if you like it! Buy him a beer for me, too!
|
|
*/
|
|
|
|
#include "sysinstall.h"
|
|
#include <signal.h>
|
|
#include <sys/reboot.h>
|
|
#include <machine/console.h>
|
|
#include <sys/fcntl.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/wait.h>
|
|
|
|
/*
|
|
* Handle interrupt signals - this probably won't work in all cases
|
|
* due to our having bogotified the internal state of dialog or curses,
|
|
* but we'll give it a try.
|
|
*/
|
|
static void
|
|
handle_intr(int sig)
|
|
{
|
|
dialog_clear();
|
|
clear();
|
|
if (!msgYesNo("Are you sure you want to abort the installation?"))
|
|
systemShutdown();
|
|
else {
|
|
dialog_clear();
|
|
clear();
|
|
refresh();
|
|
}
|
|
}
|
|
|
|
/* Welcome the user to the system */
|
|
void
|
|
systemWelcome(void)
|
|
{
|
|
printf("Installation system initializing..\n");
|
|
}
|
|
|
|
/* Initialize system defaults */
|
|
void
|
|
systemInitialize(int argc, char **argv)
|
|
{
|
|
signal(SIGINT, SIG_IGN);
|
|
globalsInit();
|
|
|
|
/* Are we running as init? */
|
|
if (getpid() == 1) {
|
|
setsid();
|
|
if (argc > 1 && strchr(argv[1],'C')) {
|
|
/* Kernel told us that we are on a CDROM root */
|
|
close(0); open("/bootcd/dev/console", O_RDWR);
|
|
close(1); dup(0);
|
|
close(2); dup(0);
|
|
CpioFD = open("/floppies/cpio.flp", O_RDONLY);
|
|
OnCDROM = TRUE;
|
|
chroot("/bootcd");
|
|
} else {
|
|
close(0); open("/dev/console", O_RDWR);
|
|
close(1); dup(0);
|
|
close(2); dup(0);
|
|
}
|
|
msgInfo("%s running as init", argv[0]);
|
|
|
|
ioctl(0, TIOCSCTTY, (char *)NULL);
|
|
setlogin("root");
|
|
setbuf(stdin, 0);
|
|
setbuf(stdout, 0);
|
|
setbuf(stderr, 0);
|
|
}
|
|
|
|
if (set_termcap() == -1)
|
|
msgFatal("Can't find terminal entry");
|
|
|
|
/* XXX - libdialog has particularly bad return value checking */
|
|
init_dialog();
|
|
/* If we haven't crashed I guess dialog is running ! */
|
|
DialogActive = TRUE;
|
|
|
|
signal(SIGINT, handle_intr);
|
|
}
|
|
|
|
/* Close down and prepare to exit */
|
|
void
|
|
systemShutdown(void)
|
|
{
|
|
if (DialogActive) {
|
|
end_dialog();
|
|
DialogActive = FALSE;
|
|
}
|
|
/* REALLY exit! */
|
|
if (getpid() == 1)
|
|
reboot(RB_HALT);
|
|
else
|
|
exit(1);
|
|
}
|
|
|
|
/* Run some general command */
|
|
int
|
|
systemExecute(char *command)
|
|
{
|
|
int status;
|
|
|
|
dialog_clear();
|
|
dialog_update();
|
|
end_dialog();
|
|
DialogActive = FALSE;
|
|
status = system(command);
|
|
DialogActive = TRUE;
|
|
dialog_clear();
|
|
dialog_update();
|
|
return status;
|
|
}
|
|
|
|
/* Find and execute a shell */
|
|
int
|
|
systemShellEscape(void)
|
|
{
|
|
char *sh = NULL;
|
|
|
|
if (file_executable("/bin/sh"))
|
|
sh = "/bin/sh";
|
|
else if (file_executable("/stand/sh"))
|
|
sh = "/stand/sh";
|
|
else {
|
|
msgWarn("No shell available, sorry!");
|
|
return 1;
|
|
}
|
|
setenv("PS1", "freebsd% ", 1);
|
|
dialog_clear();
|
|
dialog_update();
|
|
move(0, 0);
|
|
standout();
|
|
addstr("Type `exit' to leave this shell and continue installation");
|
|
standend();
|
|
refresh();
|
|
end_dialog();
|
|
DialogActive = FALSE;
|
|
if (fork() == 0)
|
|
execlp(sh, "-sh", 0);
|
|
else
|
|
wait(NULL);
|
|
dialog_clear();
|
|
DialogActive = TRUE;
|
|
return 0;
|
|
}
|
|
|
|
/* Display a file in a filebox */
|
|
int
|
|
systemDisplayFile(char *file)
|
|
{
|
|
char *fname = NULL;
|
|
char buf[FILENAME_MAX];
|
|
|
|
fname = systemHelpFile(file, buf);
|
|
if (!fname) {
|
|
snprintf(buf, FILENAME_MAX, "The %s file is not provided on this particular floppy image.", file);
|
|
use_helpfile(NULL);
|
|
use_helpline(NULL);
|
|
dialog_mesgbox("Sorry!", buf, -1, -1);
|
|
dialog_clear_norefresh();
|
|
return 1;
|
|
}
|
|
else {
|
|
dialog_clear_norefresh();
|
|
use_helpfile(NULL);
|
|
use_helpline(NULL);
|
|
dialog_textbox(file, fname, LINES, COLS);
|
|
dialog_clear_norefresh();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
char *
|
|
systemHelpFile(char *file, char *buf)
|
|
{
|
|
char *cp, *fname = NULL;
|
|
|
|
if (!file)
|
|
return NULL;
|
|
|
|
if ((cp = getenv("LANG")) != NULL) {
|
|
snprintf(buf, FILENAME_MAX, "help/%s/%s", cp, file);
|
|
if (file_readable(buf))
|
|
fname = buf;
|
|
else {
|
|
snprintf(buf, FILENAME_MAX, "/stand/help/%s/%s", cp, file);
|
|
if (file_readable(buf))
|
|
fname = buf;
|
|
}
|
|
}
|
|
else {
|
|
snprintf(buf, FILENAME_MAX, "help/en_US.ISO8859-1/%s", file);
|
|
if (file_readable(buf))
|
|
fname = buf;
|
|
else {
|
|
snprintf(buf, FILENAME_MAX, "/stand/help/en_US.ISO8859-1/%s",
|
|
file);
|
|
if (file_readable(buf))
|
|
fname = buf;
|
|
}
|
|
}
|
|
return fname;
|
|
}
|
|
|
|
void
|
|
systemChangeFont(const u_char font[])
|
|
{
|
|
if (OnVTY) {
|
|
if (ioctl(0, PIO_FONT8x14, font) < 0)
|
|
msgConfirm("Sorry! Unable to load font for %s", getenv("LANG"));
|
|
}
|
|
}
|
|
|
|
void
|
|
systemChangeLang(char *lang)
|
|
{
|
|
variable_set2("LANG", lang);
|
|
}
|
|
|
|
void
|
|
systemChangeTerminal(char *color, const u_char c_term[],
|
|
char *mono, const u_char m_term[])
|
|
{
|
|
if (!OnSerial) {
|
|
if (ColorDisplay) {
|
|
setenv("TERM", color, 1);
|
|
setenv("TERMCAP", c_term, 1);
|
|
setterm(color);
|
|
}
|
|
else {
|
|
setenv("TERM", mono, 1);
|
|
setenv("TERMCAP", m_term, 1);
|
|
setterm(mono);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
systemChangeScreenmap(const u_char newmap[])
|
|
{
|
|
if (OnVTY) {
|
|
if (ioctl(0, PIO_SCRNMAP, newmap) < 0)
|
|
msgConfirm("Sorry! Unable to load the screenmap for %s",
|
|
getenv("LANG"));
|
|
}
|
|
}
|