Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 105 additions & 1 deletion protocol/afp/afp.go
Original file line number Diff line number Diff line change
Expand Up @@ -726,13 +726,117 @@ func MoveAndRenameFile(conn net.Conn, srcVolID uint16, srcDirID uint32, srcPath
return ok
}

// Sends the AddAppl command to the AFP server.
func AddAppl(conn net.Conn, volID uint16, dirID uint32, creator [4]byte, applTag [4]byte, path string) bool {
data := []byte{}
data = append(data, AFPAddAppl)
data = append(data, byte(0x00))
volIDBytes := make([]byte, 2)
binary.BigEndian.PutUint16(volIDBytes, volID)
data = append(data, volIDBytes...)
dirIDBytes := make([]byte, 4)
binary.BigEndian.PutUint32(dirIDBytes, dirID)
data = append(data, dirIDBytes...)
data = append(data, creator[0])
data = append(data, creator[1])
data = append(data, creator[2])
data = append(data, creator[3])
data = append(data, applTag[0])
data = append(data, applTag[1])
data = append(data, applTag[2])
data = append(data, applTag[3])
data = append(data, byte(0x2))
data = append(data, uint8(len(path)))
data = append(data, []byte(path)...)

packet := CreateFPPacket(DSICommand, data)

// send message
ok := WritePacket(conn, packet)
if !ok {
return false
}

// read response
_, ok = ReadPacket(conn)

return ok
}

// Sends the GetAppl command to the AFP server.
func GetAppl(conn net.Conn, volID uint16, creator [4]byte, aIndex uint16, bitmap uint16) (*FPPacket, bool) {
data := []byte{}
data = append(data, AFPGetAppl)
data = append(data, byte(0x00))
volIDBytes := make([]byte, 2)
binary.BigEndian.PutUint16(volIDBytes, volID)
data = append(data, volIDBytes...)
data = append(data, creator[0])
data = append(data, creator[1])
data = append(data, creator[2])
data = append(data, creator[3])
aIndexBytes := make([]byte, 2)
binary.BigEndian.PutUint16(aIndexBytes, aIndex)
data = append(data, aIndexBytes...)
bitmapBytes := make([]byte, 2)
binary.BigEndian.PutUint16(bitmapBytes, bitmap)
data = append(data, bitmapBytes...)

packet := CreateFPPacket(DSICommand, data)

// send message
ok := WritePacket(conn, packet)
if !ok {
return nil, false
}

// read response
response, ok := ReadPacket(conn)

return response, ok
}


// Sends the setfileparams command to the AFP server.
func SetFilParams(conn net.Conn, volID uint16, dirID uint32, bitmap uint16, path string, buffer []byte) bool {
data := []byte{}
data = append(data, AFPSetFileParams)
data = append(data, byte(0x00))
volIDBytes := make([]byte, 2)
binary.BigEndian.PutUint16(volIDBytes, volID)
data = append(data, volIDBytes...)
dirIDBytes := make([]byte, 4)
binary.BigEndian.PutUint32(dirIDBytes, dirID)
data = append(data, dirIDBytes...)
bitmapBytes := make([]byte, 2)
binary.BigEndian.PutUint16(bitmapBytes, bitmap)
data = append(data, bitmapBytes...)
data = append(data, byte(0x2))
data = append(data, uint8(len(path)))
data = append(data, []byte(path)...)
data = append(data, buffer...)

packet := CreateFPPacket(DSICommand, data)

// send message
ok := WritePacket(conn, packet)
if !ok {
return false
}

// read response
_, ok = ReadPacket(conn)

return ok
}


// Sends the Delete command to the AFP server.
func Delete(conn net.Conn, volumeID uint16, dirID uint32, path string) bool {
// requires protocol 3.2 and specific support configured at build time.
pathElements := strings.Split(path, "/")
fileName := pathElements[len(pathElements)-1]

// from nmap lua library -- data = string.pack( ">BBI2I4I2I2", COMMAND.FPOpenFork, flag, volume_id, did, file_bitmap, access_mode ) .. encode_path(path)
data := []byte{}
data = append(data, AFPDelete)
data = append(data, byte(0x00))
Expand Down