opkg: adding repository check function
authorticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Mon, 15 Dec 2008 05:23:29 +0000 (05:23 +0000)
committerticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Mon, 15 Dec 2008 05:23:29 +0000 (05:23 +0000)
git-svn-id: http://opkg.googlecode.com/svn/trunk@136 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358

libopkg/opkg.c
libopkg/opkg.h
tests/libopkg_test.c

index 9f081cf3937ad5b953d0989d98fd96e9e4a286c7..8841b50f40fcf53e8f5734a75a15ced90bf9f069 100644 (file)
@@ -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;
+}
index 36da8cfa4d55a23c7d1c18fc96c1b638db26d9e8..970590c64ea60f6af534b41981030f1b0a3bc220 100644 (file)
@@ -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 */
index bf2cff9c18207ce01c10513f36a5340144878b63..bee39681ee09ccd8b6d0c3f2d548d05469bde725 100644 (file)
@@ -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]);