mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-01-05 04:34:09 +00:00
106 lines
2.8 KiB
Rust
106 lines
2.8 KiB
Rust
// Copyright 2015, Igor Shaula
|
|
// Licensed under the MIT License <LICENSE or
|
|
// http://opensource.org/licenses/MIT>. This file
|
|
// may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
//! Structure for a registry transaction.
|
|
//! Part of `transactions` feature.
|
|
//!
|
|
//!```no_run
|
|
//!extern crate winreg;
|
|
//!use std::io;
|
|
//!use winreg::RegKey;
|
|
//!use winreg::enums::*;
|
|
//!use winreg::transaction::Transaction;
|
|
//!
|
|
//!fn main() {
|
|
//! let t = Transaction::new().unwrap();
|
|
//! let hkcu = RegKey::predef(HKEY_CURRENT_USER);
|
|
//! let (key, _disp) = hkcu.create_subkey_transacted("Software\\RustTransaction", &t).unwrap();
|
|
//! key.set_value("TestQWORD", &1234567891011121314u64).unwrap();
|
|
//! key.set_value("TestDWORD", &1234567890u32).unwrap();
|
|
//!
|
|
//! println!("Commit transaction? [y/N]:");
|
|
//! let mut input = String::new();
|
|
//! io::stdin().read_line(&mut input).unwrap();
|
|
//! input = input.trim_right().to_owned();
|
|
//! if input == "y" || input == "Y" {
|
|
//! t.commit().unwrap();
|
|
//! println!("Transaction committed.");
|
|
//! }
|
|
//! else {
|
|
//! // this is optional, if transaction wasn't committed,
|
|
//! // it will be rolled back on disposal
|
|
//! t.rollback().unwrap();
|
|
//!
|
|
//! println!("Transaction wasn't committed, it will be rolled back.");
|
|
//! }
|
|
//!}
|
|
//!```
|
|
#![cfg(feature = "transactions")]
|
|
use std::io;
|
|
use std::ptr;
|
|
use winapi::um::handleapi;
|
|
use winapi::um::ktmw32;
|
|
use winapi::um::winnt;
|
|
|
|
#[derive(Debug)]
|
|
pub struct Transaction {
|
|
pub handle: winnt::HANDLE,
|
|
}
|
|
|
|
impl Transaction {
|
|
//TODO: add arguments
|
|
pub fn new() -> io::Result<Transaction> {
|
|
unsafe {
|
|
let handle = ktmw32::CreateTransaction(
|
|
ptr::null_mut(),
|
|
ptr::null_mut(),
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
ptr::null_mut(),
|
|
);
|
|
if handle == handleapi::INVALID_HANDLE_VALUE {
|
|
return Err(io::Error::last_os_error());
|
|
};
|
|
Ok(Transaction { handle })
|
|
}
|
|
}
|
|
|
|
pub fn commit(&self) -> io::Result<()> {
|
|
unsafe {
|
|
match ktmw32::CommitTransaction(self.handle) {
|
|
0 => Err(io::Error::last_os_error()),
|
|
_ => Ok(()),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn rollback(&self) -> io::Result<()> {
|
|
unsafe {
|
|
match ktmw32::RollbackTransaction(self.handle) {
|
|
0 => Err(io::Error::last_os_error()),
|
|
_ => Ok(()),
|
|
}
|
|
}
|
|
}
|
|
|
|
fn close_(&mut self) -> io::Result<()> {
|
|
unsafe {
|
|
match handleapi::CloseHandle(self.handle) {
|
|
0 => Err(io::Error::last_os_error()),
|
|
_ => Ok(()),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Drop for Transaction {
|
|
fn drop(&mut self) {
|
|
self.close_().unwrap_or(());
|
|
}
|
|
}
|