Getdomainname for Unixware.
authorStefan Vogel <sv@exept.de>
Tue, 21 May 1996 13:11:56 +0200
changeset 1433 8b2eacaea59c
parent 1432 441054addd1e
child 1434 a317ba02d685
Getdomainname for Unixware. Plain wait() may block. Make it interruptable.
Unix.st
--- a/Unix.st	Mon May 20 17:47:19 1996 +0200
+++ b/Unix.st	Tue May 21 13:11:56 1996 +0200
@@ -10,6 +10,8 @@
  hereby transferred.
 "
 
+'From Smalltalk/X, Version:2.10.9 on 26-apr-1996 at 10:05:20'                   !
+
 Object subclass:#OperatingSystem
 	instanceVariableNames:''
 	classVariableNames:'HostName DomainName LastErrorNumber LastExecStatus OSSignals
@@ -20,6 +22,7 @@
 !
 
 !OperatingSystem primitiveDefinitions!
+
 %{
 #define UNIX_LIKE
 
@@ -349,6 +352,10 @@
 #  include <sys/wait.h>
 # endif
 
+# if defined(HAS_SYSINFO)
+#  include <sys/systeminfo.h>
+# endif
+
 #endif /* ! transputer */
 
 /*
@@ -5211,12 +5218,12 @@
 getDomainName
     "return the domain this host is in.
      Notice:
-	not all systems support this; on some, 'unknown' is returned."
+        not all systems support this; on some, 'unknown' is returned."
 
     |name|
 
     DomainName notNil ifTrue:[
-	^ DomainName
+        ^ DomainName
     ].
 
 %{  /* STACK: 2048 */
@@ -5224,27 +5231,36 @@
     char buffer[128];
 
     if (getdomainname(buffer, sizeof(buffer)) == 0) {
-	name = __MKSTRING(buffer COMMA_CON);
+        name = __MKSTRING(buffer COMMA_CON);
     }
 #else
 # if defined(HAS_UNAME) && defined(HAS_UTS_DOMAINNAME)
     struct utsname ubuff;
 
     if (uname(&ubuff) >= 0) {
-	name = __MKSTRING(ubuff.domainname COMMA_CON);
-    }
+        name = __MKSTRING(ubuff.domainname COMMA_CON);
+    }
+# else
+#  if defined(HAS_SYSINFO) && defined(SI_SRPC_DOMAIN)
+    char buffer[256];
+    int ret;
+
+    if ((ret = sysinfo(SI_SRPC_DOMAIN, buffer, sizeof(buffer))) >= 0 && ret <= sizeof(buffer)) {
+        name = __MKSTRING(buffer COMMA_CON);
+    }
+#  endif
 # endif
 #endif
 %}.
     name isNil ifTrue:[
-	name := self getEnvironment:'DOMAIN'.
-	name isNil ifTrue:[
-	    name := self getCommandOutputFrom:'domainname'
-	]
+        name := self getEnvironment:'DOMAIN'.
+        name isNil ifTrue:[
+            name := self getCommandOutputFrom:'domainname'
+        ]
     ].
     name isNil ifTrue:[
-	'OS: cannot find out domainname' errorPrintNL.
-	name := 'unknown'.
+        'OS: cannot find out domainname' errorPrintNL.
+        name := 'unknown'.
     ].
     DomainName := name.
     ^ name
@@ -5252,6 +5268,8 @@
     "
      OperatingSystem getDomainName
     "
+
+    "Modified: 26.4.1996 / 10:04:54 / stefan"
 !
 
 getEnvironment:aStringOrSymbol
@@ -6977,6 +6995,7 @@
 # else /*!HAS_WAIT3*/
     int s;
 # define __WAIT      wait(&s)
+# define __BLOCKING_WAIT__ 1
 
 #  if !defined(WIFEXITED)
 #   define WIFEXITED(stat)      (((int)((stat)&0377))==0)
@@ -6992,51 +7011,60 @@
 #  endif /*!WCOREDUMP*/
 
     if (blocking != true) {
-	/*
-	 * We do not support nonBlocking waits, so signal an error
-	 * Sorry about the goto, but with all these ifdefs ...
-	 */
-	goto done;
+        /*
+         * We do not support nonBlocking waits, so signal an error
+         * Sorry about the goto, but with all these ifdefs ...
+         */
+        goto done;
     }
 # endif /*!HAS_WAIT3*/
 #endif  /*!HAS_WAITPID*/
 
+#if __BLOCKING_WAIT__
+    __BEGIN_INTERRUPTABLE__
+#endif
+
     do {
-	p = __WAIT;
+        p = __WAIT;
     } while (p == -1 && errno == EINTR);
 
+#if __BLOCKING_WAIT__
+    __END_INTERRUPTABLE__
+# undef __BLOCKING_WAIT__
+#endif
+
 #undef __WAIT
 
     if (p == 0)
-	RETURN(nil)
+        RETURN(nil)
 
     if (p == -1) {
-	if (errno == ECHILD)
-	    RETURN(nil);
+        if (errno == ECHILD)
+            RETURN(nil);
     } else {
-	pid = __MKSMALLINT(p);
-	if (WIFEXITED(s)) {
-	    status = @symbol(exit);
-	    code = __MKSMALLINT(WEXITSTATUS(s));
-	    core = WCOREDUMP(s) ? true : false;
-	} else if (WIFSIGNALED(s)) {
-	    status = @symbol(signal);
-	    code = __MKSMALLINT(WTERMSIG(s));
-	} else if (WIFSTOPPED(s)) {
-	    status = @symbol(stop);
-	    code = __MKSMALLINT(WSTOPSIG(s));
-	}
+        pid = __MKSMALLINT(p);
+        if (WIFEXITED(s)) {
+            status = @symbol(exit);
+            code = __MKSMALLINT(WEXITSTATUS(s));
+            core = WCOREDUMP(s) ? true : false;
+        } else if (WIFSIGNALED(s)) {
+            status = @symbol(signal);
+            code = __MKSMALLINT(WTERMSIG(s));
+        } else if (WIFSTOPPED(s)) {
+            status = @symbol(stop);
+            code = __MKSMALLINT(WSTOPSIG(s));
+        }
 #if defined(WIFCONTINUED)
-	else if (WIFCONTINUED(s)) {
-	    status = @symbol(continue);
-	} 
+        else if (WIFCONTINUED(s)) {
+            status = @symbol(continue);
+        } 
 #endif
     }
 done: ;
 %}.
 
     pid isNil ifTrue:[
-	^ self primitiveFailed
+        ^ self primitiveFailed
     ].
 
     ^ OSProcessStatus pid:pid status:status code:code core:core
@@ -7363,6 +7391,6 @@
 !OperatingSystem class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Attic/Unix.st,v 1.141 1996-05-18 15:31:46 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Attic/Unix.st,v 1.142 1996-05-21 11:11:56 stefan Exp $'
 ! !
 OperatingSystem initialize!