Как написать команду SCSI (WriteAtomi c, Read16) в Golang? - PullRequest
2 голосов
/ 27 мая 2020

Работа в Golang / среде Ubuntu

Проблемы в этих областях

func exec_ioctl(hdr *SgIoHdr) error {

f, err := os.Open("dev/sg1")  //The Status returned by err is always 3

if err != nil {

    return err

}

if err := Ioctl(uintptr(f.Fd()), SG_IO, uintptr(unsafe.Pointer(hdr))); 
err != nil {
    return err
}

Какая команда должна открывать диск? **

2. // Read16

sendCMD := []byte {0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00} 

cmdBuf := make([]byte, 16)

senseBuf := make([]byte, 512)

ioHdr   := SgIoHdr{
        InterfaceID:    int32('S'),                     
        DxferDirection: SG_DXFER_FROM_DEV,        
        CmdLen:         uint16(len(sendCMD )),           
        MxSbLen:        SENSE_BUF_LEN,           
        DxferLen:       uint32(len(cmdBuf )),               
        Dxferp:         &cmdBuf [0],
        SCmd:           sendCMD [0],
        Sbp:            &senseBuf[0],
        Timeout:        60000,
    }

err :=  exec_ioctl(&ioHdr)

    if err != nil {

        return err
    }


func Ioctl(fd, cmd, ptr uintptr) error {

    _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, cmd, ptr)

}

При попытке чтения данных, возвращаемых приводом, он всегда возвращает 00

Даже если на диск был отправлен неправильный код операции, err всегда возвращает 0 ie SCSI_STATUS В НОРМЕ

Есть ли проблемы с командой Read16?

3. Как отправить команду WRITEATOMI C на привод, например, Read16?

...