static int opkg_download_cache(const char *src, const char *dest_file_name, curl_progress_func cb, void *data) { char *cache_name = xstrdup(src); char *cache_location, *p; int err = 0; if (!conf->cache || str_starts_with(src, "file:")) { err = opkg_download(src, dest_file_name, cb, data, 0); goto out1; } if(!file_is_dir(conf->cache)){ opkg_msg(ERROR, "%s is not a directory.\n", conf->cache); err = 1; goto out1; } for (p = cache_name; *p; p++) if (*p == '/') *p = ','; /* looks nicer than | or # */ sprintf_alloc(&cache_location, "%s/%s", conf->cache, cache_name); if (file_exists(cache_location)) opkg_msg(NOTICE, "Copying %s.\n", cache_location); else { /* cache file with funky name not found, try simple name */ free(cache_name); char *filename = strrchr(dest_file_name,'/'); if (filename) cache_name = xstrdup(filename+1); // strip leading '/' else cache_name = xstrdup(dest_file_name); free(cache_location); sprintf_alloc(&cache_location, "%s/%s", conf->cache, cache_name); if (file_exists(cache_location)) opkg_msg(NOTICE, "Copying %s.\n", cache_location); else { err = opkg_download(src, cache_location, cb, data, 0); if (err) { (void) unlink(cache_location); goto out2; } } } err = file_copy(cache_location, dest_file_name); out2: free(cache_location); out1: free(cache_name); return err; }
int pkg_src_download_signature(pkg_src_t * src) { int err = 0; char *url; char *sigfile; const char *sigext; if (strcmp(opkg_config->signature_type, "gpg-asc") == 0) sigext = "asc"; else sigext = "sig"; sprintf_alloc(&sigfile, "%s/%s.%s", opkg_config->lists_dir, src->name, sigext); /* get the url for the sig file */ if (src->extra_data) /* debian style? */ sprintf_alloc(&url, "%s/%s/Packages.%s", src->value, src->extra_data, sigext); else sprintf_alloc(&url, "%s/Packages.%s", src->value, sigext); err = opkg_download(url, sigfile, NULL, NULL); if (err) { opkg_msg(ERROR, "Failed to download signature for %s.\n", src->name); goto cleanup; } opkg_msg(DEBUG, "Downloaded signature for %s.\n", src->name); cleanup: free(sigfile); free(url); return err; }
/* * Downloads file from url, installs in package database, return package name. */ int opkg_prepare_url_for_install(const char *url, char **namep) { int err = 0; pkg_t *pkg; pkg = pkg_new(); if (str_starts_with(url, "http://") || str_starts_with(url, "ftp://")) { char *tmp_file; char *file_basec = xstrdup(url); char *file_base = basename(file_basec); sprintf_alloc(&tmp_file, "%s/%s", conf->tmp_dir, file_base); err = opkg_download(url, tmp_file, NULL, NULL, 0); if (err) return err; err = pkg_init_from_file(pkg, tmp_file); if (err) return err; free(tmp_file); free(file_basec); } else if (strcmp(&url[strlen(url) - 4], OPKG_PKG_EXTENSION) == 0 || strcmp(&url[strlen(url) - 4], IPKG_PKG_EXTENSION) == 0 || strcmp(&url[strlen(url) - 4], DPKG_PKG_EXTENSION) == 0) { err = pkg_init_from_file(pkg, url); if (err) return err; opkg_msg(DEBUG2, "Package %s provided by hand (%s).\n", pkg->name, pkg->local_filename); pkg->provided_by_hand = 1; } else { pkg_deinit(pkg); free(pkg); return 0; } pkg->dest = conf->default_dest; pkg->state_want = SW_INSTALL; pkg->state_flag |= SF_PREFER; hash_insert_pkg(pkg, 1); if (namep) { *namep = pkg->name; } return 0; }
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; }