diff --git a/include/libflashrom.h b/include/libflashrom.h index b9b0d1708..f30ad6b2d 100644 --- a/include/libflashrom.h +++ b/include/libflashrom.h @@ -193,6 +193,14 @@ struct flashrom_chipset_info { * @return flashrom version */ const char *flashrom_version_info(void); +/** + * @brief Returns list of supported programmers + * The last entry in the returned list is followed by a NULL. + * + * @return List of supported programmers, or NULL if an error occurred. + * The pointer must be freed after using flashrom_data_free + */ +const char **flashrom_supported_programmers(void); /** * @brief Returns list of supported flash chips * @return List of supported flash chips, or NULL if an error occurred diff --git a/libflashrom.c b/libflashrom.c index 888ca05b3..d6bd09828 100644 --- a/libflashrom.c +++ b/libflashrom.c @@ -194,6 +194,18 @@ const char *flashrom_version_info(void) return flashrom_version; } +const char **flashrom_supported_programmers(void) +{ + const char **result = malloc(sizeof(char*) * (programmer_table_size + 1)); + if (!result) + return NULL; + for (unsigned int i = 0; i < programmer_table_size; ++i) { + result[i] = programmer_table[i]->name; + } + result[programmer_table_size] = 0; + return result; +} + struct flashrom_flashchip_info *flashrom_supported_flash_chips(void) { struct flashrom_flashchip_info *supported_flashchips = diff --git a/libflashrom.map b/libflashrom.map index a12a95c43..fc6724ad0 100644 --- a/libflashrom.map +++ b/libflashrom.map @@ -32,6 +32,7 @@ LIBFLASHROM_1.0 { flashrom_supported_boards; flashrom_supported_chipsets; flashrom_supported_flash_chips; + flashrom_supported_programmers; flashrom_version_info; flashrom_wp_cfg_new; flashrom_wp_cfg_release; diff --git a/tests/libflashrom.c b/tests/libflashrom.c index 3320597cf..59ffeafd3 100644 --- a/tests/libflashrom.c +++ b/tests/libflashrom.c @@ -1,7 +1,7 @@ /* * This file is part of the flashrom project. * - * Copyright 2025 Dmitry Zhadinets (dzhadinets@gmail.com) + * Copyright 2025 Dmitry Zhadinets * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -96,4 +96,21 @@ void flashrom_set_log_level_test_success(void **state) /* check that callback is called after the change*/ assert_int_equal(print(FLASHROM_MSG_INFO, "1%s", "\n"), 0x666 + (int)FLASHROM_MSG_INFO); flashrom_set_log_callback(NULL); -} \ No newline at end of file +} + +void flashrom_supported_programmers_test_success(void **state) +{ + (void) state; /* unused */ + const char **array = flashrom_supported_programmers(); + const char **ptr = array; + + assert_non_null(array); + + do { + assert_non_null(*ptr); + }while (*(++ptr)); + + flashrom_data_free(array); + + assert_int_not_equal(ptr - array, 0); +} diff --git a/tests/tests.c b/tests/tests.c index ef719675b..2a79d327d 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -482,6 +482,7 @@ int main(int argc, char *argv[]) cmocka_unit_test(flashrom_set_log_callback_test_success), cmocka_unit_test(flashrom_set_log_callback_v2_test_success), cmocka_unit_test(flashrom_set_log_level_test_success), + cmocka_unit_test(flashrom_supported_programmers_test_success), }; ret |= cmocka_run_group_tests_name("libflashrom.c tests", libflashrom_tests, NULL, NULL); diff --git a/tests/tests.h b/tests/tests.h index e358e86b8..e87c00ca6 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -35,6 +35,7 @@ void flashbuses_to_text_test_success(void **state); void flashrom_set_log_callback_test_success(void **state); void flashrom_set_log_callback_v2_test_success(void **state); void flashrom_set_log_level_test_success(void **state); +void flashrom_supported_programmers_test_success(void **state); /* spi25.c */ void spi_write_enable_test_success(void **state);