Browse Source

--- Merging r21232 into '.':
U rtl/openbsd/termiosproc.inc
U rtl/freebsd/termiosproc.inc
U rtl/netbsd/termiosproc.inc
--- Merging r21233 into '.':
G rtl/freebsd/termiosproc.inc
--- Merging r21234 into '.':
G rtl/freebsd/termiosproc.inc
--- Merging r21240 into '.':
G rtl/openbsd/termiosproc.inc
G rtl/netbsd/termiosproc.inc

# revisions: 21232,21233,21234,21240
r21232 | marco | 2012-05-05 17:03:12 +0200 (Sat, 05 May 2012) | 2 lines
Changed paths:
M /trunk/rtl/freebsd/termiosproc.inc
M /trunk/rtl/netbsd/termiosproc.inc
M /trunk/rtl/openbsd/termiosproc.inc

* fix Mantis #21665 for net/free/openbsd
r21233 | marco | 2012-05-05 17:10:10 +0200 (Sat, 05 May 2012) | 2 lines
Changed paths:
M /trunk/rtl/freebsd/termiosproc.inc

* Improved tcsendbreak
r21234 | marco | 2012-05-05 17:18:50 +0200 (Sat, 05 May 2012) | 2 lines
Changed paths:
M /trunk/rtl/freebsd/termiosproc.inc

* improve tcflow
r21240 | marco | 2012-05-05 22:15:43 +0200 (Sat, 05 May 2012) | 2 lines
Changed paths:
M /trunk/rtl/netbsd/termiosproc.inc
M /trunk/rtl/openbsd/termiosproc.inc

* tcflow and tcsendbreak fix for open/net

git-svn-id: branches/fixes_2_6@21473 -

marco 13 years ago
parent
commit
e351ca2a3d
3 changed files with 159 additions and 20 deletions
  1. 52 6
      rtl/freebsd/termiosproc.inc
  2. 54 8
      rtl/netbsd/termiosproc.inc
  3. 53 6
      rtl/openbsd/termiosproc.inc

+ 52 - 6
rtl/freebsd/termiosproc.inc

@@ -78,11 +78,19 @@ begin
 end;
 
 Function TCSendBreak(fd,duration:cint):cint; {$ifdef VER2_0}inline;{$endif}
+var
+    sleepytime : ttimeval;
 begin
-  TCSendBreak:=fpIOCtl(fd,TIOCSBRK,nil);
+ sleepytime.tv_sec := 0;
+ sleepytime.tv_usec := 400000;
+ if fpioctl(fd, TIOCSBRK, nil) = -1 then
+    exit(-1);
+ fpselect(0, nil, nil, nil, @sleepytime);
+ if fpioctl(fd, TIOCCBRK, nil) = -1 then
+   exit(-1);
+ TCSendBreak:=0;
 end;
 
-
 Function TCSetPGrp(fd,id:cint):cint; {$ifdef VER2_0}inline;{$endif}
 begin
   TCSetPGrp:=fpIOCtl(fd,TIOCSPGRP,pointer(id));
@@ -99,19 +107,57 @@ begin
   TCDrain:=fpIOCtl(fd,TIOCDRAIN,nil); {Should set timeout to 1 first?}
 end;
 
+const 
+   _POSIX_VDISABLE = $ff;
 
 Function TCFlow(fd,act:cint):cint; {$ifdef VER2_0}inline;{$endif}
+var
+  term:Termios;
+  c : cuchar;
+  tmp : cint;
 begin
     case act OF
      TCOOFF :  TCFlow:=fpIoctl(fd,TIOCSTOP,nil);
      TCOOn  :  TCFlow:=fpIOctl(Fd,TIOCStart,nil);
