Patch title: Release 94 bulk changes
Abstract:
File: /pliant/protocol/dns/name.pli
Key:
    Removed line
    Added line
submodule "/pliant/appli/database.pli"
submodule "/pliant/storage/database.pli"
module "/pliant/protocol/http/site.pli"
module "/pliant/language/type/text/str8.pli"

public


type NameIP
  field Str ip
  field Char location <- "F" # Fixed Mobile
  field Str ip # or host
  field Str options
  field Str comment

type NameDomain
  field Set:Str dns
  field Set:Str mail
  field Str mailbox
  field Bool authoritative <- true

type NameReverse
  field Set:Str ptr

type NameHost
  field Str public_key
  field Str physical
  field Str ip
  field Int http_port remote_port <- undefined
  field Int port http_port remote_port <- undefined
  field Str building
  field Str options
  field Str comment

type NameBuilding
  field Set:Str proxy
  field Str options
  field Str comment

type NameDatabase
  field Set:NameIP name
  field Set:NameDomain domain
  field Set:Str mask
  field Set:NameReverse reverse
  field Set:NameHost host
  field Set:NameBuilding building

(gvar Database:NameDatabase name_database) load "security:/name.pdb" log "security:/name.log" mount "/pliant/name"


type NameSessionKey
  field Str key
  field Str8 key
  field DateTime timestamp

type NameSecret
  field Str private_key
  field Set:NameSessionKey session
  field Set:NameSessionKey user_session

type NameSecretDatabase
  field Set:NameSecret host

(gvar Database:NameSecretDatabase name_secret_database) load "security:/name_secret.pdb"


function name_resolve name -> ip
  arg Str name ip
  if (name parse (var Int i1) "." (var Int i2) "." (var Int i3) "." (var Int i4)) or (name search ":" -1)<>(-1)
    return name
  ip := name_database:data:name:name:ip
  if ip<>""
    return
  var Data:NameHost h :> name_database:data:host:name
  if exists:h
    ip := h ip
    if ip<>""
      return
    ip := h physical
    if ip<>""
      return
  var Data:Site s :> site_database:data:site:name
  if exists:s
    ip := s ip
    if ip<>""
      return
    ip := s computer

function name_ip name -> ip
  arg Str name ip
  ip := name_resolve name
  if ip<>"" and not (ip parse (var Int i1) "." (var Int i2) "." (var Int i3) "." (var Int i4)) and (ip search ":" -1)=(-1)
    ip := name_resolve ip
    if ip<>"" and not (ip parse (var Int i1) "." (var Int i2) "." (var Int i3) "." (var Int i4)) and (ip search ":" -1)=(-1)
      ip := name_resolve ip
  if ip="" and name="localhost"
    ip := "127.0.0.1"

function name_mask name -> mask
  arg Str name mask
  var Str ip := name_ip name
  if (ip parse (var Int i1) "." (var Int i2) "." (var Int i3) "." (var Int i4))
    each m name_database:data:mask
      if (keyof:m parse (var Int d1) "." (var Int d2) "." (var Int d3) "." (var Int d4))
        if (m parse (var Int m1) "." (var Int m2) "." (var Int m3) "." (var Int m4))
          if (i1 .and. m1)=d1 and (i2 .and. m2)=d2 and (i3 .and. m3)=d3 and (i4 .and. m4)=d4
            return m  
  mask := "255.255.255.0"

export name_ip name_mask