2012-03-11 10:57:13 -04:00
|
|
|
/*******************************************************************************
|
|
|
|
|
2013-07-10 09:26:01 -04:00
|
|
|
Copyright(C) Jonas 'Sortie' Termansen 2011, 2012.
|
2012-03-11 10:57:13 -04:00
|
|
|
|
2013-07-10 09:26:01 -04:00
|
|
|
This program is free software: you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU General Public License as published by the Free
|
|
|
|
Software Foundation, either version 3 of the License, or (at your option)
|
|
|
|
any later version.
|
2012-03-11 10:57:13 -04:00
|
|
|
|
2013-07-10 09:26:01 -04:00
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
|
|
more details.
|
2012-03-11 10:57:13 -04:00
|
|
|
|
2013-07-10 09:26:01 -04:00
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
|
|
this program. If not, see <http://www.gnu.org/licenses/>.
|
2012-03-11 10:57:13 -04:00
|
|
|
|
2013-07-10 09:26:01 -04:00
|
|
|
init.cpp
|
|
|
|
Initializes the system by setting up the terminal and starting the shell.
|
2012-03-11 10:57:13 -04:00
|
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
2012-08-07 18:19:44 -04:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/types.h>
|
2011-11-06 17:51:02 -05:00
|
|
|
#include <sys/wait.h>
|
2012-08-07 18:19:44 -04:00
|
|
|
|
2011-11-22 11:26:47 -05:00
|
|
|
#include <stdio.h>
|
2012-04-14 09:31:55 -04:00
|
|
|
#include <stdlib.h>
|
2011-11-22 11:26:47 -05:00
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
2011-11-26 05:00:45 -05:00
|
|
|
#include <error.h>
|
2011-11-24 04:26:36 -05:00
|
|
|
#include <fcntl.h>
|
2012-01-22 17:46:41 -05:00
|
|
|
#include <unistd.h>
|
2011-09-21 14:52:29 -04:00
|
|
|
|
|
|
|
int child()
|
|
|
|
{
|
2011-08-27 17:03:39 -04:00
|
|
|
const char* programname = "sh";
|
2012-03-02 09:00:11 -05:00
|
|
|
const char* newargv[] = { programname, NULL };
|
2011-08-27 17:03:39 -04:00
|
|
|
|
2012-04-29 08:37:11 -04:00
|
|
|
execvp(programname, (char* const*) newargv);
|
2011-11-26 05:00:45 -05:00
|
|
|
error(0, errno, "%s", programname);
|
|
|
|
|
2011-11-06 17:51:02 -05:00
|
|
|
return 2;
|
2011-08-27 17:03:39 -04:00
|
|
|
}
|
2011-09-21 14:52:29 -04:00
|
|
|
|
2012-04-13 15:47:47 -04:00
|
|
|
int runsystem()
|
|
|
|
{
|
|
|
|
pid_t childpid = fork();
|
|
|
|
if ( childpid < 0 ) { perror("fork"); return 2; }
|
|
|
|
|
|
|
|
if ( childpid )
|
|
|
|
{
|
|
|
|
int status;
|
|
|
|
waitpid(childpid, &status, 0);
|
2013-03-10 07:08:20 -04:00
|
|
|
while ( 0 < waitpid(-1, NULL, WNOHANG) );
|
2012-04-13 15:47:47 -04:00
|
|
|
// TODO: Use the proper macro!
|
2012-09-09 06:21:39 -04:00
|
|
|
if ( 128 <= WEXITSTATUS(status) || WIFSIGNALED(status) )
|
2012-04-13 15:47:47 -04:00
|
|
|
{
|
|
|
|
printf("Looks like the system crashed, trying to bring it back up.\n");
|
|
|
|
return runsystem();
|
|
|
|
}
|
2012-09-09 17:08:03 -04:00
|
|
|
return WEXITSTATUS(status);
|
2012-04-13 15:47:47 -04:00
|
|
|
}
|
|
|
|
|
2013-03-10 07:08:20 -04:00
|
|
|
exit(child());
|
2012-04-13 15:47:47 -04:00
|
|
|
}
|
|
|
|
|
2012-09-08 14:55:43 -04:00
|
|
|
int main(int /*argc*/, char* /*argv*/[])
|
2011-09-21 14:52:29 -04:00
|
|
|
{
|
2011-11-24 04:26:36 -05:00
|
|
|
if ( open("/dev/tty", O_RDONLY) != 0 ) { return 2; }
|
|
|
|
if ( open("/dev/tty", O_WRONLY | O_APPEND) != 1 ) { return 2; }
|
|
|
|
if ( open("/dev/tty", O_WRONLY | O_APPEND) != 2 ) { return 2; }
|
|
|
|
|
2011-09-21 14:52:29 -04:00
|
|
|
// Reset the terminal's color and the rest of it.
|
|
|
|
printf("\r\e[m\e[J");
|
Implemented large parts of the stdio(3), including fprintf.
Made FILE an interface to various backends. This allows application writers
to override the standard FILE API functions with their own backends. This
is highly unportable - it'd be nice if a real standard existed for this.
glibc already does something like this internally, but AFAIK you can't hook
into it.
Added fdopen(3), fopen(3), fregister(3), funregister(3), fread(3),
fwrite(3), fseek(3), clearerr(3), ferror(3), feof(3), rewind(3), ftell(3),
fflush(3), fclose(3), fileno(3), fnewline(3), fcloseall(3), memset(3),
stdio(3), vfprintf(3), fprintf(3), and vprintf(3).
Added a file-descriptor backend to the FILE API.
fd's {0, 1, 2} are now initialized as stdin, stdout, and stderr when the
standard library initializes.
fcloseall(3) is now called on exit(3).
decl/intn_t_.h now @include(size_t.h) instead of declaring it itself.
Added <stdint.h>.
The following programs now flush stdout: cat(1), clear(1), editor(1),
init(1), mxsh(1).
printf(3) is now hooked up against vprintf(3), while Maxsi::PrintF
remains using the system call, for now.
2011-12-23 22:08:10 -05:00
|
|
|
fflush(stdout);
|
2011-09-21 14:52:29 -04:00
|
|
|
|
2012-04-14 09:31:55 -04:00
|
|
|
// By default, compile to the same architecture that the kernel told us that
|
|
|
|
// we are running.
|
|
|
|
setenv("objtype", getenv("cputype"), 0);
|
|
|
|
|
2013-01-05 09:08:44 -05:00
|
|
|
// Set up the PATH variable.
|
|
|
|
const char* prefix = "/";
|
|
|
|
const char* cputype = getenv("cputype");
|
|
|
|
const char* suffix = "/bin";
|
|
|
|
char* path = new char[strlen(prefix) + strlen(cputype) + strlen(suffix) + 1];
|
|
|
|
stpcpy(stpcpy(stpcpy(path, prefix), cputype), suffix);
|
|
|
|
setenv("PATH", path, 0);
|
|
|
|
delete[] path;
|
|
|
|
|
2012-08-07 18:19:44 -04:00
|
|
|
// Make sure that we have a /tmp directory.
|
|
|
|
mkdir("/tmp", 01777);
|
|
|
|
|
2012-04-13 15:47:47 -04:00
|
|
|
return runsystem();
|
2011-09-21 14:52:29 -04:00
|
|
|
}
|