Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. #![allow(non_upper_case_globals)]
  2. #![allow(non_camel_case_types)]
  3. #![allow(non_snake_case)]
  4.  
  5. include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
  6.  
  7. use std::convert::TryInto;
  8. use std::ffi::CString;
  9. use std::os::raw::c_char;
  10.  
  11. pub struct Dpkg {
  12. program_name: *mut c_char,
  13. root_directory: Option<*mut c_char>,
  14. }
  15.  
  16. impl Dpkg {
  17. pub fn new(program_name: &str, root_directory: Option<&str>) -> Dpkg {
  18. let dpkg = Dpkg {
  19. program_name: CString::new(program_name).unwrap().into_raw(),
  20. root_directory: match root_directory {
  21. Some(dir) => Some(CString::new(dir).unwrap().into_raw()),
  22. None => None,
  23. },
  24. };
  25.  
  26. unsafe {
  27. dpkg_set_progname(dpkg.program_name);
  28. push_error_context();
  29.  
  30. if let Some(dir) = dpkg.root_directory {
  31. dpkg_db_set_dir(dir);
  32. }
  33. modstatdb_init();
  34. modstatdb_open(modstatdb_rw_msdbrw_available_readonly);
  35. }
  36.  
  37. dpkg
  38. }
  39. }
  40.  
  41. impl Drop for Dpkg {
  42. fn drop(&mut self) {
  43. unsafe {
  44. pkg_db_reset();
  45. modstatdb_done();
  46. modstatdb_shutdown();
  47.  
  48. pop_error_context(ehflag_normaltidy.try_into().unwrap());
  49.  
  50. let _ = CString::from_raw(self.program_name);
  51. if let Some(dir) = self.root_directory {
  52. let _ = CString::from_raw(dir);
  53. }
  54.  
  55. }
  56. }
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement