afc link and rename

This commit is contained in:
Jackson Coxson
2025-04-06 14:15:02 -06:00
parent 1a7534a106
commit 3ebf20523d
2 changed files with 80 additions and 0 deletions

View File

@@ -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 {

View File

@@ -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 = ();