mirror of
https://github.com/jkcoxson/idevice.git
synced 2026-03-02 14:36:16 +01:00
afc link and rename
This commit is contained in:
@@ -370,6 +370,80 @@ impl AfcClient {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn link(
|
||||||
|
&mut self,
|
||||||
|
target: impl Into<String>,
|
||||||
|
source: impl Into<String>,
|
||||||
|
kind: opcode::LinkType,
|
||||||
|
) -> Result<(), IdeviceError> {
|
||||||
|
let target = target.into();
|
||||||
|
let source = source.into();
|
||||||
|
|
||||||
|
let mut header_payload = (kind as u64).to_le_bytes().to_vec();
|
||||||
|
header_payload.extend(target.as_bytes());
|
||||||
|
header_payload.push(0);
|
||||||
|
header_payload.extend(source.as_bytes());
|
||||||
|
header_payload.push(0);
|
||||||
|
|
||||||
|
let header_len = header_payload.len() as u64 + AfcPacketHeader::LEN;
|
||||||
|
|
||||||
|
let header = AfcPacketHeader {
|
||||||
|
magic: MAGIC,
|
||||||
|
entire_len: header_len,
|
||||||
|
header_payload_len: header_len,
|
||||||
|
packet_num: self.package_number,
|
||||||
|
operation: AfcOpcode::MakeLink,
|
||||||
|
};
|
||||||
|
self.package_number += 1;
|
||||||
|
|
||||||
|
let packet = AfcPacket {
|
||||||
|
header,
|
||||||
|
header_payload,
|
||||||
|
payload: Vec::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
self.send(packet).await?;
|
||||||
|
self.read().await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn rename(
|
||||||
|
&mut self,
|
||||||
|
source: impl Into<String>,
|
||||||
|
target: impl Into<String>,
|
||||||
|
) -> Result<(), IdeviceError> {
|
||||||
|
let target = target.into();
|
||||||
|
let source = source.into();
|
||||||
|
|
||||||
|
let mut header_payload = source.as_bytes().to_vec();
|
||||||
|
header_payload.push(0);
|
||||||
|
header_payload.extend(target.as_bytes());
|
||||||
|
header_payload.push(0);
|
||||||
|
|
||||||
|
let header_len = header_payload.len() as u64 + AfcPacketHeader::LEN;
|
||||||
|
|
||||||
|
let header = AfcPacketHeader {
|
||||||
|
magic: MAGIC,
|
||||||
|
entire_len: header_len,
|
||||||
|
header_payload_len: header_len,
|
||||||
|
packet_num: self.package_number,
|
||||||
|
operation: AfcOpcode::RenamePath,
|
||||||
|
};
|
||||||
|
self.package_number += 1;
|
||||||
|
|
||||||
|
let packet = AfcPacket {
|
||||||
|
header,
|
||||||
|
header_payload,
|
||||||
|
payload: Vec::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
self.send(packet).await?;
|
||||||
|
self.read().await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn read(&mut self) -> Result<AfcPacket, IdeviceError> {
|
pub async fn read(&mut self) -> Result<AfcPacket, IdeviceError> {
|
||||||
let res = AfcPacket::read(&mut self.idevice).await?;
|
let res = AfcPacket::read(&mut self.idevice).await?;
|
||||||
if res.header.operation == AfcOpcode::Status {
|
if res.header.operation == AfcOpcode::Status {
|
||||||
|
|||||||
@@ -45,6 +45,12 @@ pub enum AfcFopenMode {
|
|||||||
RdAppend = 0x00000006, // a+ O_RDWR | O_APPEND | O_CREAT
|
RdAppend = 0x00000006, // a+ O_RDWR | O_APPEND | O_CREAT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(u64)]
|
||||||
|
pub enum LinkType {
|
||||||
|
Hardlink = 0x00000001,
|
||||||
|
Symlink = 0x00000002,
|
||||||
|
}
|
||||||
|
|
||||||
impl TryFrom<u64> for AfcOpcode {
|
impl TryFrom<u64> for AfcOpcode {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user