diff --git a/TODO.md b/TODO.md index e3b4174..140f19c 100644 --- a/TODO.md +++ b/TODO.md @@ -22,3 +22,5 @@ Or, better yet, assume the offset is a very large size, and use the pad itself t ## Setup for multiple USB drives +## Change back in pad menu to exit + diff --git a/otp.c b/otp.c index 6b630e0..5a56b19 100644 --- a/otp.c +++ b/otp.c @@ -2668,8 +2668,21 @@ int load_preferences(void) { while ((entry = readdir(dir)) != NULL && !found_pad) { if (strstr(entry->d_name, ".pad") && strlen(entry->d_name) == 68) { - // Found a pad file - construct full path - snprintf(first_pad_path, sizeof(first_pad_path), "%s/%s", current_pads_dir, entry->d_name); + // Found a pad file - construct full absolute path + char absolute_path[1024]; + if (current_pads_dir[0] == '/') { + // Already absolute path + snprintf(first_pad_path, sizeof(first_pad_path), "%s/%s", current_pads_dir, entry->d_name); + } else { + // Relative path - make it absolute + char current_dir[512]; + if (getcwd(current_dir, sizeof(current_dir))) { + snprintf(first_pad_path, sizeof(first_pad_path), "%s/%s/%s", current_dir, current_pads_dir, entry->d_name); + } else { + // Fallback to relative path + snprintf(first_pad_path, sizeof(first_pad_path), "%s/%s", current_pads_dir, entry->d_name); + } + } strncpy(default_pad_path, first_pad_path, sizeof(default_pad_path) - 1); default_pad_path[sizeof(default_pad_path) - 1] = '\0'; found_pad = 1; @@ -2783,7 +2796,29 @@ char* get_default_pad_path(void) { } int set_default_pad_path(const char* pad_path) { - return set_preference("default_pad", pad_path); + if (!pad_path) { + return set_preference("default_pad", NULL); + } + + // Ensure we store the full absolute path + char absolute_path[1024]; + if (pad_path[0] == '/') { + // Already absolute path + strncpy(absolute_path, pad_path, sizeof(absolute_path) - 1); + absolute_path[sizeof(absolute_path) - 1] = '\0'; + } else { + // Relative path - make it absolute + char current_dir[512]; + if (getcwd(current_dir, sizeof(current_dir))) { + snprintf(absolute_path, sizeof(absolute_path), "%s/%s", current_dir, pad_path); + } else { + // Fallback to using the path as-is if getcwd fails + strncpy(absolute_path, pad_path, sizeof(absolute_path) - 1); + absolute_path[sizeof(absolute_path) - 1] = '\0'; + } + } + + return set_preference("default_pad", absolute_path); } // OTP thumb drive detection function implementation @@ -3602,6 +3637,7 @@ int handle_pads_menu(void) { printf("\nActions:\n"); printf(" \033[4mG\033[0menerate new pad\n"); + printf(" \033[4mS\033[0met default pad\n"); printf(" \033[4mB\033[0mack to main menu\n"); printf("\nSelect pad (by prefix) or action: "); @@ -3620,6 +3656,59 @@ int handle_pads_menu(void) { return handle_pads_menu(); } return result; + } else if (toupper(input[0]) == 'S') { + // Set default pad + printf("\nSelect pad to set as default (by prefix): "); + char pad_input[MAX_HASH_LENGTH]; + if (!fgets(pad_input, sizeof(pad_input), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + pad_input[strcspn(pad_input, "\n")] = 0; + + // Find matching pad by prefix using the same logic as pad selection + int matched_pad = -1; + int match_count = 0; + + for (int i = 0; i < pad_count; i++) { + if (strncmp(pad_input, pads[i].chksum, strlen(pad_input)) == 0) { + matched_pad = i; + match_count++; + } + } + + if (match_count == 0) { + printf("No pad found matching prefix '%s'\n", pad_input); + return handle_pads_menu(); + } else if (match_count > 1) { + printf("Ambiguous prefix. Multiple matches found.\n"); + return handle_pads_menu(); + } + + // Construct the full absolute pad path and set as default + char new_default_path[1024]; + if (current_pads_dir[0] == '/') { + // Already absolute path + snprintf(new_default_path, sizeof(new_default_path), "%s/%s.pad", current_pads_dir, pads[matched_pad].chksum); + } else { + // Relative path - make it absolute + char current_dir[512]; + if (getcwd(current_dir, sizeof(current_dir))) { + snprintf(new_default_path, sizeof(new_default_path), "%s/%s/%s.pad", current_dir, current_pads_dir, pads[matched_pad].chksum); + } else { + // Fallback to relative path + snprintf(new_default_path, sizeof(new_default_path), "%s/%s.pad", current_pads_dir, pads[matched_pad].chksum); + } + } + + if (set_default_pad_path(new_default_path) == 0) { + printf("Default pad set to: %.16s...\n", pads[matched_pad].chksum); + printf("Full path: %s\n", new_default_path); + } else { + printf("Error: Failed to update default pad preference\n"); + } + + return handle_pads_menu(); } else if (toupper(input[0]) == 'B') { return 0; // Back to main menu }