diff --git a/otp.c b/otp.c index f23f3a2..3ed61d1 100644 --- a/otp.c +++ b/otp.c @@ -99,6 +99,9 @@ int handle_text_encrypt(void); int handle_file_encrypt(void); int handle_smart_decrypt(void); +// Enhanced input functions +int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size); + void print_usage(const char* program_name); int main(int argc, char* argv[]) { @@ -2297,6 +2300,59 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size, } } +// Enhanced input function for filename with directory separation +int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) { + // Find the last directory separator + char* last_slash = strrchr(default_path, '/'); + char directory[1024] = ""; + char filename[512] = ""; + + if (last_slash) { + // Extract directory path + size_t dir_len = last_slash - default_path + 1; // Include the trailing slash + if (dir_len < sizeof(directory)) { + strncpy(directory, default_path, dir_len); + directory[dir_len] = '\0'; + } + + // Extract filename + strncpy(filename, last_slash + 1, sizeof(filename) - 1); + filename[sizeof(filename) - 1] = '\0'; + } else { + // No directory separator, treat as filename only + strncpy(filename, default_path, sizeof(filename) - 1); + filename[sizeof(filename) - 1] = '\0'; + } + + // Display the enhanced prompt with directory and filename separated by colon + printf("\n%s\n%s: %s", prompt, directory, filename); + fflush(stdout); + + char input_buffer[512]; + if (!fgets(input_buffer, sizeof(input_buffer), stdin)) { + return 1; // Error reading input + } + + // Remove newline + input_buffer[strcspn(input_buffer, "\n")] = 0; + + // If user just pressed Enter, use the default filename + if (strlen(input_buffer) == 0) { + strncpy(result, default_path, result_size - 1); + result[result_size - 1] = '\0'; + } else { + // Combine directory with user input + if (strlen(directory) > 0) { + snprintf(result, result_size, "%s%s", directory, input_buffer); + } else { + strncpy(result, input_buffer, result_size - 1); + result[result_size - 1] = '\0'; + } + } + + return 0; // Success +} + // Editor and file manager implementations char* get_preferred_editor(void) { @@ -2567,17 +2623,14 @@ int handle_file_encrypt(void) { snprintf(default_output, sizeof(default_output), "%s.otp", input_file); } - // Ask for output filename with pre-filled default - printf("\nOutput filename [%s]: ", default_output); + // Use enhanced input function for output filename char output_file[512]; - if (!fgets(output_file, sizeof(output_file), stdin)) { + if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) { printf("Error: Failed to read input\n"); return 1; } - output_file[strcspn(output_file, "\n")] = 0; - // Use default if user just pressed Enter - const char* output_filename = (strlen(output_file) > 0) ? output_file : default_output; + const char* output_filename = output_file; return encrypt_file(pad_input, input_file, output_filename, ascii_armor); }