mirror of
https://github.com/sheumann/hush.git
synced 2025-01-10 16:29:44 +00:00
Add support for additional startup files that will be sourced either always, for login shells, or for interactive shells.
This commit is contained in:
parent
70ea37208b
commit
9033a24562
17
README.md
17
README.md
@ -58,6 +58,23 @@ GNO-specific notes and known issues
|
|||||||
|
|
||||||
* In TMTerm, command-line editing operations can produce messed-up formatting.
|
* In TMTerm, command-line editing operations can produce messed-up formatting.
|
||||||
|
|
||||||
|
Startup files
|
||||||
|
-------------
|
||||||
|
This version of hush will read commands from several files at startup, if they
|
||||||
|
are present:
|
||||||
|
|
||||||
|
* First, it runs commands from `/etc/hushenv`, then from `$HOME/hushenv`.
|
||||||
|
|
||||||
|
* Next, if it is a login shell, it runs commands from `/etc/profile`, then
|
||||||
|
from `$HOME/hushprofile` (if it is present) or `$HOME/profile`.
|
||||||
|
|
||||||
|
* Finally, if it is an interactive shell, it runs commands from
|
||||||
|
`$HOME/hushrc`.
|
||||||
|
|
||||||
|
(It also supports versions of the user startup files with names starting with
|
||||||
|
`.`, which will be used preferentially if present, but these names are not
|
||||||
|
compatible with ProDOS filesystems.)
|
||||||
|
|
||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
Hush is licensed under the GNU General Public License version 2, contained in
|
Hush is licensed under the GNU General Public License version 2, contained in
|
||||||
|
80
shell/hush.c
80
shell/hush.c
@ -8228,6 +8228,63 @@ static int set_mode(int state, char mode, const char *o_opt)
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool source_startup_file(const char *path)
|
||||||
|
{
|
||||||
|
FILE *input = fopen_for_read(path);
|
||||||
|
if (input != NULL) {
|
||||||
|
close_on_exec_on(fileno(input));
|
||||||
|
install_special_sighandlers();
|
||||||
|
parse_and_run_file(input);
|
||||||
|
fclose(input);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void source_user_startup_files(const char * const *files)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const char *home;
|
||||||
|
|
||||||
|
if (getuid() == geteuid() && getgid() == getegid()) {
|
||||||
|
home = get_local_var_value("HOME");
|
||||||
|
if (home) {
|
||||||
|
for (i = 0; files[i] != NULL; i++) {
|
||||||
|
bool found;
|
||||||
|
char *path = concat_path_file(home, files[i]);
|
||||||
|
found = source_startup_file(path);
|
||||||
|
free(path);
|
||||||
|
if (found)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *global_env = "/etc/hushenv";
|
||||||
|
|
||||||
|
static const char* const user_envs[] = {
|
||||||
|
".hushenv",
|
||||||
|
"hushenv",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *global_profile = "/etc/profile";
|
||||||
|
|
||||||
|
static const char* const user_profiles[] = {
|
||||||
|
".hushprofile",
|
||||||
|
"hushprofile",
|
||||||
|
".profile",
|
||||||
|
"profile",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* const user_rcs[] = {
|
||||||
|
".hushrc",
|
||||||
|
"hushrc",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
int hush_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int hush_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int hush_main(int argc, char **argv)
|
int hush_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -8431,6 +8488,10 @@ int hush_main(int argc, char **argv)
|
|||||||
G.global_argv[0] = argv[0];
|
G.global_argv[0] = argv[0];
|
||||||
G.global_argc++;
|
G.global_argc++;
|
||||||
} /* else -c 'script' ARG0 [ARG1...]: $0 is ARG0 */
|
} /* else -c 'script' ARG0 [ARG1...]: $0 is ARG0 */
|
||||||
|
if (G.root_pid == getpid()) {
|
||||||
|
source_startup_file(global_env);
|
||||||
|
source_user_startup_files(user_envs);
|
||||||
|
}
|
||||||
install_special_sighandlers();
|
install_special_sighandlers();
|
||||||
parse_and_run_string(G.root_pid != getpid() ? decode_arg(optarg) : optarg);
|
parse_and_run_string(G.root_pid != getpid() ? decode_arg(optarg) : optarg);
|
||||||
goto final_return;
|
goto final_return;
|
||||||
@ -8521,17 +8582,15 @@ int hush_main(int argc, char **argv)
|
|||||||
G.root_ppid = getppid();
|
G.root_ppid = getppid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (G.root_pid == getpid()) {
|
||||||
|
source_startup_file(global_env);
|
||||||
|
source_user_startup_files(user_envs);
|
||||||
|
}
|
||||||
|
|
||||||
/* If we are login shell... */
|
/* If we are login shell... */
|
||||||
if (flags & OPT_login) {
|
if (flags & OPT_login) {
|
||||||
FILE *input;
|
|
||||||
debug_printf(("sourcing /etc/profile\n"));
|
debug_printf(("sourcing /etc/profile\n"));
|
||||||
input = fopen_for_read("/etc/profile");
|
source_startup_file(global_profile);
|
||||||
if (input != NULL) {
|
|
||||||
close_on_exec_on(fileno(input));
|
|
||||||
install_special_sighandlers();
|
|
||||||
parse_and_run_file(input);
|
|
||||||
fclose(input);
|
|
||||||
}
|
|
||||||
/* bash: after sourcing /etc/profile,
|
/* bash: after sourcing /etc/profile,
|
||||||
* tries to source (in the given order):
|
* tries to source (in the given order):
|
||||||
* ~/.bash_profile, ~/.bash_login, ~/.profile,
|
* ~/.bash_profile, ~/.bash_login, ~/.profile,
|
||||||
@ -8539,6 +8598,7 @@ int hush_main(int argc, char **argv)
|
|||||||
* bash also sources ~/.bash_logout on exit.
|
* bash also sources ~/.bash_logout on exit.
|
||||||
* If called as sh, skips .bash_XXX files.
|
* If called as sh, skips .bash_XXX files.
|
||||||
*/
|
*/
|
||||||
|
source_user_startup_files(user_profiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (G.global_argv[1]) {
|
if (G.global_argv[1]) {
|
||||||
@ -8701,6 +8761,10 @@ int hush_main(int argc, char **argv)
|
|||||||
* if interactive but not a login shell, sources ~/.bashrc
|
* if interactive but not a login shell, sources ~/.bashrc
|
||||||
* (--norc turns this off, --rcfile <file> overrides)
|
* (--norc turns this off, --rcfile <file> overrides)
|
||||||
*/
|
*/
|
||||||
|
if (G_interactive_fd && G.root_pid == getpid()) {
|
||||||
|
source_user_startup_files(user_rcs);
|
||||||
|
install_special_sighandlers();
|
||||||
|
}
|
||||||
|
|
||||||
if (!ENABLE_FEATURE_SH_EXTRA_QUIET && G_interactive_fd) {
|
if (!ENABLE_FEATURE_SH_EXTRA_QUIET && G_interactive_fd) {
|
||||||
/* note: ash and hush share this string */
|
/* note: ash and hush share this string */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user