Skip to content
Snippets Groups Projects
Commit 0cfd3639 authored by Joey Le's avatar Joey Le
Browse files

Added debugging statements to exec client requests

parent c722dd44
Branches
No related tags found
No related merge requests found
...@@ -308,32 +308,26 @@ int exec_client_requests(int cli_socket) { ...@@ -308,32 +308,26 @@ int exec_client_requests(int cli_socket) {
ssize_t recv_bytes; ssize_t recv_bytes;
int rc = OK; int rc = OK;
while (1) { printf("Waiting for client command...\n");
// Receive the command from the client
recv_bytes = recv(cli_socket, cmd_buff, RDSH_COMM_BUFF_SZ, 0); recv_bytes = recv(cli_socket, cmd_buff, RDSH_COMM_BUFF_SZ, 0);
if (recv_bytes <= 0) { if (recv_bytes <= 0) {
perror("recv");
close(cli_socket); close(cli_socket);
printf("Client disconnected\n"); return ERR_RDSH_COMMUNICATION;
return OK;
} }
cmd_buff[recv_bytes] = '\0'; cmd_buff[recv_bytes] = '\0';
printf("Received command: %s\n", cmd_buff);
cmd_buff[strcspn(cmd_buff, "\n")] = '\0'; // Execute the command
if (strlen(cmd_buff) == 0) {
send_message_string(cli_socket, CMD_WARN_NO_CMD);
send_message_eof(cli_socket);
rc = WARN_NO_CMDS;
continue;
}
if (strstr(cmd_buff, "|") != NULL) { if (strstr(cmd_buff, "|") != NULL) {
// Handle pipeline commands
command_list_t cmd_list; command_list_t cmd_list;
if (parse_pipeline(cmd_buff, &cmd_list) != OK) { if (parse_pipeline(cmd_buff, &cmd_list) != OK) {
send_message_string(cli_socket, CMD_ERR_PIPE_LIMIT); fprintf(stderr, "Error parsing pipeline\n");
send_message_eof(cli_socket); return ERR_TOO_MANY_COMMANDS;
rc = ERR_TOO_MANY_COMMANDS;
continue;
} }
rc = rsh_execute_pipeline(cli_socket, &cmd_list); rc = rsh_execute_pipeline(cli_socket, &cmd_list);
...@@ -342,67 +336,70 @@ int exec_client_requests(int cli_socket) { ...@@ -342,67 +336,70 @@ int exec_client_requests(int cli_socket) {
free(cmd_list.commands[i]._cmd_buffer); free(cmd_list.commands[i]._cmd_buffer);
} }
} else { } else {
// Handle single commands
cmd_buff_t cmd; cmd_buff_t cmd;
if (build_cmd_buff(cmd_buff, &cmd) != OK) { if (build_cmd_buff(cmd_buff, &cmd) != OK) {
send_message_string(cli_socket, CMD_ERR_PIPE_LIMIT); fprintf(stderr, "Error building command buffer\n");
send_message_eof(cli_socket); return ERR_MEMORY;
rc = ERR_MEMORY;
continue;
} }
if (strcmp(cmd.argv[0], EXIT_CMD) == 0) { if (strcmp(cmd.argv[0], EXIT_CMD) == 0) {
free(cmd._cmd_buffer); free(cmd._cmd_buffer);
send_message_string(cli_socket, "Exiting...\n"); printf("Client requested exit\n");
send_message_eof(cli_socket);
return OK; return OK;
} else if (strcmp(cmd.argv[0], "cd") == 0) { } else if (strcmp(cmd.argv[0], "cd") == 0) {
// Handle cd command
if (cmd.argc == 1) { if (cmd.argc == 1) {
chdir(getenv("HOME")); chdir(getenv("HOME"));
} else if (cmd.argc == 2) { } else if (cmd.argc == 2) {
if (chdir(cmd.argv[1]) != 0) { if (chdir(cmd.argv[1]) != 0) {
char error_msg[256]; perror("cd");
snprintf(error_msg, sizeof(error_msg), "cd: %s\n", strerror(errno));
send_message_string(cli_socket, error_msg);
} }
} else { } else {
send_message_string(cli_socket, CMD_ERR_PIPE_LIMIT); fprintf(stderr, "cd: too many arguments\n");
} }
send_message_eof(cli_socket);
free(cmd._cmd_buffer); free(cmd._cmd_buffer);
continue; return OK;
} }
// Fork and execute the command
pid_t pid = fork(); pid_t pid = fork();
if (pid < 0) { if (pid < 0) {
perror("fork failed"); perror("fork failed");
rc = ERR_MEMORY; return ERR_MEMORY;
} else if (pid == 0) { } else if (pid == 0) {
// Child process: execute the command
dup2(cli_socket, STDOUT_FILENO); // Redirect stdout to client socket
dup2(cli_socket, STDERR_FILENO); // Redirect stderr to client socket
execvp(cmd.argv[0], cmd.argv); execvp(cmd.argv[0], cmd.argv);
perror("execvp failed"); perror("execvp failed");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} else { } else {
// Parent process: wait for the child to finish
int status; int status;
wait(&status); wait(&status);
if (WIFEXITED(status)) { if (WIFEXITED(status)) {
if (WEXITSTATUS(status) != 0) { if (WEXITSTATUS(status) != 0) {
char error_msg[256]; fprintf(stderr, "Command failed with exit code %d\n", WEXITSTATUS(status));
snprintf(error_msg, sizeof(error_msg), "Command failed with exit code %d\n", WEXITSTATUS(status));
send_message_string(cli_socket, error_msg);
} }
} }
} }
free(cmd._cmd_buffer); free(cmd._cmd_buffer);
} }
// Send EOF to indicate end of response
send_message_eof(cli_socket); send_message_eof(cli_socket);
}
printf("Command executed successfully\n");
return rc; return rc;
} }
/* /*
* send_message_eof(cli_socket) * send_message_eof(cli_socket)
* cli_socket: The server-side socket that is connected to the client * cli_socket: The server-side socket that is connected to the client
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment