Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #![allow(non_upper_case_globals)]
- #![allow(non_camel_case_types)]
- #![allow(non_snake_case)]
- include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
- use std::convert::TryInto;
- use std::ffi::CString;
- use std::os::raw::c_char;
- pub struct Dpkg {
- program_name: *mut c_char,
- root_directory: Option<*mut c_char>,
- }
- impl Dpkg {
- pub fn new(program_name: &str, root_directory: Option<&str>) -> Dpkg {
- let dpkg = Dpkg {
- program_name: CString::new(program_name).unwrap().into_raw(),
- root_directory: match root_directory {
- Some(dir) => Some(CString::new(dir).unwrap().into_raw()),
- None => None,
- },
- };
- unsafe {
- dpkg_set_progname(dpkg.program_name);
- push_error_context();
- if let Some(dir) = dpkg.root_directory {
- dpkg_db_set_dir(dir);
- }
- modstatdb_init();
- modstatdb_open(modstatdb_rw_msdbrw_available_readonly);
- }
- dpkg
- }
- }
- impl Drop for Dpkg {
- fn drop(&mut self) {
- unsafe {
- pkg_db_reset();
- modstatdb_done();
- modstatdb_shutdown();
- pop_error_context(ehflag_normaltidy.try_into().unwrap());
- let _ = CString::from_raw(self.program_name);
- if let Some(dir) = self.root_directory {
- let _ = CString::from_raw(dir);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement