Unix.DNS.Mod 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. (* Aos, Copyright 2001, Pieter Muller, ETH Zurich *)
  2. MODULE DNS; (** AUTHOR "pjm, mvt, gf"; PURPOSE "DNS client"; *)
  3. IMPORT S := SYSTEM, Out := KernelLog, Unix, IP, Files;
  4. CONST
  5. (** Error codes *)
  6. Ok* = 0; NotFound* = 3601; BadName* = 3602;
  7. MaxNofServer* = 10; (* max. number registered of DNS servers *)
  8. TYPE
  9. Name* = ARRAY 128 OF CHAR; (* domain or host name type *)
  10. Hostent = POINTER TO RECORD
  11. name : ADDRESS;
  12. aliases : ADDRESS;
  13. addrtype : LONGINT;
  14. length : LONGINT;
  15. addrlist : ADDRESS
  16. END;
  17. VAR
  18. (** Local domain name *)
  19. domain*: Name;
  20. nlib: ADDRESS;
  21. gethostbyaddr : PROCEDURE {C} ( adr: ADDRESS; len, typ: LONGINT ): Hostent;
  22. gethostbyname : PROCEDURE {C} ( name: ADDRESS ): Hostent;
  23. gethostname : PROCEDURE {C} ( name: ADDRESS; len: SIZE ): LONGINT;
  24. (* Statistic variables *)
  25. NDNSReceived-, NDNSSent-, NDNSMismatchID-, NDNSError-: LONGINT;
  26. (** Find the host responsible for mail exchange of the specified domain. *)
  27. PROCEDURE MailHostByDomain*( CONST domain: ARRAY OF CHAR; VAR hostname: ARRAY OF CHAR; VAR res: LONGINT );
  28. BEGIN
  29. HALT( 99 ); (* not implemented yet. needed ?? *)
  30. hostname[0] := 0X
  31. END MailHostByDomain;
  32. (** Find the IP address of the specified host. *)
  33. PROCEDURE HostByName*( CONST hostname: ARRAY OF CHAR; VAR addr: IP.Adr; VAR res: LONGINT );
  34. VAR
  35. hostent: Hostent;
  36. firstaddrPtr: ADDRESS;
  37. BEGIN {EXCLUSIVE}
  38. hostent := gethostbyname( ADDRESSOF( hostname ) );
  39. IF hostent # NIL THEN
  40. S.GET( hostent.addrlist, firstaddrPtr );
  41. IF hostent.length = 4 THEN
  42. S.MOVE( firstaddrPtr, ADDRESSOF( addr.ipv4Adr ), 4 );
  43. addr.usedProtocol := IP.IPv4;
  44. ELSE
  45. S.MOVE( firstaddrPtr, ADDRESSOF( addr.ipv6Adr ), 16 );
  46. addr.usedProtocol := IP.IPv6;
  47. END;
  48. res := Ok
  49. ELSE
  50. res := NotFound
  51. END
  52. END HostByName;
  53. (** Find the host name of the specified IP address. *)
  54. PROCEDURE HostByNumber*( addr: IP.Adr; VAR hostname: ARRAY OF CHAR; VAR res: LONGINT );
  55. VAR
  56. hostent: Hostent;
  57. namePtr: ADDRESS;
  58. ch: CHAR; i: INTEGER;
  59. BEGIN {EXCLUSIVE}
  60. IF IP.IsNilAdr( addr ) THEN
  61. hostname[0] := 0X; res := BadName; RETURN
  62. END;
  63. IF addr.usedProtocol = IP.IPv4 THEN
  64. hostent := gethostbyaddr( ADDRESSOF( addr.ipv4Adr ), 4, Unix.PFINET )
  65. ELSE
  66. hostent := gethostbyaddr( ADDRESSOF( addr.ipv6Adr ), 16, Unix.PFINET6 )
  67. END;
  68. IF hostent # NIL THEN (* err points to struct hostent *)
  69. S.GET( hostent.name, namePtr );
  70. i := 0;
  71. REPEAT
  72. S.GET( namePtr + i, ch );
  73. hostname[i]:= ch; INC( i )
  74. UNTIL ch = 0X;
  75. res := Ok
  76. ELSE
  77. res := NotFound
  78. END
  79. END HostByNumber;
  80. (* none portable, Unix ports only! *)
  81. PROCEDURE GetHostName*( VAR name: ARRAY OF CHAR; VAR res: LONGINT );
  82. VAR x: LONGINT;
  83. BEGIN
  84. x := gethostname( ADDRESSOF( name ), LEN( name ) );
  85. IF x >= 0 THEN res := Ok ELSE res := NotFound END
  86. END GetHostName;
  87. PROCEDURE GetLocalDomain( VAR dom: ARRAY OF CHAR );
  88. VAR f: Files.File; r: Files.Reader; buf: ARRAY 256 OF CHAR; ignore: BOOLEAN;
  89. BEGIN
  90. f := Files.Old( "/etc/resolv.conf" );
  91. IF f # NIL THEN
  92. Files.OpenReader( r, f, 0 );
  93. WHILE r.GetString( buf ) & (buf # "domain") DO
  94. IF buf[0] = "#" THEN r.Ln( buf ) END (* skip comment *)
  95. END;
  96. IF buf = "domain" THEN ignore := r.GetString( buf );
  97. ELSE buf := "unknown.edu"
  98. END
  99. ELSE buf := "unknown.edu"
  100. END;
  101. COPY( buf, dom )
  102. END GetLocalDomain;
  103. BEGIN
  104. GetLocalDomain( domain );
  105. NDNSReceived := 0;
  106. NDNSSent := 0;
  107. NDNSMismatchID := 0;
  108. NDNSError := 0;
  109. IF Unix.Version = "Darwin" THEN
  110. nlib := Unix.libc
  111. ELSE
  112. nlib := Unix.Dlopen( "libnsl.so.1", 2 );
  113. IF nlib = 0 THEN nlib := Unix.Dlopen( "libnsl.so", 2 ) END;
  114. IF nlib = 0 THEN
  115. Out.String( "Unix.Dlopen( 'libnsl.so' ) failed" ); Out.Ln
  116. END;
  117. END;
  118. Unix.Dlsym( nlib, "gethostbyaddr", ADDRESSOF( gethostbyaddr ) );
  119. Unix.Dlsym( nlib, "gethostbyname", ADDRESSOF( gethostbyname ) );
  120. Unix.Dlsym( nlib, "gethostname", ADDRESSOF( gethostname ) );
  121. END DNS.