int pkg_src_download(pkg_src_t * src) { int err = 0; char *url; char *feed; const char *url_filename; sprintf_alloc(&feed, "%s/%s", opkg_config->lists_dir, src->name); url_filename = src->gzip ? "Packages.gz" : "Packages"; if (src->extra_data) /* debian style? */ sprintf_alloc(&url, "%s/%s/%s", src->value, src->extra_data, url_filename); else sprintf_alloc(&url, "%s/%s", src->value, url_filename); if (src->gzip) { char *cache_location; cache_location = opkg_download_cache(url, NULL, NULL); if (!cache_location) { err = -1; goto cleanup; } err = file_decompress(cache_location, feed); free(cache_location); if (err) { opkg_msg(ERROR, "Couldn't decompress feed for source %s.", src->name); goto cleanup; } } else { err = opkg_download(url, feed, NULL, NULL); if (err) goto cleanup; } opkg_msg(DEBUG, "Downloaded package list for %s.\n", src->name); cleanup: free(feed); free(url); return err; }
int opkg_download_pkg(pkg_t *pkg, const char *dir) { int err; char *url; char *stripped_filename; if (pkg->src == NULL) { opkg_msg(ERROR, "Package %s is not available from any configured src.\n", pkg->name); return -1; } if (pkg->filename == NULL) { opkg_msg(ERROR, "Package %s does not have a valid filename field.\n", pkg->name); return -1; } sprintf_alloc(&url, "%s/%s", pkg->src->value, pkg->filename); /* The pkg->filename might be something like "../../foo.opk". While this is correct, and exactly what we want to use to construct url above, here we actually need to use just the filename part, without any directory. */ stripped_filename = strrchr(pkg->filename, '/'); if ( ! stripped_filename ) stripped_filename = pkg->filename; sprintf_alloc(&pkg->local_filename, "%s/%s", dir, stripped_filename); err = opkg_download_cache(url, pkg->local_filename, NULL, NULL); free(url); return err; }