dev #1
4
.gitignore
vendored
4
.gitignore
vendored
@ -5,3 +5,7 @@ Cargo.lock
|
|||||||
*.iml
|
*.iml
|
||||||
apt-c/lib.o
|
apt-c/lib.o
|
||||||
apt-c/libapt-c.a
|
apt-c/libapt-c.a
|
||||||
|
|
||||||
|
.clangd
|
||||||
|
compile_commands.json
|
||||||
|
.vscode
|
@ -14,7 +14,11 @@
|
|||||||
|
|
||||||
struct PCache {
|
struct PCache {
|
||||||
// Owned by us.
|
// Owned by us.
|
||||||
|
#ifndef ALT_LINUX
|
||||||
pkgCacheFile *cache_file;
|
pkgCacheFile *cache_file;
|
||||||
|
#else
|
||||||
|
CacheFile *cache_file;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Borrowed from cache_file.
|
// Borrowed from cache_file.
|
||||||
pkgCache *cache;
|
pkgCache *cache;
|
||||||
@ -81,7 +85,11 @@ extern "C" {
|
|||||||
// pkg_iter creation and deletion
|
// pkg_iter creation and deletion
|
||||||
PPkgIterator *pkg_cache_pkg_iter(PCache *cache);
|
PPkgIterator *pkg_cache_pkg_iter(PCache *cache);
|
||||||
PPkgIterator *pkg_cache_find_name(PCache *cache, const char *name);
|
PPkgIterator *pkg_cache_find_name(PCache *cache, const char *name);
|
||||||
|
#ifndef ALT_LINUX
|
||||||
PPkgIterator *pkg_cache_find_name_arch(PCache *cache, const char *name, const char *arch);
|
PPkgIterator *pkg_cache_find_name_arch(PCache *cache, const char *name, const char *arch);
|
||||||
|
#else
|
||||||
|
PPkgIterator *pkg_cache_find_name_arch(PCache *cache, const char *name);
|
||||||
|
#endif
|
||||||
void pkg_iter_release(PPkgIterator *iterator);
|
void pkg_iter_release(PPkgIterator *iterator);
|
||||||
|
|
||||||
// pkg_iter mutation
|
// pkg_iter mutation
|
||||||
@ -94,7 +102,6 @@ extern "C" {
|
|||||||
const char *pkg_iter_current_version(PPkgIterator *iterator);
|
const char *pkg_iter_current_version(PPkgIterator *iterator);
|
||||||
const char *pkg_iter_candidate_version(PPkgIterator *iterator);
|
const char *pkg_iter_candidate_version(PPkgIterator *iterator);
|
||||||
|
|
||||||
|
|
||||||
// ver_iter creation and deletion
|
// ver_iter creation and deletion
|
||||||
PVerIterator *pkg_iter_ver_iter(PPkgIterator *iterator);
|
PVerIterator *pkg_iter_ver_iter(PPkgIterator *iterator);
|
||||||
void ver_iter_release(PVerIterator *iterator);
|
void ver_iter_release(PVerIterator *iterator);
|
||||||
@ -108,7 +115,7 @@ extern "C" {
|
|||||||
const char *ver_iter_section(PVerIterator *iterator);
|
const char *ver_iter_section(PVerIterator *iterator);
|
||||||
const char *ver_iter_arch(PVerIterator *iterator);
|
const char *ver_iter_arch(PVerIterator *iterator);
|
||||||
const char *ver_iter_priority_type(PVerIterator *wrapper);
|
const char *ver_iter_priority_type(PVerIterator *wrapper);
|
||||||
|
|
||||||
#ifndef YE_OLDE_APT
|
#ifndef YE_OLDE_APT
|
||||||
const char *ver_iter_source_package(PVerIterator *iterator);
|
const char *ver_iter_source_package(PVerIterator *iterator);
|
||||||
const char *ver_iter_source_version(PVerIterator *iterator);
|
const char *ver_iter_source_version(PVerIterator *iterator);
|
||||||
@ -163,6 +170,7 @@ extern "C" {
|
|||||||
const char *pkg_file_iter_version(PPkgFileIterator *iterator);
|
const char *pkg_file_iter_version(PPkgFileIterator *iterator);
|
||||||
const char *pkg_file_iter_origin(PPkgFileIterator *iterator);
|
const char *pkg_file_iter_origin(PPkgFileIterator *iterator);
|
||||||
const char *pkg_file_iter_codename(PPkgFileIterator *iterator);
|
const char *pkg_file_iter_codename(PPkgFileIterator *iterator);
|
||||||
|
|
||||||
const char *pkg_file_iter_label(PPkgFileIterator *iterator);
|
const char *pkg_file_iter_label(PPkgFileIterator *iterator);
|
||||||
const char *pkg_file_iter_site(PPkgFileIterator *iterator);
|
const char *pkg_file_iter_site(PPkgFileIterator *iterator);
|
||||||
const char *pkg_file_iter_component(PPkgFileIterator *iterator);
|
const char *pkg_file_iter_component(PPkgFileIterator *iterator);
|
||||||
@ -191,10 +199,38 @@ PCache *pkg_cache_create() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
const char *to_c_string(std::string s);
|
||||||
|
|
||||||
PCache *pkg_cache_create(const bool WithLock, OpProgress &Progress) {
|
#include <unistd.h>
|
||||||
pkgCacheFile *cache_file = new pkgCacheFile(WithLock);
|
bool can_commit() {
|
||||||
pkgCache *cache = cache_file->GetPkgCache(Progress);
|
// Allow user with effective SU to acquire lock
|
||||||
|
return geteuid() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// See ALT's apt/cmdline
|
||||||
|
// Used to print out the progress
|
||||||
|
// Set to stdout for now
|
||||||
|
ostream progress_stream(0);
|
||||||
|
|
||||||
|
PCache *pkg_cache_create() {
|
||||||
|
// Maybe should be set to false sometimes
|
||||||
|
// (Set to can_commit() for now)
|
||||||
|
// We should lock for installation, etc.
|
||||||
|
// For read-only access no locking needed
|
||||||
|
// In apt-shell, WithLock is always set according to (geteuid() == 0).
|
||||||
|
const bool WithLock = can_commit();
|
||||||
|
|
||||||
|
CacheFile *cache_file = new CacheFile(progress_stream, WithLock);
|
||||||
|
cache_file->Open();
|
||||||
|
|
||||||
|
if (cache_file->CheckDeps(true) == false) {
|
||||||
|
delete cache_file;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cast operator from CacheFile to pkgCache*
|
||||||
|
pkgCache *cache = *cache_file;
|
||||||
pkgRecords *records = new pkgRecords(*cache);
|
pkgRecords *records = new pkgRecords(*cache);
|
||||||
|
|
||||||
PCache *ret = new PCache();
|
PCache *ret = new PCache();
|
||||||
@ -289,16 +325,50 @@ const char *pkg_iter_candidate_version(PPkgIterator *wrapper) {
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// const char *pkg_iter_arch(PPkgIterator *wrapper) {
|
const char *pkg_iter_arch(PPkgIterator *wrapper) {
|
||||||
// return wrapper->iterator.Arch();
|
pkgCache::VerIterator it = wrapper->iterator.VersionList();
|
||||||
// }
|
|
||||||
|
|
||||||
// const char *pkg_iter_current_version(PPkgIterator *wrapper) {
|
if (it.end()) {
|
||||||
// return wrapper->iterator.CurVersion();
|
// It's a virtual package
|
||||||
// }
|
// Let's take some of providers and take it's arch
|
||||||
|
pkgCache::PrvIterator provide_list = wrapper->iterator.ProvidesList();
|
||||||
|
if (provide_list.end()) {
|
||||||
|
// Return 'something' in case of broken packages
|
||||||
|
// I would prefer returning nullptr,
|
||||||
|
// but Rust-side requires it to be non-null
|
||||||
|
return to_c_string("Undefined");
|
||||||
|
}
|
||||||
|
pkgCache::PkgIterator provide = provide_list.OwnerPkg();
|
||||||
|
if (provide.end()) {
|
||||||
|
return to_c_string("Undefined");
|
||||||
|
}
|
||||||
|
|
||||||
|
PPkgIterator new_wrapper;
|
||||||
|
new_wrapper.iterator = provide;
|
||||||
|
new_wrapper.cache = wrapper->cache;
|
||||||
|
|
||||||
|
return pkg_iter_arch(&new_wrapper);
|
||||||
|
} else {
|
||||||
|
return it.Arch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *pkg_iter_current_version(PPkgIterator *wrapper) {
|
||||||
|
pkgCache::VerIterator it = wrapper->iterator.CurrentVer();
|
||||||
|
|
||||||
|
if (it.end()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return it.VerStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *pkg_iter_candidate_version(PPkgIterator *wrapper) {
|
||||||
|
// pkgCache::VerIterator it = wrapper->cache->cache_file->GetPolicy(Progress)->GetCandidateVer(wrapper->iterator);
|
||||||
|
// Getting rid of GetPolicy call by creating PkgPolicy object via constructor (no need in OpProgress)
|
||||||
|
// (This is done this way in cmdline apt utility (see ALT's apt/cmdline sources))
|
||||||
|
pkgPolicy plcy(wrapper->cache->cache);
|
||||||
|
pkgCache::VerIterator it = plcy.GetCandidateVer(wrapper->iterator);
|
||||||
|
|
||||||
const char *pkg_iter_candidate_version(PPkgIterator *wrapper, OpProgress &Progress) {
|
|
||||||
pkgCache::VerIterator it = wrapper->cache->cache_file->GetPolicy(Progress)->GetCandidateVer(wrapper->iterator);
|
|
||||||
if (it.end()) {
|
if (it.end()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -360,6 +430,33 @@ int32_t ver_iter_priority(PVerIterator *wrapper) {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ALT_LINUX
|
||||||
|
|
||||||
|
const char *ver_iter_source_package(PVerIterator *wrapper) {
|
||||||
|
pkgRecords *recs = wrapper->cache->records;
|
||||||
|
pkgRecords::Parser &parse = recs->Lookup(wrapper->iterator.FileList());
|
||||||
|
|
||||||
|
// It's okay to return raw pointer to heap memory, due to convention in Rust-caller
|
||||||
|
// (it will be freed by an owning wrapper)
|
||||||
|
return to_c_string(parse.SourcePkg());
|
||||||
|
}
|
||||||
|
|
||||||
|
// SHOULD BE REMOVED FROM ALT'S VERSION! MEANINGLESS!
|
||||||
|
// Apt only works with rpms and not src.rpm
|
||||||
|
const char *ver_iter_source_version(PVerIterator *wrapper) {
|
||||||
|
return wrapper->iterator.VerStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ver_iter_priority(PVerIterator *wrapper) {
|
||||||
|
// return wrapper->cache->cache_file->GetPolicy(Progress)->GetPriority(*wrapper->pkg);
|
||||||
|
// Getting rid of GetPolicy call by creating PkgPolicy object with constructor (no need in OpProgress)
|
||||||
|
// (This is done this way in cmdline apt utility (see ALT's apt/cmdline sources))
|
||||||
|
pkgPolicy plcy(wrapper->cache->cache);
|
||||||
|
|
||||||
|
return plcy.GetPriority(*wrapper->pkg);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *ver_iter_arch(PVerIterator *wrapper) {
|
const char *ver_iter_arch(PVerIterator *wrapper) {
|
||||||
return wrapper->iterator.Arch();
|
return wrapper->iterator.Arch();
|
||||||
}
|
}
|
||||||
@ -449,12 +546,23 @@ const char *ver_file_parser_maintainer(PVerFileParser *parser) {
|
|||||||
#ifndef ALT_LINUX
|
#ifndef ALT_LINUX
|
||||||
|
|
||||||
const char *ver_file_parser_homepage(PVerFileParser *parser) {
|
const char *ver_file_parser_homepage(PVerFileParser *parser) {
|
||||||
std::string hp = parser->parser->Homepage();
|
std::string hp = parser->parser->Homepage();
|
||||||
return to_c_string(hp);
|
return to_c_string(hp);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
// Should be erased from Alt's version or Alt's Apt should provide
|
||||||
|
// functionality for getting homepage address
|
||||||
|
const char *ver_file_parser_homepage(PVerFileParser *parser) {
|
||||||
|
// Unimplementable in ALT via PVerFileParser
|
||||||
|
// Maybe should remove it in ALT version of lib (or just return nullptr)
|
||||||
|
// Not sure in use of nullptr due to possible absense of checks from caller
|
||||||
|
// So return dummy string
|
||||||
|
return to_c_string("Not Specified");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
bool ver_file_iter_end(PVerFileIterator *wrapper) {
|
bool ver_file_iter_end(PVerFileIterator *wrapper) {
|
||||||
return wrapper->iterator.end();
|
return wrapper->iterator.end();
|
||||||
}
|
}
|
||||||
@ -481,9 +589,20 @@ const char *pkg_file_iter_file_name(PPkgFileIterator *wrapper) {
|
|||||||
return wrapper->iterator.FileName();
|
return wrapper->iterator.FileName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ALT_LINUX
|
||||||
const char *pkg_file_iter_archive(PPkgFileIterator *wrapper) {
|
const char *pkg_file_iter_archive(PPkgFileIterator *wrapper) {
|
||||||
return wrapper->iterator.Archive();
|
return wrapper->iterator.Archive();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
const char *pkg_file_iter_archive(PPkgFileIterator *wrapper) {
|
||||||
|
const char *archive = wrapper->iterator.Archive();
|
||||||
|
if (archive == nullptr) {
|
||||||
|
// Should be non-null
|
||||||
|
return to_c_string("Not Specified");
|
||||||
|
}
|
||||||
|
return archive;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *pkg_file_iter_version(PPkgFileIterator *wrapper) {
|
const char *pkg_file_iter_version(PPkgFileIterator *wrapper) {
|
||||||
return wrapper->iterator.Version();
|
return wrapper->iterator.Version();
|
||||||
@ -496,9 +615,16 @@ const char *pkg_file_iter_origin(PPkgFileIterator *wrapper) {
|
|||||||
#ifndef ALT_LINUX
|
#ifndef ALT_LINUX
|
||||||
|
|
||||||
const char *pkg_file_iter_codename(PPkgFileIterator *wrapper) {
|
const char *pkg_file_iter_codename(PPkgFileIterator *wrapper) {
|
||||||
return wrapper->iterator.Codename();
|
return wrapper->iterator.Codename();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
const char *pkg_file_iter_codename(PPkgFileIterator *wrapper) {
|
||||||
|
// From Debian docs:
|
||||||
|
/* "The Codename field shall describe the codename of the release.*/
|
||||||
|
// Analogues in ALT is Branch name.
|
||||||
|
return wrapper->iterator.Label();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *pkg_file_iter_label(PPkgFileIterator *wrapper) {
|
const char *pkg_file_iter_label(PPkgFileIterator *wrapper) {
|
||||||
@ -509,14 +635,37 @@ const char *pkg_file_iter_site(PPkgFileIterator *wrapper) {
|
|||||||
return wrapper->iterator.Site();
|
return wrapper->iterator.Site();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ALT_LINUX
|
||||||
const char *pkg_file_iter_component(PPkgFileIterator *wrapper) {
|
const char *pkg_file_iter_component(PPkgFileIterator *wrapper) {
|
||||||
return wrapper->iterator.Component();
|
return wrapper->iterator.Component();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
const char *pkg_file_iter_component(PPkgFileIterator *wrapper) {
|
||||||
|
const char *component = wrapper->iterator.Component();
|
||||||
|
if (component == nullptr) {
|
||||||
|
// Should be non-null
|
||||||
|
return to_c_string("Not Specified");
|
||||||
|
}
|
||||||
|
return component;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *pkg_file_iter_architecture(PPkgFileIterator *wrapper) {
|
const char *pkg_file_iter_architecture(PPkgFileIterator *wrapper) {
|
||||||
return wrapper->iterator.Architecture();
|
return wrapper->iterator.Architecture();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ALT_LINUX
|
||||||
const char *pkg_file_iter_index_type(PPkgFileIterator *wrapper) {
|
const char *pkg_file_iter_index_type(PPkgFileIterator *wrapper) {
|
||||||
return wrapper->iterator.IndexType();
|
return wrapper->iterator.IndexType();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
const char *pkg_file_iter_index_type(PPkgFileIterator *wrapper) {
|
||||||
|
const char *index_type = wrapper->iterator.IndexType();
|
||||||
|
if (index_type == nullptr) {
|
||||||
|
// Should be non-null
|
||||||
|
return to_c_string("Not Specified");
|
||||||
|
}
|
||||||
|
return index_type;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -35,11 +35,19 @@ extern "C" {
|
|||||||
|
|
||||||
pub fn pkg_cache_pkg_iter(cache: PCache) -> PPkgIterator;
|
pub fn pkg_cache_pkg_iter(cache: PCache) -> PPkgIterator;
|
||||||
pub fn pkg_cache_find_name(cache: PCache, name: *const c_char) -> PPkgIterator;
|
pub fn pkg_cache_find_name(cache: PCache, name: *const c_char) -> PPkgIterator;
|
||||||
|
|
||||||
|
#[cfg(not(feature = "alt-linux"))]
|
||||||
pub fn pkg_cache_find_name_arch(
|
pub fn pkg_cache_find_name_arch(
|
||||||
cache: PCache,
|
cache: PCache,
|
||||||
name: *const c_char,
|
name: *const c_char,
|
||||||
arch: *const c_char,
|
arch: *const c_char,
|
||||||
) -> PPkgIterator;
|
) -> PPkgIterator;
|
||||||
|
#[cfg(feature = "alt-linux")]
|
||||||
|
pub fn pkg_cache_find_name_arch(
|
||||||
|
cache: PCache,
|
||||||
|
name: *const c_char,
|
||||||
|
) -> PPkgIterator;
|
||||||
|
|
||||||
pub fn pkg_iter_release(iterator: PPkgIterator);
|
pub fn pkg_iter_release(iterator: PPkgIterator);
|
||||||
|
|
||||||
pub fn pkg_iter_next(iterator: PPkgIterator);
|
pub fn pkg_iter_next(iterator: PPkgIterator);
|
||||||
|
@ -66,7 +66,13 @@ impl Cache {
|
|||||||
unsafe {
|
unsafe {
|
||||||
let name = ffi::CString::new(name).unwrap();
|
let name = ffi::CString::new(name).unwrap();
|
||||||
let arch = ffi::CString::new(arch).unwrap();
|
let arch = ffi::CString::new(arch).unwrap();
|
||||||
|
|
||||||
|
#[cfg(feature = "alt-linux")]
|
||||||
|
let ptr = raw::pkg_cache_find_name_arch(lock.ptr, name.as_ptr());
|
||||||
|
|
||||||
|
#[cfg(not(feature = "alt-linux"))]
|
||||||
let ptr = raw::pkg_cache_find_name_arch(lock.ptr, name.as_ptr(), arch.as_ptr());
|
let ptr = raw::pkg_cache_find_name_arch(lock.ptr, name.as_ptr(), arch.as_ptr());
|
||||||
|
|
||||||
PkgIterator::new(lock, ptr)
|
PkgIterator::new(lock, ptr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user