From b558e76eb1ba173ce3501c3e13fb80f426a7faac Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 30 Nov 2000 22:43:16 +0000 Subject: Apply some patches from Gennady Feldman to . /etc/profile, and to emulate bash prompt. I've cleaned up his patches a bit and all looks good now... --- shell/lash.c | 104 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 65 insertions(+), 39 deletions(-) (limited to 'shell') diff --git a/shell/lash.c b/shell/lash.c index eba60b3b7..461f2c092 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -45,9 +45,7 @@ #include #include #include -#ifdef BB_FEATURE_SH_COMMAND_EDITING #include "cmdedit.h" -#endif #define MAX_LINE 256 /* size of input buffer for `read' builtin */ #define MAX_READ 128 /* size of input buffer for `read' builtin */ @@ -55,6 +53,8 @@ extern size_t NUM_APPLETS; + + enum redirectionType { REDIRECT_INPUT, REDIRECT_OVERWRITE, REDIRECT_APPEND }; @@ -167,7 +167,7 @@ static struct builtInCommand bltins_forking[] = { {NULL, NULL, NULL} }; -static char *prompt = "# "; +static char prompt[3]; static char *cwd; static char *local_pending_command = NULL; static char *promptStr = NULL; @@ -180,9 +180,20 @@ static int lastReturnCode=-1; static int showXtrace=FALSE; #endif +#ifdef DEBUG_SHELL +static inline void debug_printf(const char *format, ...) +{ + va_list args; + va_start(args, format); + vfprintf(stderr, s, p); + va_end(args); +} +#else +static inline void debug_printf(const char *format, ...) { } +#endif #ifdef BB_FEATURE_SH_COMMAND_EDITING -void win_changed(int junk) +static inline void win_changed(int junk) { struct winsize win = { 0, 0, 0, 0 }; ioctl(0, TIOCGWINSZ, &win); @@ -190,6 +201,8 @@ void win_changed(int junk) cmdedit_setwidth( win.ws_col - 1); } } +#else +static inline void win_changed(int junk) {} #endif @@ -402,22 +415,14 @@ static int builtin_if(struct job *cmd, struct jobSet *jobList) local_pending_command = xmalloc(status+1); strncpy(local_pending_command, charptr1, status); local_pending_command[status]='\0'; -#ifdef DEBUG_SHELL - fprintf(stderr, "'if' now testing '%s'\n", local_pending_command); -#endif + debug_printf(stderr, "'if' now testing '%s'\n", local_pending_command); status = busy_loop(NULL); /* Frees local_pending_command */ -#ifdef DEBUG_SHELL - fprintf(stderr, "if test returned "); -#endif + debug_printf(stderr, "if test returned "); if (status == 0) { -#ifdef DEBUG_SHELL - fprintf(stderr, "TRUE\n"); -#endif + debug_printf(stderr, "TRUE\n"); cmd->jobContext |= IF_TRUE_CONTEXT; } else { -#ifdef DEBUG_SHELL - fprintf(stderr, "FALSE\n"); -#endif + debug_printf(stderr, "FALSE\n"); cmd->jobContext |= IF_FALSE_CONTEXT; } @@ -447,9 +452,7 @@ static int builtin_then(struct job *cmd, struct jobSet *junk) local_pending_command = xmalloc(status+1); strncpy(local_pending_command, charptr1, status); local_pending_command[status]='\0'; -#ifdef DEBUG_SHELL - fprintf(stderr, "'then' now running '%s'\n", charptr1); -#endif + debug_printf(stderr, "'then' now running '%s'\n", charptr1); return( busy_loop(NULL)); } @@ -476,9 +479,7 @@ static int builtin_else(struct job *cmd, struct jobSet *junk) local_pending_command = xmalloc(status+1); strncpy(local_pending_command, charptr1, status); local_pending_command[status]='\0'; -#ifdef DEBUG_SHELL - fprintf(stderr, "'else' now running '%s'\n", charptr1); -#endif + debug_printf(stderr, "'else' now running '%s'\n", charptr1); return( busy_loop(NULL)); } @@ -491,9 +492,7 @@ static int builtin_fi(struct job *cmd, struct jobSet *junk) } /* Clear out the if and then context bits */ cmd->jobContext &= ~(IF_TRUE_CONTEXT|IF_FALSE_CONTEXT|THEN_EXP_CONTEXT|ELSE_EXP_CONTEXT); -#ifdef DEBUG_SHELL - fprintf(stderr, "Hit an fi -- jobContext=%d\n", cmd->jobContext); -#endif + debug_printf(stderr, "Hit an fi -- jobContext=%d\n", cmd->jobContext); return TRUE; } #endif @@ -656,6 +655,8 @@ static int setupRedirections(struct childProgram *prog) static int getCommand(FILE * source, char *command) { + char *user,buf[255],*s; + if (source == NULL) { if (local_pending_command) { /* a command specified (-c option): return it & mark it done */ @@ -667,6 +668,17 @@ static int getCommand(FILE * source, char *command) return 1; } + /* get User Name and setup prompt */ + strcpy(prompt,( geteuid() != 0 ) ? "$ ":"# "); + user=xcalloc(sizeof(int), 9); + my_getpwuid(user, geteuid()); + + /* get HostName */ + gethostname(buf, 255); + s = strchr(buf, '.'); + if (s) + *s = 0; + if (source == stdin) { #ifdef BB_FEATURE_SH_COMMAND_EDITING int len; @@ -679,21 +691,33 @@ static int getCommand(FILE * source, char *command) */ cmdedit_init(); signal(SIGWINCH, win_changed); - len=fprintf(stdout, "%s %s", cwd, prompt); + len=fprintf(stdout, "[%s@%s %s]%s", user, buf, + get_last_path_component(cwd), prompt); fflush(stdout); promptStr=(char*)xmalloc(sizeof(char)*(len+1)); - sprintf(promptStr, "%s %s", cwd, prompt); + sprintf(promptStr, "[%s@%s %s]%s", user, buf, + get_last_path_component(cwd), prompt); cmdedit_read_input(promptStr, command); free( promptStr); cmdedit_terminate(); signal(SIGWINCH, SIG_DFL); return 0; #else - fprintf(stdout, "%s %s", cwd, prompt); + i=strlen(cwd); + i--; + if (i>1){ + while ((i>0) && (*(cwd+i)!='/') ) i--; + if (*(cwd+i)=='/') i++; + } + + fprintf(stdout, "[%s@%s %s]%s",user, buf, (cwd+i), prompt); fflush(stdout); #endif } + /* don't leak memory */ + free(user); + if (!fgets(command, BUFSIZ - 2, source)) { if (source == stdin) printf("\n"); @@ -707,10 +731,9 @@ static int getCommand(FILE * source, char *command) } #ifdef BB_FEATURE_SH_ENVIRONMENT -#define __MAX_INT_CHARS 7 static char* itoa(register int i) { - static char a[__MAX_INT_CHARS]; + static char a[7]; /* Max 7 ints */ register char *b = a + sizeof(a) - 1; int sign = (i < 0); @@ -1381,9 +1404,7 @@ static int busy_loop(FILE * input) #ifdef BB_FEATURE_SH_ENVIRONMENT lastReturnCode=WEXITSTATUS(status); #endif -#if 0 - printf("'%s' exited -- return code %d\n", jobList.fg->text, lastReturnCode); -#endif + debug_printf("'%s' exited -- return code %d\n", jobList.fg->text, lastReturnCode); if (!jobList.fg->runningProgs) { /* child exited */ @@ -1449,9 +1470,17 @@ int shell_main(int argc_l, char **argv_l) argv = argv_l; - //if (argv[0] && argv[0][0] == '-') { - // builtin_source("/etc/profile"); - //} + if (argv[0] && argv[0][0] == '-') { + FILE *input; + input = fopen("/etc/profile", "r"); + if (!input) { + fprintf(stdout, "Couldn't open file '/etc/profile'\n"); + } else { + /* Now run the file */ + busy_loop(input); + fclose(input); + } + } while ((opt = getopt(argc_l, argv_l, "cx")) > 0) { switch (opt) { @@ -1500,9 +1529,6 @@ int shell_main(int argc_l, char **argv_l) atexit(free_memory); #endif -#ifdef BB_FEATURE_SH_COMMAND_EDITING win_changed(0); -#endif - return (busy_loop(input)); } -- cgit v1.2.3