Patch title: Release 93 bulk changes
Abstract:
File: /language/stream/serial.pli
Key:
    Removed line
    Added line
   
# Copyright  Thomas Bakketun
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


method fs open name options flags stream support -> status
  oarg_rw SerialFileSystem fs ; arg Str name options ; arg I
  var Int port speed databits stopbits
  var Str parity flowcontrol
# Copyright  Thomas Bakketun
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


method fs open name options flags stream support -> status
  oarg_rw SerialFileSystem fs ; arg Str name options ; arg I
  var Int port speed databits stopbits
  var Str parity flowcontrol

  if not (name parse port)
    return failure
  if os_api="linux"
    var Str device
    if (name parse port)
      device := "ttyS"+string:port
    else
      device := name
  else
    if not (name parse port)
      return failure
  speed := options option "speed" Int
  if speed=undefined
    speed := options option "baud" Int # just to be backward
  databits := options option "databits" Int 8
  parity := options option "parity" Str
  stopbits := options option "stopbits" Int 1
  flowcontrol := options option "flowcontrol" Str
  if speed=undefined
    return failure
  if os_api="linux"
    var Int mode
    if (flags .and. in_out)=in
      mode := os_O_RDONLY
    else
      mode := os_O_RDWR
  speed := options option "speed" Int
  if speed=undefined
    speed := options option "baud" Int # just to be backward
  databits := options option "databits" Int 8
  parity := options option "parity" Str
  stopbits := options option "stopbits" Int 1
  flowcontrol := options option "flowcontrol" Str
  if speed=undefined
    return failure
  if os_api="linux"
    var Int mode
    if (flags .and. in_out)=in
      mode := os_O_RDONLY
    else
      mode := os_O_RDWR
    var Int handle := os_open "/dev/ttyS"+string:port mode+o
    var Int handle := os_open "/dev/"+device mode+os_O_NOCTTY+os_O_NONBLOCK 6*8*8+6*8+6
    # var Int handle := os_open "/dev/ttyS"+string:port mode
    if handle<0
      return failure
    if restore
      var os_termios old
      tcgetattr handle old
    var os_termios ios
    memory_clear addressof:ios os_termios:size
    ios c_iflags := 0
    ios c_oflags := 0
    ios c_cflags := HUPCL + CREAD
    if (flags .and. nocache)<>nocache
      ios c_lflags := ICANON
    ios:c_cc VTIME := 0 # timeout in 1/10s
    ios:c_cc VMIN := 1 # minimum number of characters to be 


    var Int err := tcsetattr handle TCSAFLUSH ios
    if err<>0
    # var Int handle := os_open "/dev/ttyS"+string:port mode
    if handle<0
      return failure
    if restore
      var os_termios old
      tcgetattr handle old
    var os_termios ios
    memory_clear addressof:ios os_termios:size
    ios c_iflags := 0
    ios c_oflags := 0
    ios c_cflags := HUPCL + CREAD
    if (flags .and. nocache)<>nocache
      ios c_lflags := ICANON
    ios:c_cc VTIME := 0 # timeout in 1/10s
    ios:c_cc VMIN := 1 # minimum number of characters to be 


    var Int err := tcsetattr handle TCSAFLUSH ios
    if err<>0
      console "failed to set serial line "+string:port+" : e
      console "failed to set serial line "+device+" : error "+string:err+"[lf]"
    os_fcntl handle os_F_SETFL 0
    var Link:SerialStreamDriver drv :> new SerialStreamDrive
    drv fd := handle
    drv timeout := undefined
    if restore
      drv ios := old
    stream stream_driver :> drv
    status := success
  eif os_api="win32"
    var uInt access := (shunt (flags .and. in)<>0 os_GENERIC
    var Int handle := os_CreateFile "COM"+string:port access
    if handle<0
      return failure
    
    var DCB dcb
    if not (os_GetCommState handle dcb)
      return failure


gvar SerialFileSystem serial_file_system
pliant_multi_file_system mount "serial:" "" serial_file_syst
    os_fcntl handle os_F_SETFL 0
    var Link:SerialStreamDriver drv :> new SerialStreamDrive
    drv fd := handle
    drv timeout := undefined
    if restore
      drv ios := old
    stream stream_driver :> drv
    status := success
  eif os_api="win32"
    var uInt access := (shunt (flags .and. in)<>0 os_GENERIC
    var Int handle := os_CreateFile "COM"+string:port access
    if handle<0
      return failure
    
    var DCB dcb
    if not (os_GetCommState handle dcb)
      return failure


gvar SerialFileSystem serial_file_system
pliant_multi_file_system mount "serial:" "" serial_file_syst