UnixOperatingSystem.st
changeset 25364 7ec3bfc7f070
parent 25361 4ea026855e31
child 25368 4450c5cecd9c
--- a/UnixOperatingSystem.st	Fri Apr 17 09:46:35 2020 +0200
+++ b/UnixOperatingSystem.st	Mon Apr 20 13:57:16 2020 +0200
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 1988 by Claus Gittinger
 	      All Rights Reserved
@@ -1955,41 +1953,41 @@
 
     if ((dirPointer != nil)
      && __isExternalAddressLike(dirPointer)) {
-	d = (DIR *)__FILEVal(dirPointer);
-
-	__BEGIN_INTERRUPTABLE__
-	do {
-	    do {
-		__threadErrno = 0;
-		dp = readdir(d);
-		/*
-		 * for compatibility with ST-80,
-		 * skip entries for '.' and '..'.
-		 * If wanted, these must be added synthetically.
-		 */
-	    } while (dp && ((strcmp(dp->d_name, ".")==0) || (strcmp(dp->d_name, "..")==0)));
-	} while ((dp == NULL) && (__threadErrno == EINTR));
-	__END_INTERRUPTABLE__
-
-	if (dp != NULL) {
-	    entry = __MKSTRING((char *)(dp->d_name));
-	} else {
-	    if (__threadErrno) {
-		error = __mkSmallInteger(__threadErrno);
-	    }
+        d = (DIR *)__FILEVal(dirPointer);
+
+        __BEGIN_INTERRUPTABLE__
+        do {
+            do {
+                __threadErrno = 0;
+                dp = readdir(d);
+                /*
+                 * for compatibility with ST-80,
+                 * skip entries for '.' and '..'.
+                 * If wanted, these must be added synthetically.
+                 */
+            } while (dp && ((strcmp(dp->d_name, ".")==0) || (strcmp(dp->d_name, "..")==0)));
+        } while ((dp == NULL) && (__threadErrno == EINTR));
+        __END_INTERRUPTABLE__
+
+        if (dp != NULL) {
+            entry = __MKSTRING((char *)(dp->d_name));
+        } else {
+            if (__threadErrno) {
+                error = __mkSmallInteger(__threadErrno);
+            }
        }
     }
 #endif /* HAS_OPENDIR */
 %}.
     error notNil ifTrue:[
-	^ StreamIOError newException
-	    errorCode:error;
-	    osErrorHolder:(OperatingSystem errorHolderForNumber:error);
-	    parameter:aDirectoryStream;
-	    raiseRequest
+        ^ StreamIOError newException
+            errorCode:error;
+            osErrorHolder:(self errorHolderForNumber:error);
+            parameter:aDirectoryStream;
+            raiseRequest
     ].
     entry notNil ifTrue:[
-	^ FileStatusInfo new sourcePath:(self decodePath:entry).
+        ^ FileStatusInfo new sourcePath:(self decodePath:entry).
     ].
     ^ aDirectoryStream pastEndRead
 ! !
@@ -3804,8 +3802,11 @@
 !
 
 copyFromFd:inFd toFd:outFd startIndex:startIdx count:count
-    "directly copy from one Fd to another (if supported by the OS)"
-
+    "directly copy data from inFd to outFd (if supported by the OS).
+     Start the copy at the 0-based index startIdx of inFd and copy count bytes.
+     Answer the number of bytes copied."
+
+    |error|
 %{
 #if defined(HAS_SENDFILE)
 # include <sys/sendfile.h>
@@ -3817,27 +3818,43 @@
         off_t startOffset = __intVal(startIdx);
         ssize_t __count = __intVal(count);
         ssize_t totalCount = 0;
-        
+
         // sendfile may copy partial data, so do it in a loop.
         // caller has to check that all data has been written and take measure if not.
         do {
             ssize_t writeCount = sendfile(__intVal(outFd), __intVal(inFd), &startOffset, __count);
             if (writeCount < 0) {
-                @global(LastErrorNumber) = __mkSmallInteger(errno);
-                __count = 0;
+                error = __mkSmallInteger(errno);
+                __count = -1;
             } else {
                 totalCount += writeCount;
                 startOffset += writeCount;    // in case we have to loop
                 __count -= writeCount;
             }    
-        } while (__count > 0);   
-        RETURN (__mkSmallInteger(totalCount));
+        } while (__count > 0);  
+        if (__count >= 0) {
+            RETURN (__mkSmallInteger(totalCount));
+        }    
      }
 #endif
 %}.
+
+    error notNil ifTrue:[
+        LastErrorNumber := error.
+        ^ WriteError newException
+            errorCode:error;
+            osErrorHolder:(self errorHolderForNumber:error);
+            parameter:outFd;
+            raiseRequest
+    ].    
     ^ 0 "/ not supported
 
-    "Modified: / 15-04-2020 / 16:36:03 / Stefan Vogel"
+    "
+    This should fail:
+        self copyFromFd:500 toFd:200 startIndex:1 count:20
+    "
+
+    "Modified (comment): / 20-04-2020 / 11:41:51 / Stefan Vogel"
 !
 
 createDirectory:aPathName
@@ -9813,7 +9830,7 @@
      Codeset := #'utf8-mac'.
      CodesetEncoder := nil.
      OperatingSystem getCodesetEncoder
-     OperatingSystem encodePath:'äöü'
+     OperatingSystem encodePath:'äöü'
     "
 
     "Modified: / 23-01-2013 / 10:00:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -13676,9 +13693,9 @@
 	    domain:#'AF_UNSPEC' type:nil protocol:nil flags:nil
      self getAddressInfo:'www.exept.de' serviceName:nil
 	    domain:#'AF_INET6' type:nil protocol:nil flags:nil
-     self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
+     self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
 	    domain:#'AF_INET' type:#stream protocol:nil flags:nil
-     self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
+     self getAddressInfo:'www.baden-württemberg.de' serviceName:nil
 	    domain:#'AF_INET6' type:#stream protocol:nil flags:nil
     "