Patch title: Release 93 bulk changes
Abstract:
File: /linux/network/ppp.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/stream/serial.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/language/ui/ansi_terminal.pli"
module "/pliant/linux/kernel/module.pli"
module "/pliant/linux/kernel/device.pli"


constant echo true
constant echo2 false
constant verbose_connect true
constant buggy true

gvar Stream modem
gvar Int modem_port
gvar Str modem_device
gvar Int modem_baud
gvar Str modem_options
gvar Float modem_timeout := 60
gvar Str modem_device
gvar Str dial_header

function modem_init port baud
  arg Int port ; arg Int baud
  modem_port := port
function modem_init port baud options
  arg Int port ; arg Int baud ; arg Str options options
  var Str device := (shunt (options option "irda") "ircomm" "ttyS")+string:port
  modem_device := "/dev/"+device
  modem_baud := baud
  modem_device :=  "/dev/ttyS"+string:port
  kernel_make_device "device:/ttyS"+string:port
  modem_options := options
  kernel_load_module "serial" # 2.4 and earlier
  kernel_load_module "8250_pci" # 2.6
  kernel_make_device "device:/"+device
  kernel_make_device "device:/ppp"
  # shell "modprobe serial"
  # shell "setserial "+modem_device+" baud_base "+string:(max baud 115200)
  modem open "serial:"+string:modem_port "baud "+string:modem_baud in+out+safe+cr+lf
  modem open "serial:"+device "baud "+string:modem_baud+" "+options in+out+safe+cr+lf
  if true
    modem configure "timeout 0.2"
    while not modem:atend
      modem readline
    if (modem configure "timeout "+string:modem_timeout)=failure
      error "Failed to set modem timeout"


method s readline2 -> l
  arg_rw Stream s ; arg Str l
  l := s readline
  if l:len>0 and (l l:len-1)="[cr]"
    l := l 0 l:len-1
    console "!"
  if buggy
    l := ""
    part read_the_line
      s raw_read addressof:(var Char ch) 1
      if ch="[lf]" or s=failure
        leave read_the_line
      if echo2
        console ch:number " "
      if ch:number>=32 and ch:number<128
        l += ch
      restart read_the_line
    if echo2
      console eol
  else
    l := s readline
    if l:len>0 and (l l:len-1)="[cr]"
      l := l 0 l:len-1
      console "!"


function at cmd -> answer
  arg Str cmd answer
  modem writeline cmd
  modem flush anytime ; sleep 0.5
  if echo
    var Str echo := modem readline2
    var Int retry := 0
    while echo="" and retry<5
      console "... " ; sleep 1
      echo := modem readline2
      retry += 1
    if echo<>cmd
      error "Invalid modem echo ("+cmd+" -> "+echo+")"
  console cmd
  answer := modem readline2
  var Int retry := 0
  while answer="" and retry<5
    console " ..." ; sleep 1
    answer := modem readline2
    retry += 1
  console " -> "+answer+"[lf]"
  

function command settings
  arg Str settings
  modem_init 1 115200
  modem_init 1 115200 ""
  var Str ats := settings
  while (ats parse any:(var Str at1) _ any:(var Str remain))
    at at1
    ats := remain
  modem writeline ats
  modem flush anytime ; sleep 0.5
  var Str echo := ""
  while not modem:atend and echo<>"OK"
    echo := modem readline
    console "-> "+echo+"[lf]"

  
function connect port baud settings phone_number -> status
  arg Int port baud ; arg Str settings phone_number ; arg Status status
  modem_init port baud
function connect port baud options settings phone_number -> status
  arg Int port baud ; arg Str options settings phone_number ; arg Status status
  modem_init port baud options
  var Str ats := settings
  while ats<>""
    if not (ats parse any:(var Str at1) _ any:(var Str remain))
      at1 := ats ; remain := ""
    if at:at1<>"OK"
      error "Failed to initialize modem"
    ats := remain
  var Str answer := at "ATDT"+dial_header+phone_number
  if verbose_connect
    while (answer search "CONNECT" -1)=(-1)
      console answer+"[lf]"
      answer := modem readline2
  status := shunt (answer search "CONNECT" -1)<>(-1) success failure
  if status=failure
    sleep 2


function ppp_login server user password dns
  arg Str server user password dns
  var Stream pap ; pap open "file:/etc/ppp/pap-secrets" out+mkdir
  pap writeline "# client server secret IP addresses"
  pap writeline user+" "+server+" "+password
  pap writeline (shunt user<>"" user "[dq][dq]")+" "+(shunt server<>"" server "*")+" "+(shunt password<>"" password "[dq][dq]")
  pap close
  if dns<>""
    var Stream resolv ; resolv open "file:/etc/resolv.conf" out
    resolv writeline "nameserver "+(replace dns " " "[lf]nameserver ")
    resolv close
  else
    file_delete "file:/etc/resolv.conf"
  execute "modprobe ppp" quiet # Linux 2.2 kernel
  execute "modprobe ppp_async" # Linux 2.4 kernel
  kernel_load_module "ppp" # 2.2
  kernel_load_module "ppp_async" # 2.4
  kernel_load_module "ppp_deflate" # extra in 2.6

function ppp_logout
  file_delete "file:/etc/resolv.conf"
  file_delete "file:/etc/ppp/pap-secrets"


function ppp server user password dns local_ip host_ip net_mask options
  arg Str server user password dns local_ip host_ip net_mask options
  ppp_login server user password dns
  execute "route del default" quiet
  console "starting ppp[lf]"
  var Str cmd := "pppd "+modem_device+" "+string:modem_baud
  if local_ip<>"" or host_ip<>""    
    cmd += " "+local_ip+":"+host_ip+" netmask "+net_mask
  # cmd += " debug"
  cmd += " nodetach crtscts noauth defaultroute"
    cmd += " "+local_ip+":"+host_ip
  if net_mask<>""
    cmd += " netmask "+net_mask
  if (modem_options option "flowcontrol" Str)<>"none"
    cmd += " crtscts"
  cmd += " nodetach noauth defaultroute replacedefaultroute"
  if user<>""
    cmd += " user "+user+" remotename "+server
    cmd += " user "+user
  if server<>""
    cmd += " remotename "+server
  if options<>""
    cmd += " "+options
  console "command is " cmd eol
  console "Connection 鴡blie.[lf]"
  console "Appuyez sur <-' pour terminer[lf]"
  thread
    execute cmd
  keyboard_input ""
  console "hanging up[lf]"
  execute "killall pppd"
  ppp_logout

function ppp server user password dns
  arg Str server user password dns
  ppp server user password dns "" "" "" ""


export modem '. readline2' dial_header command connect ppp