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­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