BSDForen.de  

Zurück   BSDForen.de > Geekstuff > Programmieren

Antwort
 
Themen-Optionen Thema bewerten Ansicht
Alt 28.11.2006, 15:03   #1
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 984
Herakles eine Nachricht über ICQ schicken
Question ifconfig <IP> mit ioctl(2) - wie geht das?

Moin!

Ich möchte gern den Systembefehl

Code:
ifconfig rl0 192.168.1.1
in ein C-Programm einfügen. Hierbei möchte ich NICHT system(3) nutzen, sondern das Ganze selbst mit ioctl(2) programmmieren.

Das request, welches ich hierfür verwenden muss ist SIOCSIFADDR und der Datentyp des Pointers für das dritte Argument von ioctl(2) ist struct ifreq.

Ich definiere also ein

Code:
struct ifreq request
und setze den Namen des Interfaces in dieses struct ein:

Code:
strcpy( request.ifr_ifrn.ifrn_name, "rl0" );
Mein anschließender ioctl(2)-Befehl sieht dann folgendermaßen aus:

Code:
if( ioctl( fd_udp, SIOCSIFADDR, &request) != 0 ) { perror(Failed to set IP-Address"); exit(-1); }
Kompilieren will das Ganze prima, lediglich bei Ausführung des Codes bekomme ich Probleme. Die Software steigt genau an der "exit(-1)"-Stelle aus und zwar mit dem Fehler "Invalid argument".

Hat jemand dazu eine Lösung parat? Wie kann ich meine IP-Adresse eines Interfaces mit ioctl(2) setzen?

Vielen Dank an jeden, der bis hierher gelesen hat!

Herakles
Herakles ist offline   Mit Zitat antworten
Alt 28.11.2006, 19:58   #2
Baseballbatboy
Cpt. Baseballbatboy
 
Registrierungsdatum: Nov 2004
Beiträge: 108
Frage explizit nach "-1" ab, also

Code:
if( ioctl( fd_udp, SIOCSIFADDR, &request) != 0 )
So las ich in einer OpenBSD-manpage und so verfahre ich auch seitdem.

man ioctl (dort stands nicht) sagt dazu:

Zitat:
RETURN VALUES
If an error has occurred, a value of -1 is returned and errno is set to
indicate the error.
Gruß
Baseballbatboy
Baseballbatboy ist offline   Mit Zitat antworten
Alt 29.11.2006, 07:35   #3
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 984
Herakles eine Nachricht über ICQ schicken
Hi Baseballbatboy!

Ich verstehe die Antwort nicht. Wo ist der Unterschied zu meiner Frage bei Deiner Lösung?

Ich meine, schreibst Du nicht genau das als Antwort, was ich schon gemacht habe?

Herakles
Herakles ist offline   Mit Zitat antworten
Alt 29.11.2006, 07:50   #4
.align64
66 46 83 46 68 46
 
Benutzerbild von .align64
 
Registrierungsdatum: Apr 2004
Ort: Linz, OÖ
Beiträge: 212
Vielleicht hilft dir dieser Codeabschnitt aus DesktopBSD.

Peter
__________________
Recommended Webcomics: Questionable Content | AppleGeeks
.align64 ist offline   Mit Zitat antworten
Alt 29.11.2006, 08:20   #5
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 984
Herakles eine Nachricht über ICQ schicken
@.align64: erstmal vielen dank.

Prinzipiell ist der Code schon hilfreich, sowas hatte ich bereits zuvor auch gesehen. Interessant im speziellen ist nun die folgende Zeile:

Code:
addrp->sin_addr.s_addr = ip.toInetAddr();
s_addr ist vom Typ struct in_addr, welcher wie folgt definiert ist:

Code:
struct in_addr { __u32 s_addr; };
Wie genau ist denn nun die Datenstruktur, die ip.toInetAddr() zurückgibt? Sprich: mit welchen Daten muss ich addrp->sin_addr.s_addr füttern? Ich denke, das ist meine letzte Hürde...

Herakles
Herakles ist offline   Mit Zitat antworten
Alt 29.11.2006, 09:28   #6
ka46
Registered User
 
Registrierungsdatum: Feb 2006
Beiträge: 31
Hallo

Zitat:
Zitat von Herakles Beitrag anzeigen
Code:
struct in_addr { __u32 s_addr; };
Wie genau ist denn nun die Datenstruktur, die ip.toInetAddr() zurückgibt? Sprich: mit welchen Daten muss ich addrp->sin_addr.s_addr füttern? Ich denke, das ist meine letzte Hürde...

Herakles
Schau dir mal inet_aton(3) an.

MfG

Lars
ka46 ist offline   Mit Zitat antworten
Alt 29.11.2006, 17:31   #7
Baseballbatboy
Cpt. Baseballbatboy
 
Registrierungsdatum: Nov 2004
Beiträge: 108
Hoppala, da hab ich doch tatsächlich vergessen, die if-Bedingung abzuändern. Scheiß copy & paste!

So ist es richtig:

Code:
if( ioctl( fd_udp, SIOCSIFADDR, &request) !=-1)
Das Codebeispiel fragt nach <0, das ist streng genommen auch nicht richtig, da ioctl() nur bei Fehler -1 ausgibt, und ansonsten jede andere Zahl zurückgeben kann, auch Werte kleiner -1.

Gruß
Baseballbatboy
Baseballbatboy ist offline   Mit Zitat antworten
Alt 30.11.2006, 07:58   #8
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 984
Herakles eine Nachricht über ICQ schicken
GEEEEEEEEEEEEEEEEEEEIIIIIIIIIIIIIIIIIIIIIIIIIIIIII LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL!!!!!

Danke, Baseballbatboy, DANKEEEEEEEEEEEEE!

Geil, danke.

Herakles
Herakles ist offline   Mit Zitat antworten
Alt 30.11.2006, 08:02   #9
rosa
Guest
 
Beiträge: n/a
@Herakles: Bei Dir scheinen par Tasten zu klemmen ;-)
  Mit Zitat antworten
Alt 30.11.2006, 08:28   #10
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 984
Herakles eine Nachricht über ICQ schicken
Kleine Ergänzung:

GANZ richtig ist eigentlich dieser Code:

Code:
if( ioctl( fd_udp, SIOCSIFADDR, &request) ==-1) { perror(Failed to set IP-Address"); exit(-1); }
Der Grund? Nun, es soll ja nur in einem Fehlerfall mit perror ein Fehler geschrieben werden und mit exit das Programm verlassen werden. Dieser Fehlerfall tritt nur bei ioctl() == -1 auf.

Bei Baseballbatboys Lösung " != -1 " wird dann in die if-Abfrage gesprungen, wenn die Ausführung korrekt war. Wenn man sich ansieht, was nach der if-Abfrage zu tun sein soll, wäre das natürlich blödsinnig.

Baseballbatboy, nochmals vielen, vielen Dank. Ich habe zwei Tage lang immer mal wieder zwischendurch auf dieses kleine Problemchen geschaut und den Fehler nie gesehen. Das hat mich echt voran gebracht. Sehr geil.

Herakles
Herakles ist offline   Mit Zitat antworten
Alt 01.12.2006, 20:35   #11
Baseballbatboy
Cpt. Baseballbatboy
 
Registrierungsdatum: Nov 2004
Beiträge: 108
Natürlich ioctl() == -1, man, was bin ich schusselig. Ich bin auch noch auf der Suche nach der man-page, in der extra nochmal erwähnt wurde, das man unbedingt auf "-1" überprüfen soll und nicht auf "<0" oder "!=0". Kann auch in einer aus der Kategorie open(), write() etc. gewesen sein.

Gruß
Baseballbatboy
Baseballbatboy ist offline   Mit Zitat antworten
Antwort


Dieses Thema betrachten zurzeit 1 Personen. (0 registrierte Benutzer und 1 Gäste)
 
Themen-Optionen
Ansicht Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus
Gehe zu

Ähnliche Themen
Thema Erstellt von Forum Antworten Letzter Beitrag
ifconfig <IP> mit ioctl(2) - wie geht das? Herakles Programmieren 0 28.11.2006 15:00
PF Bridge mit VLAN (dot1q) will nicht filtern morph OpenBSD - Allgemein 3 03.04.2006 09:15
Broadcom Wlankarte und ifconfig u67 FreeBSD - Netzwerk 5 02.02.2006 13:18
ifconfig auf Netgear WG311TGR führt zum Systemcrash Bl4ckC0d3r OpenBSD - Allgemein 0 31.07.2005 17:55
Karte reagiert nicht auf ifconfig djlauk FreeBSD - Netzwerk 8 17.03.2004 13:05


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr.


Powered by vBulletin (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.