RE: Shared device error on Hercules 4.3

"'\'Fish\' \(David B. Trout\)' [email protected] [hercules-390]" <[email protected]> Sun, 10 Nov 2019 14:20:37 -0800
Newsgroups gmane.comp.emulators.hercules390.general
Message-ID <[email protected]>
Bob Schmidt wrote:

> Thanks!  I will open a github issue tomorrow.

Thank you.

In the mean time, please try the following patch:



diff -r -a -x .git -x 'msvc.AMD64.*' -x 'msvc.dllmod.*' -x 'msvc.debug.*' -x '*.suo' -x '*.ncb' -x '*.user' -x '*.htm' -x WORK -x DICTS -x FILES -x 'allTests.*' -x '*.rej' -x '*.orig' -x AutoBuildCount.h -x '*.cmp*' -x '*.comp*' -Nu hyperion-1/hstructs.h hyperion-0/hstructs.h
--- hyperion-1/hstructs.h	2019-10-07 20:21:54.153808600 -0700
+++ hyperion-0/hstructs.h	2019-11-10 13:11:30.316654700 -0800
@@ -1254,6 +1254,7 @@
         U16     rmtport;                /* Remote port number        */
         U16     rmtnum;                 /* Remote device number      */
         int     rmtid;                  /* Remote Id                 */
+        int     rmtver;                 /* Remote version level      */
         int     rmtrel;                 /* Remote release level      */
         DBLWRD  rmthdr;                 /* Remote header             */
         int     rmtcomp;                /* Remote compression parm   */
diff -r -a -x .git -x 'msvc.AMD64.*' -x 'msvc.dllmod.*' -x 'msvc.debug.*' -x '*.suo' -x '*.ncb' -x '*.user' -x '*.htm' -x WORK -x DICTS -x FILES -x 'allTests.*' -x '*.rej' -x '*.orig' -x AutoBuildCount.h -x '*.cmp*' -x '*.comp*' -Nu hyperion-1/msgenu.h hyperion-0/msgenu.h
--- hyperion-1/msgenu.h	2019-10-10 21:09:04.111596400 -0700
+++ hyperion-0/msgenu.h	2019-11-10 14:07:36.730565100 -0800
@@ -631,7 +631,7 @@
 #define HHC00718 "%1d:%04X Shared: error writing track %d"
 #define HHC00719 "%1d:%04X Shared: remote error writing track %d %2.2X-%2.2X"
 #define HHC00720 "%1d:%04X Shared: error in function %s: %s"
-#define HHC00721 "%1d:%04X Shared: connected to file %s"
+#define HHC00721 "%1d:%04X Shared: connected to v%d.%d server id %d file %s"
 #define HHC00722 "%1d:%04X Shared: error in connect to file %s: %s"
 #define HHC00723 "%1d:%04X Shared: error in send for %2.2X-%2.2X: %s"
 #define HHC00724 "%1d:%04X Shared: not connected to file %s"
diff -r -a -x .git -x 'msvc.AMD64.*' -x 'msvc.dllmod.*' -x 'msvc.debug.*' -x '*.suo' -x '*.ncb' -x '*.user' -x '*.htm' -x WORK -x DICTS -x FILES -x 'allTests.*' -x '*.rej' -x '*.orig' -x AutoBuildCount.h -x '*.cmp*' -x '*.comp*' -Nu hyperion-1/shared.c hyperion-0/shared.c
--- hyperion-1/shared.c	2019-08-31 10:57:42.000000000 -0700
+++ hyperion-0/shared.c	2019-11-10 14:07:26.652947400 -0800
@@ -16,6 +16,7 @@
 #include "opcode.h"
 #include "devtype.h"
 #include "ccwarn.h"
+#include "dasdblks.h"
 
 DISABLE_GCC_UNUSED_SET_WARNING;
 
@@ -275,16 +276,27 @@
     }
     dev->numdevid = rc;
 
