diff --git a/idevice/src/afc/mod.rs b/idevice/src/afc/mod.rs index bc04af3..69babdb 100644 --- a/idevice/src/afc/mod.rs +++ b/idevice/src/afc/mod.rs @@ -370,6 +370,80 @@ impl AfcClient { }) } + pub async fn link( + &mut self, + target: impl Into, + source: impl Into, + 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, + target: impl Into, + ) -> 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 { let res = AfcPacket::read(&mut self.idevice).await?; if res.header.operation == AfcOpcode::Status { diff --git a/idevice/src/afc/opcode.rs b/idevice/src/afc/opcode.rs index 28791f2..ade0b29 100644 --- a/idevice/src/afc/opcode.rs +++ b/idevice/src/afc/opcode.rs @@ -45,6 +45,12 @@ pub enum AfcFopenMode { RdAppend = 0x00000006, // a+ O_RDWR | O_APPEND | O_CREAT } +#[repr(u64)] +pub enum LinkType { + Hardlink = 0x00000001, + Symlink = 0x00000002, +} + impl TryFrom for AfcOpcode { type Error = ();