That's going to be very OS-specific, but it's certainly doable.
This should work on Plan 9 (untested):
package main
import (
"bytes"
"log"
"os"
)
func main() {
log.SetFlags(0)
if len(os.Args) != 1+1 {
log.Fatal("usage: eject /dev/sdD0")
}
f, err := os.OpenFile(os.Args[1]+"/raw", os.O_RDWR, 0)
if err != nil {
log.Fatal(err)
}
scsicmd([]byte{0x1b, 0, 0, 0, 2, 0}, []byte{})
}
func scsicmd(cmd, data []byte) {
if n, err := f.Write(cmd); n != len(cmd) || err != nil {
log.Fatalf("write: %v", err)
}
if n, err := f.Write(data); n != len(data) || err != nil {
log.Fatal("write: %v", err)
}
resp := make([]byte, 16)
n, err := f.Read(resp)
if err != nil {
log.Fatal("read response: %v", err)
}
if !bytes.Equal(resp[:n], []byte("0")) {
log.Fatal("error %v", string(resp[:n]))
}
}