Précédent   Forum des professionnels en informatique > Systèmes > Linux > Réseau
Réseau Vos questions autour des réseaux et télécoms sous Linux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/05/2007, 06h37   #1
Inactif
 
Avatar de Hibou57
 
Inscription : mars 2006
Messages : 852
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 852
Points : 398
Points : 398
Par défaut gethostbyname(2) ou gethostbyname(3) ?

Hello, helloo,

Les pages man/2, sont les pages man pour les syscalls. Des recherches Google me renvoient des occurences sur le web pour gethostbyname(2), ce qui tend à faire penser que gethostbyname est une fonction du noyau sous Linux. Mais gethostbyname(3), qui est l'occurence la plus fréquente tend à faire penser le contraire.

Le noyau intègre des fonctions réseau il me semble (des fonctions qui ne reposent donc pas sur des librairie dynamique).

Il y a par exemple socketcall, qui est l'équivalent de syscall, mais pour les sockets (les sockets sont peut-être un sous-système dans le noyau).

Même si les protocols sous jacents aux sockets peuvent êtres nombreux, en pratique, le protocol utilisé est INET dans 99% des cas. Ce ne serait donc pas surprenant que le support INET (comme gethostbyname par exemple), soit également intégré au noyau (à l'instar des sockets).

Mais pourtant je ne trouve pas d'appel noyau pour par exemple gethostbyname.

Qu'en est-il : est-ce gethosbyname et INET en général font partie du noyau ou pas ?

Et si INET fait partie du noyau, alors quels sont les syscalls associés ?

Merci pour tout, cela me rendrait un grand service d'avoir une idée de quelqu'un(e) qui connais la chose sous Linux...
Hibou57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2007, 10h09   #2
Rédacteur/Modérateur
 
Avatar de millie
 
Inscription : juin 2006
Messages : 6 929
Détails du profil
Informations personnelles :
Localisation : Luxembourg

Informations forums :
Inscription : juin 2006
Messages : 6 929
Points : 6 714
Points : 6 714
Le fait que j'ai trouvé le code source dans un fichier qui n'est pas du noyau me ferait penser que ce n'est pas un appel système :

http://www.jbox.dk/sanos/source/sys/os/netdb.c.html

Code c :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//
// gethostbyname
//
 
struct hostent *gethostbyname(const char *name)
{
  char buf[QUERYBUF_SIZE];
  const char *cp;
  int n;
  struct tib *tib = gettib();
 
  tib->host.h_addrtype = AF_INET;
  tib->host.h_length = sizeof(struct in_addr);
 
  // Return 127.0.0.1 for localhost
  if (strcmp(name, "localhost") == 0)
  {
    struct in_addr loaddr;
    loaddr.s_addr = htonl(INADDR_LOOPBACK);
    memcpy(tib->host_addr, &loaddr, sizeof(struct in_addr));
    strcpy(tib->hostbuf, "localhost");
    tib->host.h_name = tib->hostbuf;
    tib->host.h_aliases = tib->host_aliases;
    tib->host_aliases[0] = NULL;
    tib->h_addr_ptrs[0] = (char *) tib->host_addr;
    tib->h_addr_ptrs[1] = NULL;
    tib->host.h_addr_list = tib->h_addr_ptrs;
 
    return &tib->host;
  }
 
  // Disallow names consisting only of digits/dots, unless they end in a dot
  if (*name >= '0' && *name <= '9')
  {
    for (cp = name;; ++cp) 
    {
      if (!*cp)
      {
        struct in_addr addr;
 
        if (*--cp == '.') break;
 
        // All-numeric, no dot at the end. Fake up a hostent as if we'd actually done a lookup.
        addr.s_addr = inet_addr(name);
        if (addr.s_addr == INADDR_NONE) return NULL;
 
        memcpy(tib->host_addr, &addr, tib->host.h_length);
        strncpy(tib->hostbuf, name, HOSTBUF_SIZE - 1);
        tib->hostbuf[HOSTBUF_SIZE - 1] = '\0';
        tib->host.h_name = tib->hostbuf;
        tib->host.h_aliases = tib->host_aliases;
        tib->host_aliases[0] = NULL;
        tib->h_addr_ptrs[0] = (char *) tib->host_addr;
        tib->h_addr_ptrs[1] = NULL;
        tib->host.h_addr_list = tib->h_addr_ptrs;
 
        return &tib->host;
      }
 
      if (*cp < '0' && *cp > '9' && *cp != '.') break;
    }
  }
 
  n = res_search(name, DNS_CLASS_IN, DNS_TYPE_A, buf, sizeof(buf));
  if (n < 0) return NULL;
 
  return getanswer(buf, n, name, DNS_TYPE_A);
}

En tout cas, sous Solaris, je sais que ça ne fait pas parti du noyau, il est nécessaire de faire une édition des liens supplémentaire, ce qui n'est pas le cas sous linux (sur ma machine du moins). Mais il me semble (je ne suis pas sûr) que ces fonctions sont définies dans la bibliothèque libnsl.a (c'est ce que me dis le man suivant), mais ça doit certainement dépendre des implémentations.


Les sources de Solaris pour la fonction :
http://cvs.opensolaris.org/source/xr...s/gethostent.c
__________________
Je ne répondrai à aucune question technique en privé
millie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2007, 18h02   #3
Inactif
 
Avatar de Hibou57
 
Inscription : mars 2006
Messages : 852
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 852
Points : 398
Points : 398
Salut Millie,

Oui, je confirme maintenant : cela repose également sur le fichier /etc/resolv.conf, et est donc extérieure au noyau.

Mais c'est vraiment fondamental, peut-être qu'il y aurait un moyen de faire un module qui intégre cette fonction au noyau... mais ça c'est une autre histoire...

En plus de la librairie que tu indique, il existe également une autre norme, qui fait que cette fonction gethostbyname est fournie par une librairie nomée netdb .

Encore merci pour la source
Hibou57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h31.


 
 
 
 
Partenaires

Hébergement Web