#include <sys.socket.h>
#include <ioctl.h>
#include <net.if.h>
Kernighan-Ritchie-C:
int soc_ioctl(s, request, argp);
int s;
unsigned long request;
char *argp;
ANSI-C:
int soc_ioctl(int s, unsigned long request, char* argp);
Beschreibung
Die Funktion soc_ioctl() führt Steuerfunktionen für Sockets aus.
s bezeichnet den Socket-Deskriptor.
Folgende Steuerfunktionen werden für Sockets in der Adressfamilie AF_INET unterstützt:
request | *argp | Funktion |
FIONBIO | int | Blocking-Modus ein- und ausschalten |
FIONREAD | int | Nachrichtenlänge im Puffer ermitteln |
SIOCGIFCONF | struct ifconf | Interface-Konfiguration ermitteln |
SIOCGIFADDR | struct ifreq | Internet-Adresse des Interface ermitteln |
SIOCGIFBRDADDR | struct ifreq | Broadcast-Adresse des Interface ermitteln |
SIOCGIFFLAGS | struct ifreq | Flags des Interface ermitteln |
SIOCGIFNETMASK | struct ifreq | Netzmaske zum Interface ermitteln |
SIOCGLIFADDR | struct lifreq | Interface-Adresse ermitteln |
SIOCGLIFBRDADDR | struct lifreq | Broadcast-Adresse des Interface ermitteln |
SIOCGLIFCONF | struct lifconf | Interface-Konfigurations-Liste ermitteln |
SIOCGLIFFLAGS | struct lifreq | Interface-Flags ermitteln |
SIOCGLIFHWADDR | struct lifreq | MAC-Adresse zum Interface ermitteln |
SIOCGLIFINDEX | struct lifreq | Interface-Index ermitteln |
SIOCGLIFNETMASK | struct lifreq | Netzmaske zum Interface ermitteln |
SIOCGLIFNUM | struct lifnum | Anzahl Interfaces ermitteln |
SIOCGLAHCONF | struct lvhost | Liste aller aktiven Hosts ausgeben |
SIOCGLVHCONF | struct lvhost | Liste der aktiven virtuellen Hosts ausgeben |
SIOCGLVHNUM | int | Anzahl der aktiven virtuellen Hosts ermitteln |
Folgende Steuerfunktionen werden für Sockets in der Adressfamilie AF_INET6 unterstützt:
request | *argp | Funktion |
FIONBIO | int | Blocking-Modus ein- und ausschalten |
FIONREAD | int | Nachrichtenlänge im Puffer ermitteln |
SIOCGLIFADDR | struct lifreq | Interface-Adresse ermitteln |
SIOCGLIFBRDADDR | struct lifreq | Broadcast-Adresse des Interface ermitteln |
SIOCGLIFCONF | struct lifconf | Interface-Konfigurations-Liste ausgeben |
SIOCGLIFFLAGS | struct lifreq | Interface-Flags ermitteln |
SIOCGLIFHWADDR | struct lifreq | MAC-Adresse zum Interface ausgeben |
SIOCGLIFINDEX | struct lifreq | Interface-Index ermitteln |
SIOCGLIFNETMASK | struct lifreq | Netzmaske zum Interface ermitteln |
SIOCGLIFNUM | struct lifnum | Anzahl Interfaces ermitteln |
SIOCGLAHCONF | struct lvhost | Liste aller aktiven Hosts ausgeben |
SIOCGLVHCONF | struct lvhost | Liste der aktiven virtuellen Hosts ausgeben |
SIOCGLVHNUM | int | Anzahl der aktiven virtuellen Hosts ermitteln |
Folgende Steuerfunktion wird für Sockets in der Adressfamilie AF_ISO unterstützt:
request | *argp | Funktion |
FIONBIO | int | Blocking-Modus ein- und ausschalten |
Folgende Steuerfunktionen können ohne Socket (s = 0) genutzt werden:
request | *argp | Funktion |
SIOCGBCPROC | struct ifproc | Liefert den BCAM-Prozessornamen zu einem FQDN zurück |
SIOCGBCFQDN | struct ifproc | Liefert den FQDN zu einem BCAM-Prozessornamen zurück |
FIONBIO
Diese Option beeinflusst das Ausführungsverhalten von Socket-Funktionen auf dem Socket s bei Datenflusskontrolle sowie bei noch nicht abgeschlossenen Aktionen des Kommunikationspartners:
*argp = 0:
Socket-Funktionen blockieren, bis die Funktion ausgeführt werden kann.*argp != 0:
Socket-Funktionen kehren mit dem errno-Code EWOULDBLOCK zurück, wenn die Funktion nicht sofort ausgeführt werden kann. Mit select() oder soc_poll() kann festgestellt werden, welche Sockets zum Lesen oder Schreiben bereit sind. Standardfall: FIONBIO ist nicht gesetzt.
FIONREAD
Die Länge der aktuell im Eingangspuffer vorhandenen Nachricht (in Bytes) wird zurückgeliefert.
SIOCGIFCONF
Es wird eine Ausgabeliste in Form von unverketteten Elementen vom Typ struct ifreq (siehe Option SIOCGIFADDR) erstellt. Den entsprechenden Speicherbereich für diese Liste stellt der Aufrufer bereit, indem er die Anfangsadresse und die Länge in die entsprechenden Felder der Struktur ifconf einträgt.
Es werden nur so viele Elemente vom Typ struct ifreq ausgegeben, wie in den zur Verfügung gestellten Puffer hineinpassen.
Diese Interfaces gehören zu einem Host. Im Normalfall ist das der Standardhost. Sind auch virtuelle Hosts konfiguriert, gibt es folgende Möglichkeiten, die entsprechenden Interfaces zu erhalten:
Ist die Anwendung unter einer Kennung gestartet, die durch einen Eintrag in der BCAM-Application-Tabelle auf einen virtuellen Host verlagert wird, dann wird die Information für diesen virtuellen Host ausgegeben.
Mit der setsockopt()-Subfunktion SO_VHOSTANY ist es möglich, vor dem Aufruf von soc_ioctl() auszuwählen, für welchen Host die Information ausgegeben werden soll.Die Struktur ifconf ist in <net.if.h> wie folgt deklariert:
struct ifconf { int ifc_len; union { caddr_t ifcu_buf; struct ifreq *ifcu_req; } ifc_ifcu; #define ifc_buf ifc_ifcu.ifcu_buf #define ifc_req ifc_ifcu.ifcu_req };
SIOCGIFADDR
Für das in der Struktur ifreq mit dem Interfacenamen ifr_name spezifizierte Interface wird die Internet-Adresse zurückgeliefert.
Die Struktur ifreq ist in <net.if.h> wie folgt deklariert:
struct ifreq { #define IFNAMSIZ 16 char ifr_name[IFNAMSIZ]; /* Interfacename z.B. IF000003" */ union { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; short ifru_flags; int ifru_metric; caddr_t ifru_data; } ifr_ifru; #define ifr_addr ifr_ifru.ifru_addr /* Adresse */ #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* Zieladr. d. Verbindung */ #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* Broadcast-Adresse */ #define ifr_flags ifr_ifru.ifru_flags /* Flags */ #define ifr_metric ifr_ifru.ifru_metric /* Metrik */ #define ifr_data ifr_ifru.ifru_data /* für die Schnittstelle */ };
Zu beachten ist, dass SOCKETS(BS2000) derzeit Informationen für nur ein Interface liefert.
SIOCGIFBRDADDR
Für das in der Struktur ifreq (siehe Option SIOCGIFADDR) spezifizierte Interface wird die Broadcast-Adresse zurückgeliefert, wenn es sich um ein IPv4-Interface handelt und wenn das Flag IFF_BROADCAST gesetzt ist. Das ist normalerweise nicht der Fall, weil mit Sockets-Sprachmitteln und der Transportsystemunterstützung kein Broadcast erzeugt werden kann.
SIOCGIFFLAGS
Für den in der struct ifreq spezifizierten Interface-Namen werden die Interface-Flags im Element ifr_flags zurückgeliefert:
IFF_UP, wenn das Interface aktiv ist
IFF_BROADCAST, wenn über dieses Interface Broadcast-Nachrichten gesendet werden können
IFF_MULTICAST, wenn über dieses Interface Multicast-Nachrichten versendet werden können
IFF_LOOPBACK, wenn über dieses Interface Nachrichten an Loopback versendet werden können
IFF_CONTROLLAN, wenn über dieses Interface mit dem CONTROLLAN kommuniziert werden kann
SIOCGIFNETMASK
Für das in der Struktur ifreq spezifizierte IPv4-Interface wird im Element ifr_addr die Subnetmaske in der Form von auf „1“ gesetzten Bits des Netzanteils der Subnetmaske ausgegeben (z.B. „FFFFFF00“).
SIOCGLIFADDR
Für den in der Struktur lifreq spezifizierten Namen wird die Interface-Adresse zurückgegeben. Die Struktur lifreq ist eine besonders im Hinblick auf IPv6 erweiterte Struktur ifreq.
SIOCGLIFBRDADDR
Für das in der Struktur lfreq spezifizierte Interface wird die Broadcast-Adresse zurückgeliefert, wenn für dieses Interface das Flag IFF_BROADCAST gesetzt ist. Das ist normalerweise nicht der Fall, weil mit Sockets-Sprachmitteln und der Transportsystemunterstützung kein Broadcast erzeugt werden kann.
Für die Nutzung von MULTICAST gibt es eigene Subfunktionen unter getsockopt() / setsockopt() (siehe Abschnitt "getsockopt(), setsockopt() - Socket-Optionen abfragen und ändern").
SIOCGLIFCONF
Es wird eine Ausgabeliste in Form von unverketteten Elementen vom Typ struct lifreq erstellt. Den entsprechenden Speicherbereich für diese Liste stellt der Aufrufer bereit, indem er die Anfangsadresse und die Länge in die entsprechenden Felder der Struktur lifconf einträgt.
Es werden nur so viele Elemente vom Typ struct lifreq ausgegeben, wie in den zur Verfügung gestellten Puffer hineinpassen. Durch die Belegung der Elemente lifc_family und lifc_flags kann die Ausgabe gefiltert werden.
Werte für lifc_family: AF_INET, AF_INET6, AF_UNSPEC
Werte für lifc_flags: siehe SIOCGLIFFLAGS
Diese Interfaces gehören zu einem Host. Im Normalfall ist dies der Standardhost. Sind auch virtuelle Hosts konfiguriert, gibt es folgende Möglichkeiten, die entsprechenden Interfaces zu erhalten:
Ist die Anwendung unter einer Kennung gestartet, die durch einen Eintrag in der BCAM-Application-Tabelle auf einen virtuellen Host verlagert wird, dann wird die Information für diesen virtuellen Host ausgegeben.
Mit der setsockopt()-Subfunktion SO_VHOSTANY ist es möglich, vor dem Aufruf von soc_ioctl() auszuwählen, für welchen Host die Information ausgegeben werden soll.Die Struktur lifconf ist in <net.if.h> wie folgt deklariert:
struct lifconf { sa_family_t lifc_family; int lifc_flags; int lifc_len; union { caddr_t lifcu_buf; struct lifreq *lifcu_req; } lifc_lifcu; #define lifc_buf lifc_lifcu.lifcu_buf #define lifc_req lifc_lifcu.lifcu_req };
SIOCGLIFFLAGS
Für den in der Struktur lifreq spezifizierten Interface-Namen werden die Interface-Flags im Element lifr_flags zurückgeliefert:
IFF_UP, wenn das Interface aktiv ist
IFF_BROADCAST, wenn über dieses Interface Broadcast-Nachrichten gesendet werden können
IFF_MULTICAST, wenn über dieses Interface Multicast-Nachrichten versendet werden können
IFF_LOOPBACK, wenn über dieses Interface Nachrichten an Loopback versendet werden können
IFF_CONTROLLAN, wenn über dieses Interface mit dem CONTROLLAN kommuniziert werden kann
IFF_AUTOCONFIG, wenn dieses Interface mit einer durch IPv6-Autoconfig generierten Adresse versorgt wurde. Dazu gehört auch die lokal im Rechner erzeugt IPv6-Link-Local-Adresse mit dem Prefix FE80::/10.
SIOCGLIFHWADDR
Für den in der Struktur lifreq spezifizierten Interface-Namen wird die MAC-Adresse ausgegeben.
SIOCGLIFINDEX
Für den in der Struktur lifreq spezifizierten Interface-Namen wird der Index ausgegeben.
SIOCGLIFNETMASK
Für den in der Struktur lifreq angegebenen Interfacenamen lifr_name wird im Element lifr_addr die Subnetmaske und im Element lifr_addrlen die Prefixlänge in Bits ausgegeben. Handelt es sich um ein IPv4-Interface erfolgt die Ausgabe in der Form, dass alle betroffenen Bits des Netzanteils auf „1“ gesetzt sind (z.B. „FFFFFF00“). Handelt es sich um ein IPv6-Interface, wird der Netzanteil als Originaladresse ausgegeben und die folgenden Bits sind dann auf „0“ gesetzt (z.B. „FD11F052433485AA000000000000“).
SIOCGLIFNUM
Für die in der Struktur lifnum spezifizierte Adressfamilie wird die Anzahl der Interfaces ausgegeben.
SIOCGLAHCONF
Es wird eine nicht verkettete Liste mit Listenelementen vom Typ struct lvhost zurückgegeben. Diese enthalten den Socket-Hostnamen, den BCAM-Hostnamen, die Host-Nummer und ein Active-Flag vom realen Host und, falls vorhanden, auch von virtuellen Hosts. Der Speicher für diese Liste muss vom Anwender in *argp mit dem Typ struct lvhost übergeben werden. Die Länge ist im Feld lvhostlen einzutragen.
Wenn Informationen zu allen Hosts ausgegeben werden sollen, ist ein Speicher von n x sizeof(struct lvhost) erforderlich, wobei n der maximal möglichen Anzahl von aktiven Hosts entspricht.
Auf die Rückgabeinformation kann durch direkte Adressierung oder durch Indizierung zugegriffen werden. Im ersten Listen-Element wird im Feld vhostsum die Anzahl der zurückgegebenen Listen-Elemente vom Typ struct lvhost eingetragen. Im letzten Listen-Element wird das Feld vhostlast mit „1“ gekennzeichnet.
Ist der zur Verfügung gestellte Speicher nicht groß genug, wird im letzten Listen-Element das Feld vhostlast mit „-1“ gekennzeichnet.
SIOCGLVHCONF
Es wird eine nicht verkettete Liste mit Listenelementen vom Typ struct lvhost zurückgegeben, die im Unterschied zu SIOCGLAHCONF nur die Informationen über die virtuellen Hosts enthält.
Der Speicher für diese Liste muss vom Anwender in *argp mit dem Typ struct lvhost übergeben werden. Die Länge ist im Feld lvhostlen einzutragen. Wenn Informationen zu allen virtuellen Hosts ausgegeben werden sollen, ist ein Speicher von
n x sizeof(struct lvhost) erforderlich, wobei n dem Rückgabewert von SIOCGLVHNUM entspricht.
Auf die Rückgabeinformation kann durch direkte Adressierung oder durch Indizierung zugegriffen werden. Im ersten Listen-Element wird im Feld vhostsum die Anzahl der zurückgegebenen Listen-Elemente vom Typ struct lvhost eingetragen. Im letzten Listen-Element wird das Feld vhostlast mit „1“ gekennzeichnet.
Die Struktur lvhost ist in <net.if.h> wie folgt deklariert:
struct lvhost { int lvhostlen; /* length of memory for lvhostlist */ unsigned short vhostsum; /* number of vhosts delivered */ unsigned short vhostlast; /* last element if not zero */ int vhost_num; /* vhost number, must be greater 1 */ short vhost_flag; /* vhost active ? */ char vsockethost[33]; /* sockethostname of vhost */ char vbcamhost[9]; /* bcamhostname of vhost */ };
SIOCGLVHNUM
Die Anzahl der aktiven virtuellen Hosts wird zurückgegeben.
Die Struktur lifreq ist in <net.if.h> wie folgt deklariert:
struct lifreq { #define IFHWADDRLEN 6 #define LIFNAMSIZ 32 char lifr_name[LIFNAMSIZ]; union { int lifru_addrlen; unsigned int lifru_ppa; } lifr_lifru1; #define lifr_addrlen lifr_lifru1.lifru_addrlen #define lifr_ppa lifr_lifru1.lifru_ppa unsigned int lifr_movetoindex; union { struct sockaddr_storage lifru_addr; struct sockaddr_storage lifru_dstaddr; struct sockaddr_storage lifru_broadaddr; struct sockaddr_storage lifru_token; struct sockaddr_storage lifru_subnet; struct sockaddr lifru_hwaddr; int lifru_index; union { unsigned int lifru_flags_0,lifru_flags_1; u_int64_t lifru_flags; } lifr_lifruflags; int lifru_metric; unsigned int lifru_mtu; char lifru_data[1]; char lifru_enaddr[6]; int lif_muxid[2]; struct lif_nd_req lifru_nd_req; struct lif_ifinfo_req lifru_ifinfo_req; char lifru_groupname[LIFNAMSIZ]; unsigned int lifru_delay; } lifr_lifru; #define lifr_addr lifr_lifru.lifru_addr #define lifr_dstaddr lifr_lifru.lifru_dstaddr #define lifr_broadaddr lifr_lifru.lifru_broadaddr #define lifr_token lifr_lifru.lifru_token #define lifr_subnet lifr_lifru.lifru_subnet #define lifr_index lifr_lifru.lifru_index #define lifr_flags lifr_lifru.lifr_lifruflags.lifru_flags #define lifr_flags_l lifr_lifru.lifr_lifruflags.lifru_flags_1 #define lifr_flags_h lifr_lifru.lifr_lifruflags.lifru_flags_0 #define lifr_metric lifr_lifru.lifru_metric #define lifr_mtu lifr_lifru.lifru_mtu #define lifr_data lifr_lifru.lifru_data #define lifr_enaddr lifr_lifru.lifru_enaddr #define lifr_index lifr_lifru.lifru_index #define lifr_ip_muxid lifr_lifru.lif_muxid[0] #define lifr_nd lifr_lifru.lifru_nd_req #define lifr_ifinfo lifr_lifru.lifru_ifinfo_req #define lifr_groupname lifr_lifru.lifru_groupname #define lifr_delay lifr_lifru.lifru_delay #define lifr_hwaddr lifr_lifru.lifru.lifru_hwaddr };
Die Struktur sockaddr_storage ist in <sys.socket.h> wie folgt deklariert:
#define _SS_MAXSIZE 128 /* Implementation specific max size */ #define _PADSIZE (_SS_MAXSIZE - (sizeof(u_int64_t) + 8 )) struct sockaddr_storage { sa_family_t ss_family; /* address family */ #define __ss_family ss_family char res[6]; /* reserved for alignment */ u_int64_t addr; /* address */ char pad[_PADSIZE]; /* pad up to max size */ };
Die Struktur lifnum ist in <net.if.h> wie folgt deklariert:
struct lifnum { sa_family_t lifn_family; int lifn_flags; int lifn_count; };
SIOCGBCPROC
Die Felder *fqdn und fqdnlen der Struktur ifproc müssen vom Aufrufer ausgefüllt werden. Für den Zeiger *fqdn muss ein char-Array bereitgestellt werden, welches den zu überprüfenden FQDN enthält. Die Länge dieses FQDN muss in das Feld fqdnlen eingetragen werden. Nach dem Aufruf der Funktion steht der zum FQDN (Fully Qualified Domain Name) zugehörige BCAM-Prozessorname in dem Feld bcproc[] mit String-Null-Terminierung (‘\0‘).
Sollte es zu diesem FQDN noch keinen BCAM-Prozessornamen geben, wird ein negativer Returncode zurückgeliefert. Das gilt auch dann, wenn zu dem angegebenen FQDN zwar ein bestimmter Prozessorname in der FQDN-Datei zugewiesen, der Prozessor/die Route aber nicht erzeugt wurde.
Eine IP-Adresse muss zwingend vorher in einen FQDN umgewandelt werden (siehe getnameinfo()-Funktion).
Der Socket-Deskriptor wird für diese Funktion nicht benötigt und ausgewertet.
Die Struktur ifproc ist in <net.if.h> wie folgt deklariert:
struct ifproc { char *fqdn; /* FQDN (Fully Qualified Domain Name) */ int fqdnlen; /* length of the FQDN */ char bcproc[9]; /* space for BCAM processor name */ };
SIOCGBCFQDN
Der Aufrufer muss für den Zeiger *fqdn ein char-Array bereitstellen und in fqdnlen die Länge dieses Arrays eintragen. Außerdem muss der BCAM-Prozessorname in dem Feld bcproc[] vermerkt werden. Nach dem Aufruf dieser Funktion steht der zum BCAM-Prozessornamen zugehörige FQDN (Fully Qualified Domain Name) mit String-Null-Terminierung (‘\0‘) in dem Feld, auf das der Zeiger *fqdn verweist. Sollte fqdnlen kleiner sein als die Länge des FQDN, gibt es einen Fehler und es wird kein FQDN eingetragen. Sollte der angegebene BCAM-Prozessorname nicht vorhanden sein oder es zu diesem Prozessornamen keinen FQDN geben, wird ebenfalls ein Fehler zurückgeliefert und zusätzlich die Länge 0 in fqdnlen eingetragen.
Der Socket-Deskriptor wird für diese Funktion nicht benötigt und ausgewertet.
Returnwert
-1:
bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.
Fehleranzeige durch errno
EBADF
Der Parameter s ist kein gültiger Deskriptor.
EINVAL
request oder arg sind für dieses Gerät (Interface, Socket) nicht gültig.