Jak zjistit sitova rozhrani

Pavel Janík Pavel na Janik.cz
Úterý Září 4 19:18:21 CEST 2001


   From: Pavel Kankovsky <peak na argo.troja.mff.cuni.cz>
   Date: Tue, 4 Sep 2001 14:05:30 +0200 (MET DST)

Ahoj,

   > Kdyz pomineme analyzu veci v /proc, jak uz tady bylo doporucovano, tak se
   > to dela takovym vtipnym zpusobem, ze vyrobite socket (nevim, jestli zalezi
   > na PF_) a pak na nej delate ruzne ioctl() zacinajici na SIOCG, specialne
   > seznam interfejsu by mel byt SIOCGIFCONF. Zpusob predevani parametru je
   > ale dost sileny.

Na socket domain nezáleží. Přepsáno do C to následuje (vybrat pouze
eth. rozhraní je domácí úkol ;-). Doufám, že od autora původního dotazu
dostanu tučňáka nebo si to budu moct někdy vybrat :-)

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>

int main(int argc, char *argv[])
{
  int sd, n;
  struct ifconf ifc;
  struct ifreq *ifr;

  sd=socket(AF_INET, SOCK_STREAM, 0);
  ifc.ifc_buf = NULL;
  ifc.ifc_len = sizeof(struct ifreq) * 10;
  ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len);

  if (ioctl(sd, SIOCGIFCONF, &ifc) < 0)
    perror("SIOCGIFCONF");
                                 
  ifr = ifc.ifc_req;
  for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) {
    fprintf(stdout, "%s\n", ifr->ifr_ifrn.ifrn_name);
    ifr++;
  }

  free(ifc.ifc_buf);
  exit(0);
}
-- 
Pavel Janík

It's entirely untested, but it looks good and compiles. Ship it!
                  -- Linus Torvalds in linux-kernel


Další informace o konferenci Linux