aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lsh_builtins.c106
-rw-r--r--src/lsh_main_func.c144
-rwxr-xr-xsrc/main.c6
3 files changed, 145 insertions, 111 deletions
diff --git a/src/lsh_builtins.c b/src/lsh_builtins.c
index 34aced5..33b1b88 100644
--- a/src/lsh_builtins.c
+++ b/src/lsh_builtins.c
@@ -7,85 +7,109 @@
#include <unistd.h>
/*
- Function Declarations for builtin shell commands:
- */
+ Function Declarations for builtin shell commands:
+ */
int lsh_cd(char **args);
int lsh_help(char **args);
int lsh_exit(char **args);
+int export(char **args);
/*
- List of builtin commands, followed by their corresponding functions.
- */
+ List of builtin commands, followed by their corresponding functions.
+ */
char *builtin_str[] = {
- "cd",
- "help",
- "exit"
+ "cd",
+ "help",
+ "exit",
+ "export"
};
int (*builtin_func[]) (char **) = {
- &lsh_cd,
- &lsh_help,
- &lsh_exit
+ &lsh_cd,
+ &lsh_help,
+ &lsh_exit,
+ &export
};
int lsh_num_builtins() {
- return sizeof(builtin_str) / sizeof(char *);
+ return sizeof(builtin_str) / sizeof(char *);
}
/*
- Builtin function implementations.
-*/
+ Builtin function implementations.
+ */
int lsh_cd(char **args)
{
- if (args[1] == NULL) {
- fprintf(stderr, "lsh: expected argument to \"cd\"\n");
- } else {
- if (chdir(args[1]) != 0) {
- perror("lsh");
+ if (args[1] == NULL) {
+ fprintf(stderr, "lsh: expected argument to \"cd\"\n");
+ } else {
+ if (chdir(args[1]) != 0) {
+ perror("lsh");
+ }
}
- }
- return 1;
+ return 1;
}
int lsh_help(char **args)
{
- int i;
- printf("Stephen Brennan's LSH\n");
- printf("Type program names and arguments, and hit enter.\n");
- printf("The following are built in:\n");
+ int i;
+ printf("Stephen Brennan's LSH\n");
+ printf("Type program names and arguments, and hit enter.\n");
+ printf("The following are built in:\n");
- for (i = 0; i < lsh_num_builtins(); i++) {
- printf(" %s\n", builtin_str[i]);
- }
+ for (i = 0; i < lsh_num_builtins(); i++) {
+ printf(" %s\n", builtin_str[i]);
+ }
- printf("Use the man command for information on other programs.\n");
- return 1;
+ printf("Use the man command for information on other programs.\n");
+ return 1;
}
int lsh_exit(char **args)
{
- return 0;
+ return 0;
+}
+
+int export(char **args){
+ char *token;
+ int position = 0;
+ char *key = NULL;
+ char *value = NULL;
+
+ token = strtok(args[1], "=\r\n");
+ while (token != NULL) {
+ if(position == 0){
+ key=token;
+ } else if(position == 1){
+ value=token;
+ }
+
+ position++;
+ token = strtok(NULL, "=\r\n");
+ }
+ setenv(key,value,1);
+
+ return 1;
}
int lsh_execute(char **args)
{
- int i;
+ int i;
- if (args[0] == NULL) {
- // An empty command was entered.
- return 1;
- }
+ if (args[0] == NULL) {
+ // An empty command was entered.
+ return 1;
+ }
- for (i = 0; i < lsh_num_builtins(); i++) {
- if (strcmp(args[0], builtin_str[i]) == 0) {
- return (*builtin_func[i])(args);
+ for (i = 0; i < lsh_num_builtins(); i++) {
+ if (strcmp(args[0], builtin_str[i]) == 0) {
+ return (*builtin_func[i])(args);
+ }
}
- }
- return lsh_launch(args);
+ return lsh_launch(args);
}
-
#endif
diff --git a/src/lsh_main_func.c b/src/lsh_main_func.c
index af20b1b..f2a19a2 100644
--- a/src/lsh_main_func.c
+++ b/src/lsh_main_func.c
@@ -10,97 +10,107 @@
#define LSH_RL_BUFSIZE 1024
char *lsh_read_line(void)
{
- int bufsize = LSH_RL_BUFSIZE;
- int position = 0;
- char *buffer = malloc(sizeof(char) * bufsize);
- int c;
+ int bufsize = LSH_RL_BUFSIZE;
+ int position = 0;
+ char *buffer = malloc(sizeof(char) * bufsize);
+ int c;
- if (!buffer) {
- fprintf(stderr, "lsh: allocation error\n");
- exit(EXIT_FAILURE);
- }
+ if (!buffer) {
+ fprintf(stderr, "lsh: allocation error\n");
+ exit(EXIT_FAILURE);
+ }
- while (1) {
- // Read a character
- c = getchar();
+ while (1) {
+ // Read a character
+ c = getchar();
- // If we hit EOF, replace it with a null character and return.
- if (c == EOF || c == '\n') {
- buffer[position] = '\0';
- return buffer;
- } else {
- buffer[position] = c;
+ // If we hit EOF, replace it with a null character and return.
+ if (c == EOF || c == '\n') {
+ buffer[position] = '\0';
+ return buffer;
+ } else {
+ buffer[position] = c;
+ }
+ position++;
+
+ // If we have exceeded the buffer, reallocate.
+ if (position >= bufsize) {
+ bufsize += LSH_RL_BUFSIZE;
+ buffer = realloc(buffer, bufsize);
+ if (!buffer) {
+ fprintf(stderr, "lsh: allocation error\n");
+ exit(EXIT_FAILURE);
+ }
+ }
}
- position++;
+}
- // If we have exceeded the buffer, reallocate.
- if (position >= bufsize) {
- bufsize += LSH_RL_BUFSIZE;
- buffer = realloc(buffer, bufsize);
- if (!buffer) {
- fprintf(stderr, "lsh: allocation error\n");
- exit(EXIT_FAILURE);
- }
+char *handle_vars(char *token){
+ if (token[0] == '$'){
+ token=&token[1];
+ token=getenv(token);
}
- }
+ return token;
}
#define LSH_TOK_BUFSIZE 64
#define LSH_TOK_DELIM " \t\r\n\a"
char **lsh_split_line(char *line)
{
- int bufsize = LSH_TOK_BUFSIZE, position = 0;
- char **tokens = malloc(bufsize * sizeof(char*));
- char *token;
+ int bufsize = LSH_TOK_BUFSIZE, position = 0;
+ char **tokens = malloc(bufsize * sizeof(char*));
+ char *token;
- if (!tokens) {
- fprintf(stderr, "lsh: allocation error\n");
- exit(EXIT_FAILURE);
- }
-
- token = strtok(line, LSH_TOK_DELIM);
- while (token != NULL) {
- tokens[position] = token;
- position++;
-
- if (position >= bufsize) {
- bufsize += LSH_TOK_BUFSIZE;
- tokens = realloc(tokens, bufsize * sizeof(char*));
- if (!tokens) {
+ if (!tokens) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
- }
}
- token = strtok(NULL, LSH_TOK_DELIM);
- }
- tokens[position] = NULL;
- return tokens;
+ token = strtok(line, LSH_TOK_DELIM);
+ while (token != NULL) {
+ token = handle_vars(token);
+ tokens[position] = token;
+ position++;
+
+
+ if (position >= bufsize) {
+ bufsize += LSH_TOK_BUFSIZE;
+ tokens = realloc(tokens, bufsize * sizeof(char*));
+ if (!tokens) {
+ fprintf(stderr, "lsh: allocation error\n");
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ token = strtok(NULL, LSH_TOK_DELIM);
+ }
+ tokens[position] = NULL;
+ return tokens;
}
int lsh_launch(char **args)
{
- pid_t pid, wpid;
- int status;
+ pid_t pid, wpid;
+ int status;
- pid = fork();
- if (pid == 0) {
- // Child process
- if (execvp(args[0], args) == -1) {
- perror("lsh");
+ pid = fork();
+ if (pid == 0) {
+ // Child process
+ if (execvp(args[0], args) == -1) {
+ perror("lsh");
+ }
+ exit(EXIT_FAILURE);
+ } else if (pid < 0) {
+ // Error forking
+ perror("lsh");
+ } else {
+ // Parent process
+ do {
+ wpid = waitpid(pid, &status, WUNTRACED);
+ } while (!WIFEXITED(status) && !WIFSIGNALED(status));
}
- exit(EXIT_FAILURE);
- } else if (pid < 0) {
- // Error forking
- perror("lsh");
- } else {
- // Parent process
- do {
- wpid = waitpid(pid, &status, WUNTRACED);
- } while (!WIFEXITED(status) && !WIFSIGNALED(status));
- }
- return 1;
+ return 1;
}
#endif
diff --git a/src/main.c b/src/main.c
index a107950..59f474b 100755
--- a/src/main.c
+++ b/src/main.c
@@ -1,7 +1,5 @@
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
-#include <sys/wait.h>
#include <unistd.h>
#include "lsh_main_func.c"
@@ -30,15 +28,17 @@ void lsh_loop(SHELL_OB *shell_obj)
int main(int argc, char **argv){
SHELL_OB shell_obj;
+ shell_obj.prompt = (char *)malloc(sizeof(char) * 1024);
//get the hostname
char *hostname = (char *)malloc(sizeof(char) * 1024);
gethostname(hostname,sizeof(char) * 1024);
- shell_obj.prompt=strcat(strcat(strcat(getenv("USER"), "@"), (char *)hostname), "> ");
+ snprintf(shell_obj.prompt,sizeof(char) * 1024,"%s@%s> ",getenv("USER"),hostname);
lsh_loop(&shell_obj);
free(hostname);
+ free(shell_obj.prompt);
return EXIT_SUCCESS;
}