#############################################################################*/
#include <errno.h>
+#include <linux/limits.h>
#include <stdlib.h>
#include <solv/queue.h>
# include <solv/solverdebug.h>
#endif
+#include <pakfire/archive.h>
#include <pakfire/logging.h>
#include <pakfire/package.h>
#include <pakfire/pakfire.h>
return pakfire_transaction_create(request->pakfire, request->transaction);
}
+static int pakfire_request_is_file(const char* what) {
+ return pakfire_string_endswith(what, ".pfm");
+}
+
+static int pakfire_request_is_url(const char* what) {
+ static const char* known_schemas[] = {
+ "https://",
+ "http://",
+ "file://",
+ NULL,
+ };
+
+ for (const char** schema = known_schemas; *schema; schema++) {
+ if (pakfire_string_startswith(what, *schema))
+ return 1;
+ }
+
+ return 0;
+}
+
static int pakfire_request_add_package(struct pakfire_request* request, int action,
PakfirePackage pkg, int flags) {
// Get the solvable ID
return 0;
}
+static int pakfire_request_add_archive(struct pakfire_request* request, int action,
+ PakfireArchive archive, int extra_flags) {
+ PakfireRepo repo = pakfire_repo_create(request->pakfire, "@commandline");
+ if (!repo)
+ return 1;
+
+ // Add it to the repository
+ PakfirePackage pkg = pakfire_repo_add_archive(repo, archive);
+ if (!pkg)
+ goto ERROR;
+
+ int r = pakfire_request_add_package(request, action, pkg, extra_flags);
+ if (r)
+ goto ERROR;
+
+ // Success
+ r = 0;
+
+ERROR:
+ if (pkg)
+ pakfire_package_unref(pkg);
+ pakfire_repo_unref(repo);
+
+ return r;
+}
+
+static int pakfire_request_add_file(struct pakfire_request* request, int action,
+ const char* path, int extra_flags) {
+ PakfireArchive archive;
+
+ // Open the archive
+ int r = pakfire_archive_open(&archive, request->pakfire, path);
+ if (r)
+ goto ERROR;
+
+ // Add it to the request
+ r = pakfire_request_add_archive(request, action, archive, extra_flags);
+ if (r)
+ goto ERROR;
+
+ // Success
+ r = 0;
+
+ERROR:
+ pakfire_archive_unref(archive);
+
+ return r;
+}
+
+static int pakfire_request_add_url(struct pakfire_request* request, int action,
+ const char* url, int extra_flags) {
+ struct pakfire_downloader* downloader;
+ char path[PATH_MAX] = PAKFIRE_CACHE_PATH "/tmp/XXXXXX";
+
+ // Allocate a temporary file name
+ FILE* f = pakfire_mktemp(path);
+ if (!f)
+ return 1;
+
+ // Create a downloader
+ int r = pakfire_downloader_create(&downloader, request->pakfire);
+ if (r)
+ return r;
+
+ // Download the file
+ r = pakfire_downloader_retrieve(downloader, NULL, NULL, NULL,
+ url, path, PAKFIRE_TRANSFER_NOTEMP);
+ if (r)
+ goto ERROR;
+
+ // Try adding the archive
+ r = pakfire_request_add_file(request, action, path, extra_flags);
+ if (r)
+ goto ERROR;
+
+ // Success
+ r = 0;
+
+ERROR:
+ if (f)
+ fclose(f);
+ pakfire_downloader_unref(downloader);
+
+ return r;
+}
+
+static int pakfire_request_add(struct pakfire_request* request, int action,
+ const char* what, int extra_flags) {
+ // Download and add any remote files
+ if (pakfire_request_is_url(what))
+ return pakfire_request_add_url(request, action, what, extra_flags);
+
+ // Add any local files
+ if (pakfire_request_is_file(what))
+ return pakfire_request_add_file(request, action, what, extra_flags);
+
+ // Add anything else as a job
+ return pakfire_request_add_job(request, action, what, extra_flags);
+}
+
PAKFIRE_EXPORT int pakfire_request_install(struct pakfire_request* request, const char* what) {
- return pakfire_request_add_job(request, SOLVER_INSTALL, what, 0);
+ return pakfire_request_add(request, SOLVER_INSTALL, what, 0);
}
PAKFIRE_EXPORT int pakfire_request_install_package(
}
PAKFIRE_EXPORT int pakfire_request_erase(struct pakfire_request* request, const char* what, int flags) {
- return pakfire_request_add_job(request, SOLVER_ERASE, what, erase_flags(flags));
+ return pakfire_request_add(request, SOLVER_ERASE, what, erase_flags(flags));
}
PAKFIRE_EXPORT int pakfire_request_erase_package(
}
PAKFIRE_EXPORT int pakfire_request_upgrade(struct pakfire_request* request, const char* what) {
- return pakfire_request_add_job(request, SOLVER_UPDATE, what, 0);
+ return pakfire_request_add(request, SOLVER_UPDATE, what, 0);
}
PAKFIRE_EXPORT int pakfire_request_upgrade_package(
}
PAKFIRE_EXPORT int pakfire_request_lock(struct pakfire_request* request, const char* what) {
- return pakfire_request_add_job(request, SOLVER_LOCK, what, 0);
+ return pakfire_request_add(request, SOLVER_LOCK, what, 0);
}
PAKFIRE_EXPORT int pakfire_request_lock_package(struct pakfire_request* request, PakfirePackage package) {