init/Shell: init now spawns a login shell which sources /etc/profile
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
#include "Input.h"
|
#include "Input.h"
|
||||||
#include "TokenParser.h"
|
#include "TokenParser.h"
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -26,6 +27,7 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
sa.sa_handler = SIG_IGN;
|
sa.sa_handler = SIG_IGN;
|
||||||
sigaction(SIGTTOU, &sa, nullptr);
|
sigaction(SIGTTOU, &sa, nullptr);
|
||||||
|
sigaction(SIGTSTP, &sa, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -36,6 +38,8 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
Builtin::get().initialize();
|
Builtin::get().initialize();
|
||||||
|
|
||||||
|
bool is_login_shell = false;
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++)
|
for (int i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
if (argv[i][0] != '-')
|
if (argv[i][0] != '-')
|
||||||
@@ -82,10 +86,16 @@ int main(int argc, char** argv)
|
|||||||
printf("banan-sh 1.0\n");
|
printf("banan-sh 1.0\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else if (strcmp(argv[i], "-l") == 0 || strcmp(argv[i], "--login") == 0)
|
||||||
|
{
|
||||||
|
// TODO: actually store login name and fix getlogin()
|
||||||
|
is_login_shell = true;
|
||||||
|
}
|
||||||
else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0)
|
else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0)
|
||||||
{
|
{
|
||||||
printf("usage: %s [options...]\n", argv[0]);
|
printf("usage: %s [options...]\n", argv[0]);
|
||||||
printf(" -c run following argument as an argument\n");
|
printf(" -c run following argument as an argument\n");
|
||||||
|
printf(" -l, --login spawn a login shell\n");
|
||||||
printf(" -v, --version print version information and exit\n");
|
printf(" -v, --version print version information and exit\n");
|
||||||
printf(" -h, --help print this message and exit\n");
|
printf(" -h, --help print this message and exit\n");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -105,6 +115,34 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (is_login_shell)
|
||||||
|
{
|
||||||
|
if (access("/etc/profile", R_OK) == 0)
|
||||||
|
if (auto ret = parser.execute().source_script("/etc/profile"); ret.is_error())
|
||||||
|
fprintf(stderr, "could not source /etc/profile: %s\n", ret.error().get_message());
|
||||||
|
|
||||||
|
DIR* dirp = opendir("/etc/profile.d");
|
||||||
|
if (dirp != nullptr)
|
||||||
|
{
|
||||||
|
struct dirent* dirent;
|
||||||
|
while ((dirent = readdir(dirp)))
|
||||||
|
{
|
||||||
|
if (dirent->d_type != DT_REG)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
BAN::String path;
|
||||||
|
MUST(path.append("/etc/profile.d/"));
|
||||||
|
MUST(path.append(dirent->d_name));
|
||||||
|
if (access(path.data(), R_OK) == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (auto ret = parser.execute().source_script(path); ret.is_error())
|
||||||
|
fprintf(stderr, "could not source %s: %s\n", path.data(), ret.error().get_message());
|
||||||
|
}
|
||||||
|
closedir(dirp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (const char* home_env = getenv("HOME"))
|
if (const char* home_env = getenv("HOME"))
|
||||||
{
|
{
|
||||||
BAN::String config_file_path;
|
BAN::String config_file_path;
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
endpwent();
|
endpwent();
|
||||||
|
|
||||||
execl(shell_path, shell_path, nullptr);
|
execl(shell_path, shell_path, "--login", nullptr);
|
||||||
perror("execl");
|
perror("execl");
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user