From 6a36527ec6863a6fe0f4019691fe70d3e78774a5 Mon Sep 17 00:00:00 2001 From: ticktock35 Date: Mon, 15 Dec 2008 05:23:29 +0000 Subject: [PATCH] opkg: adding repository check function git-svn-id: http://opkg.googlecode.com/svn/trunk@136 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- libopkg/opkg.c | 65 ++++++++++++++++++++++++++++++++++++++++++++ libopkg/opkg.h | 1 + tests/libopkg_test.c | 15 ++++++++-- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/libopkg/opkg.c b/libopkg/opkg.c index 9f081cf..8841b50 100644 --- a/libopkg/opkg.c +++ b/libopkg/opkg.c @@ -1008,3 +1008,68 @@ opkg_find_package (opkg_t *opkg, const char *name, const char *ver, const char * return package; } + +#include +/** + * @brief Check the accessibility of repositories. It will try to access the repository to check if the respository is accessible throught current network status. + * @param opkg The opkg_t + * @return return how many repositories cannot access. 0 means all okay. + */ +int opkg_repository_accessibility_check(opkg_t *opkg) +{ + pkg_src_list_elt_t *iter; + str_list_elt_t *iter1; + str_list_t *src; + int repositories=0; + int ret=0; + int err; + char *repo_ptr; + char *stmp; + opkg_assert(opkg != NULL); + + src = str_list_alloc(); + + for (iter = opkg->conf->pkg_src_list.head; iter; iter = iter->next) + { + if (strstr(iter->data->value, "://") && + index(strstr(iter->data->value, "://") + 3, '/')) + stmp = strndup(iter->data->value, + (index(strstr(iter->data->value, "://") + 3, '/') - iter->data->value)*sizeof(char)); + + else + stmp = strdup(iter->data->value); + + for (iter1 = src->head; iter1; iter1 = iter1->next) + { + if (strstr(iter1->data, stmp)) + break; + } + if (iter1) + continue; + + sprintf_alloc(&repo_ptr, "%s/index.html",stmp); + free(stmp); + + str_list_append(src, repo_ptr); + repositories++; + } + while (repositories > 0) + { + iter1 = str_list_pop(src); + repositories--; + + err = opkg_download(opkg->conf, iter1->data, "/dev/null", NULL, NULL); + if (!(err == CURLE_OK || + err == CURLE_HTTP_RETURNED_ERROR || + err == CURLE_FILE_COULDNT_READ_FILE || + err == CURLE_REMOTE_FILE_NOT_FOUND || + err == CURLE_TFTP_NOTFOUND + )) { + ret++; + } + str_list_elt_deinit(iter1); + free(iter1); + } + free(src); + return ret; +} diff --git a/libopkg/opkg.h b/libopkg/opkg.h index 36da8cf..970590c 100644 --- a/libopkg/opkg.h +++ b/libopkg/opkg.h @@ -85,5 +85,6 @@ int opkg_list_packages (opkg_t *opkg, opkg_package_callback_t callback, void *us int opkg_list_upgradable_packages (opkg_t *opkg, opkg_package_callback_t callback, void *user_data); opkg_package_t* opkg_find_package (opkg_t *opkg, const char *name, const char *version, const char *architecture, const char *repository); +int opkg_repository_accessibility_check(opkg_t *opkg); #endif /* OPKG_H */ diff --git a/tests/libopkg_test.c b/tests/libopkg_test.c index bf2cff9..bee3968 100644 --- a/tests/libopkg_test.c +++ b/tests/libopkg_test.c @@ -148,6 +148,7 @@ main (int argc, char **argv) "\tlist all - List all available packages\n" "\tlist installed - List all the installed packages\n" "\tremove [package] - Remove the specified package\n" + "\trping - Reposiroties ping, check the accessibility of repositories\n" "\ttest - Run test script\n" , basename (argv[0])); exit (0); @@ -229,9 +230,17 @@ main (int argc, char **argv) break; case 'r': - err = opkg_remove_package (opkg, argv[2], progress_callback, "Removing..."); - printf ("\nopkg_remove_package returned %d (%s)\n", err, errors[err]); - break; + if (argv[1][1] == 'e') + { + err = opkg_remove_package (opkg, argv[2], progress_callback, "Removing..."); + printf ("\nopkg_remove_package returned %d (%s)\n", err, errors[err]); + break; + }else if (argv[1][1] == 'p') + { + err = opkg_repository_accessibility_check(opkg); + printf("\nopkg_repository_accessibility_check returned (%d)\n", err); + break; + } default: printf ("Unknown command \"%s\"\n", argv[1]); -- 2.30.2