File 4681-erts-Add-environment-variable-for-keeping-compile-se.patch of Package erlang

From 3f3d0123d4f3236c2022267765ae420b6e67750f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Thu, 26 Sep 2019 12:07:47 +0200
Subject: [PATCH] erts: Add environment variable for keeping compile servers
 apart

---
 erts/doc/src/erlc.xml  |  8 ++++++++
 erts/etc/common/erlc.c | 31 +++++++++++++++++++++++++++++--
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/erts/doc/src/erlc.xml b/erts/doc/src/erlc.xml
index 9d221a69ee..f1f2c786da 100644
--- a/erts/doc/src/erlc.xml
+++ b/erts/doc/src/erlc.xml
@@ -368,6 +368,14 @@ erlc +export_all file.erl</pre>
       compile server. If other values are given, <c>erlc</c> will
       print a warning message and continue.
       </item>
+      <tag><c>ERLC_SERVER_ID</c></tag>
+      <item>Tells <c>erlc</c> to identify the
+        <seealso marker="#compile_server">compile server</seealso> by the given
+        name, allowing a single user to run multiple unrelated builds in
+        parallel without them affecting each other, which can be useful for
+        shared build machines and the like. The name must be alpha&shy;numeric,
+        and it defaults to being empty.
+      </item>
     </taglist>
   </section>
 
diff --git a/erts/etc/common/erlc.c b/erts/etc/common/erlc.c
index 56060497f3..df762cacdb 100644
--- a/erts/etc/common/erlc.c
+++ b/erts/etc/common/erlc.c
@@ -605,6 +605,7 @@ call_compile_server(char** argv)
 {
     ei_cnode ec;
     char* user;
+    char* server_id;
     char node_name[MAXNODELEN+1];
     char remote[MAXNODELEN+1];
     short creation = 1;
@@ -656,6 +657,20 @@ call_compile_server(char** argv)
         user = "nouser";
     }
 
+    /* Get build server id, if any */
+    server_id = get_env("ERLC_SERVER_ID");
+    if (server_id) {
+        /* Filter out obviously wrong characters. Making it waterproof would be
+         * too complicated and letting an invalid name through won't have any
+         * negative consequences beyond bad performance. */
+        if (strpbrk(server_id, ",@.!#$%^&=+*/()[]{}|'\"`~?")) {
+            error("ERLC_SERVER_ID must not contain characters that are "
+                  "invalid in node names.\n");
+        }
+    } else {
+        server_id = "";
+    }
+
     /* Create my own node name. */
 #ifdef __WIN32__
     sprintf(node_name, "erlc_client_%s_%lu", user, (unsigned long) GetCurrentProcessId());
@@ -671,13 +686,25 @@ call_compile_server(char** argv)
             fprintf(stderr, "\ncan't create C node %s: %s\n",
                     node_name, strerror(erl_errno));
         }
-        sprintf(remote, "erl_compile_server_%s@host", user);
+        if(snprintf(remote, MAXNODELEN, "erl_compile_server_%s_%s@host",
+                    server_id, user) >= MAXNODELEN) {
+            error("Compile server node name is too long.\n"
+                  "\tERL_SERVER_ID = %s\n"
+                  "\tuser name = %s\n",
+                  server_id, user);
+        }
         goto start_compile_server;
     }
 
     /* Create node name for compile server. */
 
-    sprintf(remote, "erl_compile_server_%s@%s", user, ei_thishostname(&ec));
+    if(snprintf(remote, MAXNODELEN, "erl_compile_server_%s_%s@%s",
+                server_id, user, ei_thishostname(&ec)) >= MAXNODELEN) {
+        error("Compile server node name is too long.\n"
+              "\tERL_SERVER_ID = %s\n"
+              "\tuser name = %s\n",
+              server_id, user);
+    }
 
     if ((fd = ei_connect(&ec, remote)) < 0) {
         if (debug > 1) {
-- 
2.16.4

openSUSE Build Service is sponsored by