000
10.02.2009, 13:04 Uhr
~Keros
Gast
|
Hi
Ich beschäftige mich gerade unter Linux in c++ mit ioctl und komme irgendwie damit nicht klar. Bzw mit dem Debuggen dieser Funktion.
OS: Xubuntu 8.10 cat /proc/scsi/sg/version 30534 3.5.34 [20061027]
Code: |
unsigned char dbg = 0x01; int err = ioctl(fd, SG_SET_DEBUG, &dbg); printf ("Debug Error: %d\n", err);
unsigned char buff[4]; for(int i = 0; i < 4; i++) { buff[i] = 0x00; }
err = ioctl(fd, SG_GET_VERSION_NUM, buff); printf ("Version Error: %d\n", err); printf ("Versionsnummer: "); for (int i = 0; i < 4; i++) { printf ("%d", buff[i]); } printf ("\n"); if (ioctl (fd, SG_IO, &sg_io)) { return -1; }
|
Ausgabe:[tt] Debug Error: -1 Version Error: 0 Versionsnummer: 6311900 [/tt]
ioctl (fd, SG_IO, &sg_io) liefert auch -1.
Restlichen Variablen: fd = 3 (int)
Code: |
/* * O_RDWR is expected to provide for none set-root-uid * execution under Linux kernel 2.6[.8]. Under 2.4 it * falls down to O_RDONLY... */ fd = open (file, O_RDWR|O_NONBLOCK)
|
sg_io
Code: |
// read10 command cmd[0] = 0x28; // READ 10 cmd[1] = 0x00; // DPO, FUA cmd[2] = address; cmd[3] = address; cmd[4] = address; cmd[5] = address; cmd[6] = 0x00; // Reserved, Restricted cmd[7] = SECTORS ; cmd[8] = SECTORS; cmd[9] = 0x00; // Control
|
Device: "/dev/cdrom3" -> USB CDRom
Das Read10 commando funktioniert (ioctl (fd, SG_IO, &sg_io) gibt nicht -1 aus) Auch test Uinit Ready commands bzw write commands funktionieren einwandfrei.
Allerdings gibt es speziell für diese Laufwerk zusätzliche Kommandos. Eines davon funktioniert aber bei 2 anderen hakts jetzt. Wenn ich die Befehle nach Spezifikation zusammenbaue und sende gibt mir ioctl (fd, SG_IO, &sg_io) immer -1 zurück. Ich weiß allerdings nicht wieso. Und da ich es auch nicht schaffe ioctl dazu zu bewegen mir mehr Informationen zurückzugeben werde ich einfach nicht schauer :/
Weiß zufällig wer wie ich ioctl debuggen kann oder es dazu bringe mir mehr infos zu geben? Ich müsste wissen: Wurde das Kommando überhaupt gesendet oder gab es vorher schon ein Problem? Antwortet das Drive auf dieses Command mit einem Error? Wenns die beiden nicht sind wo liegt der Fehler sonst ^^?
Ich wäre auch Vorschlägen wie man die Befehle anders Senden kann nicht abgeneigt (ich muss aber auch nicht Standart Kommandos senden können). Will ja alles mal gesehen haben
MfG |