-     TCIOFF :  {N/I}
-    end;
+     TCION,
+     TCIOFF :  begin
+	         if tcgetattr(fd, term) = -1 then
+                        exit(-1);
+                 if act=TCIOFF then  
+                   tmp:=VSTOP
+                 else
+                   tmp:=VSTART;
+                 c:=term.c_cc[tmp];
+                 if (c <> _POSIX_VDISABLE) and 
+			(fpwrite(fd, c, sizeof(c)) = -1) then
+                   exit (-1);
+                TCFlow:=0;
+              end;
+          else
+            begin
+              errno := esysEINVAL;
+              exit(-1);
+            end;
+      end;
 end;
 
-Function TCFlush(fd,qsel:cint):cint; {$ifdef VER2_0}inline;{$endif}
+const FREAD  = 1; // marked "BSD visible"
+      FWRITE = 2;
+
+Function TCFlush(fd,qsel:cint):cint;  {$ifdef VER2_0}inline;{$endif}
+var comval : cint;
 begin
-  TCFlush:=fpIOCtl(fd,TIOCFLUSH,pointer(qsel));
+  case qsel of
+     TCIFlush  : comval:=FREAD;
+     TCOFlush  : comval:=FWRITE;
+     TCIOFlush : comval:=FREAD or FWRITE;
+    else
+     begin
+       errno:=ESysEINVAL;
+       exit(-1);
+     end;
+   end;
+  TCFlush:=fpIOCtl(fd,TIOCFLUSH,pointer(@comval));
 end;
 
 Function IsATTY (Handle:cint):cint;

+ 54 - 8
rtl/netbsd/termiosproc.inc

@@ -73,12 +73,20 @@ begin
    end;
 end;
 
-Function TCSendBreak(fd,duration:cint):cint;
+Function TCSendBreak(fd,duration:cint):cint; {$ifdef VER2_0}inline;{$endif}
+var
+    sleepytime : ttimeval;
 begin
-  TCSendBreak:=fpIOCtl(fd,TIOCSBRK,nil);
+ sleepytime.tv_sec := 0;
+ sleepytime.tv_usec := 400000;
+ if fpioctl(fd, TIOCSBRK, nil) = -1 then
+    exit(-1);
+ fpselect(0, nil, nil, nil, @sleepytime);
+ if fpioctl(fd, TIOCCBRK, nil) = -1 then
+   exit(-1);
+ TCSendBreak:=0;
 end;
 
-
 Function TCSetPGrp(fd,id:cint):cint;
 begin
   TCSetPGrp:=fpIOCtl(fd,TIOCSPGRP,pointer(id));
@@ -95,19 +103,57 @@ begin
   TCDrain:=fpIOCtl(fd,TIOCDRAIN,nil); {Should set timeout to 1 first?}
 end;
 
+const 
+   _POSIX_VDISABLE = $ff;
 
-Function TCFlow(fd,act:cint):cint;
+Function TCFlow(fd,act:cint):cint; {$ifdef VER2_0}inline;{$endif}
+var
+  term:Termios;
+  c : cuchar;
+  tmp : cint;
 begin
     case act OF
      TCOOFF :  TCFlow:=fpIoctl(fd,TIOCSTOP,nil);
      TCOOn  :  TCFlow:=fpIOctl(Fd,TIOCStart,nil);
-     TCIOFF :  {N/I}
-    end;
+     TCION,
+     TCIOFF :  begin
+	         if tcgetattr(fd, term) = -1 then
+                        exit(-1);
+                 if act=TCIOFF then  
+                   tmp:=VSTOP
+                 else
+                   tmp:=VSTART;
+                 c:=term.c_cc[tmp];
+                 if (c <> _POSIX_VDISABLE) and 
+			(fpwrite(fd, c, sizeof(c)) = -1) then
+                   exit (-1);
+                TCFlow:=0;
+              end;
+          else
+            begin
+              errno := esysEINVAL;
+              exit(-1);
+            end;
+      end;
 end;
 
-Function TCFlush(fd,qsel:cint):cint;
+const FREAD  = 1; // marked "BSD visible"
+      FWRITE = 2;
+
+Function TCFlush(fd,qsel:cint):cint;  {$ifdef VER2_0}inline;{$endif}
+var comval : cint;
 begin
