summaryrefslogtreecommitdiffstats
path: root/release/sysinstall/system.c
diff options
context:
space:
mode:
Diffstat (limited to 'release/sysinstall/system.c')
-rw-r--r--release/sysinstall/system.c264
1 files changed, 264 insertions, 0 deletions
diff --git a/release/sysinstall/system.c b/release/sysinstall/system.c
new file mode 100644
index 0000000..880dff9
--- /dev/null
+++ b/release/sysinstall/system.c
@@ -0,0 +1,264 @@
+/*
+ * 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.44 1995/06/11 19:30:10 rgrimes 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!
+ * Heck, get him completely drunk and send me pictures! :-)
+ */
+
+#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)
+{
+ if (!msgYesNo("Are you sure you want to abort the installation?"))
+ systemShutdown();
+}
+
+/* Initialize system defaults */
+void
+systemInitialize(int argc, char **argv)
+{
+ int i;
+
+ signal(SIGINT, SIG_IGN);
+ globalsInit();
+
+ /* Are we running as init? */
+ if (getpid() == 1) {
+ setsid();
+ close(0); open("/dev/ttyv0", O_RDWR);
+ close(1); dup(0);
+ close(2); dup(0);
+ printf("%s running as init\n", argv[0]);
+
+ i = ioctl(0, TIOCSCTTY, (char *)NULL);
+ setlogin("root");
+ setenv("PATH", "/stand:/bin:/sbin:/usr/sbin:/usr/bin:/mnt/bin:/mnt/sbin:/mnt/usr/sbin:/mnt/usr/bin:/usr/X11R6/bin", 1);
+ setbuf(stdin, 0);
+ setbuf(stderr, 0);
+ }
+
+ if (set_termcap() == -1) {
+ printf("Can't find terminal entry\n");
+ exit(-1);
+ }
+
+ /* 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 (RunningAsInit) {
+ /* Put the console back */
+ ioctl(0, VT_ACTIVATE, 2);
+ 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;
+}
+
+/* Display a file in a filebox */
+int
+systemDisplayFile(char *file)
+{
+ char *fname = NULL;
+ char buf[FILENAME_MAX];
+ WINDOW *w;
+
+ 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);
+ w = dupwin(newscr);
+ dialog_mesgbox("Sorry!", buf, -1, -1);
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ return 1;
+ }
+ else {
+ use_helpfile(NULL);
+ use_helpline(NULL);
+ w = dupwin(newscr);
+ dialog_textbox(file, fname, LINES, COLS);
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ }
+ return 0;
+}
+
+char *
+systemHelpFile(char *file, char *buf)
+{
+ if (!file)
+ return NULL;
+
+ snprintf(buf, FILENAME_MAX, "/stand/help/%s.hlp", file);
+ if (file_readable(buf))
+ return buf;
+ return NULL;
+}
+
+void
+systemChangeTerminal(char *color, const u_char c_term[],
+ char *mono, const u_char m_term[])
+{
+ extern void init_acs(void);
+
+ if (OnVTY) {
+ if (ColorDisplay) {
+ setenv("TERM", color, 1);
+ setenv("TERMCAP", c_term, 1);
+ reset_shell_mode();
+ setterm(color);
+ init_acs();
+ cbreak(); noecho();
+ }
+ else {
+ setenv("TERM", mono, 1);
+ setenv("TERMCAP", m_term, 1);
+ reset_shell_mode();
+ setterm(mono);
+ init_acs();
+ cbreak(); noecho();
+ }
+ }
+ clear();
+ refresh();
+ dialog_clear();
+}
+
+int
+vsystem(char *fmt, ...)
+{
+ va_list args;
+ int pstat;
+ pid_t pid;
+ int omask;
+ sig_t intsave, quitsave;
+ char *cmd,*p;
+ int i,magic=0;
+
+ cmd = (char *)malloc(FILENAME_MAX);
+ cmd[0] = '\0';
+ va_start(args, fmt);
+ vsnprintf(cmd, FILENAME_MAX, fmt, args);
+ va_end(args);
+
+ /* Find out if this command needs the wizardry of the shell */
+ for (p="<>|'`=\"()" ; *p; p++)
+ if (strchr(cmd, *p))
+ magic++;
+ omask = sigblock(sigmask(SIGCHLD));
+ if (isDebug())
+ msgDebug("Executing command `%s' (Magic=%d)\n", cmd, magic);
+ switch(pid = fork()) {
+ case -1: /* error */
+ (void)sigsetmask(omask);
+ i = 127;
+
+ case 0: /* child */
+ (void)sigsetmask(omask);
+ if (DebugFD != -1) {
+ if (OnVTY && isDebug())
+ msgInfo("Command output is on debugging screen - type ALT-F2 to see it");
+ dup2(DebugFD, 0);
+ dup2(DebugFD, 1);
+ dup2(DebugFD, 2);
+ }
+#ifdef NOT_A_GOOD_IDEA_CRUNCHED_BINARY
+ if (magic) {
+ char *argv[100];
+ i = 0;
+ argv[i++] = "crunch";
+ argv[i++] = "sh";
+ argv[i++] = "-c";
+ argv[i++] = cmd;
+ argv[i] = 0;
+ exit(crunched_main(i,argv));
+ } else {
+ char *argv[100];
+ i = 0;
+ argv[i++] = "crunch";
+ while (cmd && *cmd) {
+ argv[i] = strsep(&cmd," \t");
+ if (*argv[i])
+ i++;
+ }
+ argv[i] = 0;
+ if (crunched_here(argv[1]))
+ exit(crunched_main(i,argv));
+ else
+ execvp(argv[1],argv+1);
+ kill(getpid(),9);
+ }
+#else /* !CRUNCHED_BINARY */
+ execl("/stand/sh", "sh", "-c", cmd, (char *)NULL);
+ kill(getpid(),9);
+#endif /* CRUNCHED_BINARY */
+ }
+ intsave = signal(SIGINT, SIG_IGN);
+ quitsave = signal(SIGQUIT, SIG_IGN);
+ pid = waitpid(pid, &pstat, 0);
+ (void)sigsetmask(omask);
+ (void)signal(SIGINT, intsave);
+ (void)signal(SIGQUIT, quitsave);
+ i = (pid == -1) ? -1 : WEXITSTATUS(pstat);
+ if (isDebug())
+ msgDebug("Command `%s' returns status of %d\n", cmd, i);
+ free(cmd);
+ return i;
+}
OpenPOWER on IntegriCloud