瀏覽代碼

Fixed stack allocated option passed to setsockopt

git-svn-id: https://svn-dept.inf.ethz.ch/svn/lecturers/a2/trunk@8714 8c9fc860-2736-0410-a75d-ab315db34111
negelef 6 年之前
父節點
當前提交
e1e10284e4
共有 1 個文件被更改,包括 9 次插入15 次删除
  1. 9 15
      source/Unix.Sockets.Mod

+ 9 - 15
source/Unix.Sockets.Mod

@@ -42,25 +42,21 @@ TYPE
 	END;
 
 
-	SocketOption = POINTER TO RECORD END;
+	SocketOption = RECORD END;
 		
-	Linger = POINTER TO RECORD (SocketOption)
+	Linger = RECORD (SocketOption)
 		onoff	: LONGINT;
 		linger	: LONGINT;
 	END;
 		
-	Switch = POINTER TO RECORD (SocketOption)
+	Switch = RECORD (SocketOption)
 		onoff	: LONGINT
 	END;
 
-CONST 
-	LingerSize = 8;
-
-
 
 VAR
 	socket		: PROCEDURE {C} ( af, typ, protocol: LONGINT ): LONGINT;		
-	setsockopt	: PROCEDURE {C} ( s: LONGINT; level, optname: LONGINT; opt: SocketOption; optlen: LONGINT): LONGINT;
+	setsockopt	: PROCEDURE {C} ( s: LONGINT; level, optname: LONGINT; VAR opt: SocketOption; optlen: LONGINT): LONGINT;
 	accept		: PROCEDURE {C} ( s: LONGINT; adrPtr: ADDRESS; VAR adrlen: LONGINT ): LONGINT;
 	bind		: PROCEDURE {C} ( s: LONGINT; adr: SocketAdr; adrlen: LONGINT ): LONGINT;
 	connect		: PROCEDURE {C} ( s: LONGINT; adr: SocketAdr; adrlen: LONGINT ): LONGINT;
@@ -349,8 +345,8 @@ VAR
 		linger: Linger;
 		err: LONGINT;
 	BEGIN
-		NEW( linger);  linger.onoff := 1;  linger.linger := 1;
-		err := setsockopt( s, Unix.SoLSocket, Unix.SoLinger, linger, LingerSize );
+		linger.onoff := 1;  linger.linger := 1;
+		err := setsockopt( s, Unix.SoLSocket, Unix.SoLinger, linger, SIZE OF Linger);
 		IF err # 0 THEN  Unix.Perror(  "Sockets.SetLinger (setsockopt)" )  END;
 		RETURN err = 0 
 	END SetLinger;
@@ -360,9 +356,8 @@ VAR
 		opt: Switch;
 		err: LONGINT;
 	BEGIN
-		NEW( opt );  
 		IF enable THEN  opt.onoff := 1  ELSE  opt.onoff := 0  END;  
-		err := setsockopt( s, Unix.SoLSocket, Unix.SoKeepAlive, opt, 4 );
+		err := setsockopt( s, Unix.SoLSocket, Unix.SoKeepAlive, opt, SIZE OF Switch );
 		IF err # 0 THEN  Unix.Perror(  "Sockets.KeepAlive (setsockopt)" )  END;
 		RETURN err = 0 
 	END KeepAlive;
@@ -373,9 +368,8 @@ VAR
 		opt: Switch;
 		err: LONGINT;
 	BEGIN
-		NEW( opt );  
 		IF enable THEN  opt.onoff := 1  ELSE  opt.onoff := 0  END;  
-		err := setsockopt( s, Unix.SoLSocket, Unix.SoNoDelay, opt, 4 );
+		err := setsockopt( s, Unix.SoLSocket, Unix.SoNoDelay, opt, SIZE OF Switch );
 		IF err # 0 THEN  Unix.Perror(  "Sockets.NoDelay (setsockopt)" )  END;
 		RETURN err = 0 
 	END NoDelay;
@@ -433,4 +427,4 @@ VAR
 
 BEGIN
 	Init
-END Sockets.
+END Sockets.