summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libopkg/opkg.c65
-rw-r--r--libopkg/opkg.h1
-rw-r--r--tests/libopkg_test.c15
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 <curl/curl.h>
+/**
+ * @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]);