/** * Fetch repository calalogues. */ int pkgcli_update(bool force) { const char *packagesite = NULL; const char *repo_name; bool multi_repos = false; struct pkg_config_kv *repokv = NULL; int retcode = EPKG_FATAL; char name[MAXPATHLEN]; if (!quiet) printf("Updating repository catalogue\n"); pkg_config_bool(PKG_CONFIG_MULTIREPOS, &multi_repos); /* single repository */ if (!multi_repos) { /* * Single remote database */ pkg_config_string(PKG_CONFIG_REPO, &packagesite); if (packagesite == NULL) { warnx("PACKAGESITE is not defined."); return (1); } retcode = pkg_update("repo", packagesite, force); if (retcode == EPKG_UPTODATE) { if (!quiet) printf("Repository catalogue is up-to-date, " "no need to fetch fresh copy\n"); retcode = EPKG_OK; } } else { /* multiple repositories */ while (pkg_config_kvlist(PKG_CONFIG_REPOS, &repokv) == EPKG_OK) { repo_name = pkg_config_kv_get(repokv, PKG_CONFIG_KV_KEY); packagesite = pkg_config_kv_get(repokv, PKG_CONFIG_KV_VALUE); snprintf(name, MAXPATHLEN, "repo-%s", repo_name); retcode = pkg_update(name, packagesite, force); if (retcode == EPKG_UPTODATE) { if (!quiet) printf("%s repository catalogue is " "up-to-date, no need to fetch " "fresh copy\n", repo_name); retcode = EPKG_OK; } if (retcode != EPKG_OK) break; } } return (retcode); }
int exec_update(int argc, char **argv) { char url[MAXPATHLEN]; const char *packagesite = NULL; const char *repo_name; struct pkg_config_kv *repokv = NULL; int retcode = EPKG_OK; bool multi_repos = false; (void)argv; if (argc != 1) { usage_update(); return (EX_USAGE); } if (geteuid() != 0) { warnx("updating the remote database can only be done as root"); return (EX_NOPERM); } /* * Fetch remote databases. */ pkg_config_bool(PKG_CONFIG_MULTIREPOS, &multi_repos); /* single repository */ if (!multi_repos) { /* * Single remote database */ pkg_config_string(PKG_CONFIG_REPO, &packagesite); if (packagesite == NULL) { warnx("PACKAGESITE is not defined."); return (1); } if (packagesite[strlen(packagesite) - 1] == '/') snprintf(url, MAXPATHLEN, "%srepo.txz", packagesite); else snprintf(url, MAXPATHLEN, "%s/repo.txz", packagesite); retcode = update_from_remote_repo("repo", url); } else { /* multiple repositories */ while (pkg_config_list(PKG_CONFIG_REPOS, &repokv) == EPKG_OK) { repo_name = pkg_config_kv_get(repokv, PKG_CONFIG_KV_KEY); packagesite = pkg_config_kv_get(repokv, PKG_CONFIG_KV_VALUE); if (packagesite[strlen(packagesite) - 1] == '/') snprintf(url, MAXPATHLEN, "%srepo.txz", packagesite); else snprintf(url, MAXPATHLEN, "%s/repo.txz", packagesite); retcode = update_from_remote_repo(repo_name, url); } } return (retcode); }