-  TCFlush:=fpIOCtl(fd,TIOCFLUSH,pointer(qsel));
+  case qsel of
+     TCIFlush  : comval:=FREAD;
+     TCOFlush  : comval:=FWRITE;
+     TCIOFlush : comval:=FREAD or FWRITE;
+    else
+     begin
+       errno:=ESysEINVAL;
+       exit(-1);
+     end;
+   end;
+  TCFlush:=fpIOCtl(fd,TIOCFLUSH,pointer(@comval));
 end;
 
 Function IsATTY (Handle:cint):cint;

+ 53 - 6
rtl/openbsd/termiosproc.inc

@@ -73,12 +73,21 @@ begin
    end;
 end;
 
-Function TCSendBreak(fd,duration:cint):cint;{$ifdef VER2_0}inline;{$endif}
+
+Function TCSendBreak(fd,duration:cint):cint; {$ifdef VER2_0}inline;{$endif}
+var
+    sleepytime : ttimeval;
 begin
-  TCSendBreak:=fpIOCtl(fd,TIOCSBRK,nil);
+ sleepytime.tv_sec := 0;
+ sleepytime.tv_usec := 400000;
+ if fpioctl(fd, TIOCSBRK, nil) = -1 then
+    exit(-1);
+ fpselect(0, nil, nil, nil, @sleepytime);
+ if fpioctl(fd, TIOCCBRK, nil) = -1 then
+   exit(-1);
+ TCSendBreak:=0;
 end;
 
-
 Function TCSetPGrp(fd,id:cint):cint;{$ifdef VER2_0}inline;{$endif}
 begin
   TCSetPGrp:=fpIOCtl(fd,TIOCSPGRP,pointer(id));
@@ -95,19 +104,57 @@ begin
   TCDrain:=fpIOCtl(fd,TIOCDRAIN,nil); {Should set timeout to 1 first?}
 end;
 
+const 
+   _POSIX_VDISABLE = $ff;
 
 Function TCFlow(fd,act:cint):cint; {$ifdef VER2_0}inline;{$endif}
+var
+  term:Termios;
+  c : cuchar;
+  tmp : cint;
 begin
     case act OF
      TCOOFF :  TCFlow:=fpIoctl(fd,TIOCSTOP,nil);
      TCOOn  :  TCFlow:=fpIOctl(Fd,TIOCStart,nil);
-     TCIOFF :  {N/I}
-    end;
+     TCION,
+     TCIOFF :  begin
+	         if tcgetattr(fd, term) = -1 then
+                        exit(-1);
+                 if act=TCIOFF then  
+                   tmp:=VSTOP
+                 else
+                   tmp:=VSTART;
+                 c:=term.c_cc[tmp];
+                 if (c <> _POSIX_VDISABLE) and 
+			(fpwrite(fd, c, sizeof(c)) = -1) then
+                   exit (-1);
+                TCFlow:=0;
+              end;
+          else
+            begin
+              errno := esysEINVAL;
+              exit(-1);
+            end;
+      end;
 end;
 
+const FREAD  = 1; // marked "BSD visible"
+      FWRITE = 2;
+
 Function TCFlush(fd,qsel:cint):cint;  {$ifdef VER2_0}inline;{$endif}
+var comval : cint;
 begin
-  TCFlush:=fpIOCtl(fd,TIOCFLUSH,pointer(qsel));
+  case qsel of 
+     TCIFlush  : comval:=FREAD;
+     TCOFlush  : comval:=FWRITE;
+     TCIOFlush : comval:=FREAD or FWRITE;
+    else
+     begin
+       errno:=ESysEINVAL;
+       exit(-1);
+     end;
+   end;
+  TCFlush:=fpIOCtl(fd,TIOCFLUSH,pointer(@comval));
 end;
 
 Function IsATTY (Handle:cint):cint;