-    /* Get the serial number */
-    rc = clientRequest (dev, dev->serial, sizeof(dev->serial),
-                        SHRD_QUERY, SHRD_SERIAL, NULL, NULL);
-    if (rc < 0)
-        goto init_retry;
-    else if (rc == 0 || rc > (int)sizeof(dev->serial))
+    /* Get the serial number if the server supports such a query */
+
+    if (dev->rmtver <  SHARED_VERSION ||
+       (dev->rmtver == SHARED_VERSION &&
+        dev->rmtrel <  SHARED_RELEASE))
     {
-        // "%1d:%04X Shared: error retrieving serial number"
-        WRMSG( HHC00716, "S", LCSS_DEVNUM );
-        return -1;
+        /* Generate a random serial number */
+        gen_dasd_serial( dev->serial );
+    }
+    else /* (server SHOULD support the SHRD_SERIAL query) */
+    {
+        rc = clientRequest (dev, dev->serial, sizeof(dev->serial),
+                            SHRD_QUERY, SHRD_SERIAL, NULL, NULL);
+        if (rc < 0)
+            goto init_retry;
+        else if (rc == 0 || rc > (int)sizeof(dev->serial))
+        {
+            // "%1d:%04X Shared: error retrieving serial number"
+            WRMSG( HHC00716, "S", LCSS_DEVNUM );
+            return -1;
+        }
     }
 
     /* Indicate no active track */
@@ -553,16 +565,27 @@
     }
     dev->numdevchar = rc;
 
-    /* Get the serial number */
-    rc = clientRequest (dev, dev->serial, sizeof(dev->serial),
-                        SHRD_QUERY, SHRD_SERIAL, NULL, NULL);
-    if (rc < 0)
-        goto init_retry;
-    else if (rc == 0 || rc > (int)sizeof(dev->serial))
+    /* Get the serial number if the server supports such a query */
+
+    if (dev->rmtver <  SHARED_VERSION ||
+       (dev->rmtver == SHARED_VERSION &&
+        dev->rmtrel <  SHARED_RELEASE))
     {
-        // "%1d:%04X Shared: error retrieving serial number"
-        WRMSG( HHC00716, "S", LCSS_DEVNUM );
-        return -1;
+        /* Generate a random serial number */
+        gen_dasd_serial( dev->serial );
+    }
+    else /* (server SHOULD support the SHRD_SERIAL query) */
+    {
+        rc = clientRequest (dev, dev->serial, sizeof(dev->serial),
+                            SHRD_QUERY, SHRD_SERIAL, NULL, NULL);
+        if (rc < 0)
+            goto init_retry;
+        else if (rc == 0 || rc > (int)sizeof(dev->serial))
+        {
+            // "%1d:%04X Shared: error retrieving serial number"
+            WRMSG( HHC00716, "S", LCSS_DEVNUM );
+            return -1;
+        }
     }
 
     /* Indicate no active track */
@@ -1151,12 +1174,14 @@
                 {
                     dev->connected = 1;             // (SHRD_CONNECT success)
                     dev->rmtid  = fetch_hw( id );   // (must only do ONCE!!!)
-                    dev->rmtrel = flag & 0x0f;
+                    dev->rmtver = flag >> 4;        // (save server version)
+                    dev->rmtrel = flag & 0x0f;      // (save server release)
 
                     if (!dev->batch)
                         if (MLVL( VERBOSE ))
-                            // "%1d:%04X Shared: connected to file %s"
-                            WRMSG( HHC00721, "I", LCSS_DEVNUM, dev->filename );
+                            // "%1d:%04X Shared: connected to v%d.%d server id %d file %s"
+                            WRMSG( HHC00721, "I", LCSS_DEVNUM, dev->rmtver,
+                                dev->rmtrel, dev->rmtid, dev->filename );
                     /*
                      * Negotiate compression - top 4 bits have the compression
                      * algorithms we support (00010000 -> libz; 00100000 ->bzip2,
@@ -1168,7 +1193,6 @@
                      * cckd or cfba then the server doesn't have to uncompress
                      * the data for us if we support the compression algorithm.
                      */
-
                     if (dev->rmtcomp || dev->rmtcomps)
                     {
                         rc = clientRequest( dev, comp, 2, SHRD_COMPRESS,





-- 
"Fish" (David B. Trout)
Software Development Laboratories
http://www.softdevlabs.com
mail: [email protected]