diff --git a/Assignment-06/starter/rsh_server.c b/Assignment-06/starter/rsh_server.c index 1f214c311bc496edcb2da861c75c00270a80ee2b..64198648242718f3a1c71a8d9a72d865161c6daa 100644 --- a/Assignment-06/starter/rsh_server.c +++ b/Assignment-06/starter/rsh_server.c @@ -308,101 +308,98 @@ int exec_client_requests(int cli_socket) { ssize_t recv_bytes; int rc = OK; - while (1) { - recv_bytes = recv(cli_socket, cmd_buff, RDSH_COMM_BUFF_SZ, 0); - if (recv_bytes <= 0) { - close(cli_socket); - printf("Client disconnected\n"); - return OK; - } + printf("Waiting for client command...\n"); - cmd_buff[recv_bytes] = '\0'; + // Receive the command from the client + recv_bytes = recv(cli_socket, cmd_buff, RDSH_COMM_BUFF_SZ, 0); + if (recv_bytes <= 0) { + perror("recv"); + close(cli_socket); + return ERR_RDSH_COMMUNICATION; + } - cmd_buff[strcspn(cmd_buff, "\n")] = '\0'; + cmd_buff[recv_bytes] = '\0'; + printf("Received command: %s\n", cmd_buff); - if (strlen(cmd_buff) == 0) { - send_message_string(cli_socket, CMD_WARN_NO_CMD); - send_message_eof(cli_socket); - rc = WARN_NO_CMDS; - continue; + // Execute the command + if (strstr(cmd_buff, "|") != NULL) { + // Handle pipeline commands + command_list_t cmd_list; + if (parse_pipeline(cmd_buff, &cmd_list) != OK) { + fprintf(stderr, "Error parsing pipeline\n"); + return ERR_TOO_MANY_COMMANDS; } - if (strstr(cmd_buff, "|") != NULL) { - command_list_t cmd_list; - if (parse_pipeline(cmd_buff, &cmd_list) != OK) { - send_message_string(cli_socket, CMD_ERR_PIPE_LIMIT); - send_message_eof(cli_socket); - rc = ERR_TOO_MANY_COMMANDS; - continue; - } - - rc = rsh_execute_pipeline(cli_socket, &cmd_list); + rc = rsh_execute_pipeline(cli_socket, &cmd_list); - for (int i = 0; i < cmd_list.num; i++) { - free(cmd_list.commands[i]._cmd_buffer); - } - } else { - cmd_buff_t cmd; - if (build_cmd_buff(cmd_buff, &cmd) != OK) { - send_message_string(cli_socket, CMD_ERR_PIPE_LIMIT); - send_message_eof(cli_socket); - rc = ERR_MEMORY; - continue; - } + for (int i = 0; i < cmd_list.num; i++) { + free(cmd_list.commands[i]._cmd_buffer); + } + } else { + // Handle single commands + cmd_buff_t cmd; + if (build_cmd_buff(cmd_buff, &cmd) != OK) { + fprintf(stderr, "Error building command buffer\n"); + return ERR_MEMORY; + } - if (strcmp(cmd.argv[0], EXIT_CMD) == 0) { - free(cmd._cmd_buffer); - send_message_string(cli_socket, "Exiting...\n"); - send_message_eof(cli_socket); - return OK; - } else if (strcmp(cmd.argv[0], "cd") == 0) { - if (cmd.argc == 1) { - chdir(getenv("HOME")); - } else if (cmd.argc == 2) { - if (chdir(cmd.argv[1]) != 0) { - char error_msg[256]; - snprintf(error_msg, sizeof(error_msg), "cd: %s\n", strerror(errno)); - send_message_string(cli_socket, error_msg); - } - } else { - send_message_string(cli_socket, CMD_ERR_PIPE_LIMIT); + if (strcmp(cmd.argv[0], EXIT_CMD) == 0) { + free(cmd._cmd_buffer); + printf("Client requested exit\n"); + return OK; + } else if (strcmp(cmd.argv[0], "cd") == 0) { + // Handle cd command + if (cmd.argc == 1) { + chdir(getenv("HOME")); + } else if (cmd.argc == 2) { + if (chdir(cmd.argv[1]) != 0) { + perror("cd"); } - send_message_eof(cli_socket); - free(cmd._cmd_buffer); - continue; + } else { + fprintf(stderr, "cd: too many arguments\n"); } + free(cmd._cmd_buffer); + return OK; + } - pid_t pid = fork(); - if (pid < 0) { - perror("fork failed"); - rc = ERR_MEMORY; - } else if (pid == 0) { - execvp(cmd.argv[0], cmd.argv); - perror("execvp failed"); - exit(EXIT_FAILURE); - } else { - int status; - wait(&status); - - if (WIFEXITED(status)) { - if (WEXITSTATUS(status) != 0) { - char error_msg[256]; - snprintf(error_msg, sizeof(error_msg), "Command failed with exit code %d\n", WEXITSTATUS(status)); - send_message_string(cli_socket, error_msg); - } + // Fork and execute the command + pid_t pid = fork(); + if (pid < 0) { + perror("fork failed"); + return ERR_MEMORY; + } 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); + perror("execvp failed"); + exit(EXIT_FAILURE); + } else { + // Parent process: wait for the child to finish + int status; + wait(&status); + + if (WIFEXITED(status)) { + if (WEXITSTATUS(status) != 0) { + fprintf(stderr, "Command failed with exit code %d\n", WEXITSTATUS(status)); } } - free(cmd._cmd_buffer); } - send_message_eof(cli_socket); + + free(cmd._cmd_buffer); } + // Send EOF to indicate end of response + send_message_eof(cli_socket); + + printf("Command executed successfully\n"); return rc; } + /* * send_message_eof(cli_socket) * cli_socket: The server-side socket that is connected to the client