From 9bc48026a93e8330a2bd2795e78d5951c16b7d33 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Tue, 29 Aug 2017 11:22:49 +0200 Subject: [PATCH] Add option --name for naming the process MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This option allows to set the command line and the thread name of the main process. The value can contain spaces that will be replaced by nulls. Change-Id: I895270a24663467b16fb3cd8fc3218b7b003b6bb Signed-off-by: José Bollo --- src/CMakeLists.txt | 1 + src/afb-config.c | 10 ++++++- src/afb-config.h | 1 + src/main.c | 5 ++++ src/process-name.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/process-name.h | 21 +++++++++++++++ 6 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/process-name.c create mode 100644 src/process-name.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fe40c4c6..14c5120d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -64,6 +64,7 @@ ADD_LIBRARY(afb-lib STATIC afb-xreq.c jobs.c locale-root.c + process-name.c sd-fds.c sig-monitor.c subpath.c diff --git a/src/afb-config.c b/src/afb-config.c index 25f44cd8..d906bcb7 100644 --- a/src/afb-config.c +++ b/src/afb-config.c @@ -90,6 +90,7 @@ #if defined(WITH_MONITORING_OPTION) #define SET_MONITORING 'M' #endif +#define SET_NAME 'n' #define SET_TCP_PORT 'p' #define SET_QUIET 'q' #define SET_RNDTOKEN 'r' @@ -102,7 +103,7 @@ #define SET_WORK_DIR 'w' const char shortopts[] = - "c:D:E:ehp:qrT:t:u:Vvw:" + "c:D:E:ehn:p:qrT:t:u:Vvw:" #if defined(WITH_MONITORING_OPTION) "M" #endif @@ -125,6 +126,8 @@ static AFB_options cliOptions[] = { {SET_FORGROUND, 0, "foreground", "Get all in foreground mode"}, {SET_BACKGROUND, 0, "daemon", "Get all in background mode"}, + {SET_NAME, 1, "name", "Set the visible name"}, + {SET_TCP_PORT, 1, "port", "HTTP listening TCP port [default 1234]"}, {SET_ROOT_HTTP, 1, "roothttp", "HTTP Root Directory [default no root http (files not served but apis still available)]"}, {SET_ROOT_BASE, 1, "rootbase", "Angular Base Root URL [default /opa]"}, @@ -512,6 +515,10 @@ static void parse_arguments(int argc, char **argv, struct afb_config *config) config->background = 1; break; + case SET_NAME: + config->name = argvalstr(optc); + break; + case SET_MODE: config->mode = argvalenum(optc, mode_desc); break; @@ -674,6 +681,7 @@ void afb_config_dump(struct afb_config *config) S(workdir) S(uploaddir) S(token) + S(name) L(aliases) L(dbus_clients) diff --git a/src/afb-config.h b/src/afb-config.h index 792a6b8f..f1a27f7a 100644 --- a/src/afb-config.h +++ b/src/afb-config.h @@ -35,6 +35,7 @@ struct afb_config { char *workdir; // where to run the program char *uploaddir; // where to store transient files char *token; // initial authentication token [default NULL no session] + char *name; /* name to set to the daemon */ struct afb_config_list *aliases; struct afb_config_list *dbus_clients; diff --git a/src/main.c b/src/main.c index 3999b77a..0405fd1f 100644 --- a/src/main.c +++ b/src/main.c @@ -54,6 +54,7 @@ #include "afb-hook.h" #include "sd-fds.h" #include "afb-debug.h" +#include "process-name.h" /* if SELF_PGROUP == 0 the launched command is the group leader @@ -651,6 +652,10 @@ int main(int argc, char *argv[]) config = afb_config_parse_arguments(argc, argv); afb_debug("main-args"); + if (config->name) { + process_name_set_name(config->name); + process_name_replace_cmdline(argv, config->name); + } // --------- run ----------- if (config->background) { diff --git a/src/process-name.c b/src/process-name.c new file mode 100644 index 00000000..e8e19eea --- /dev/null +++ b/src/process-name.c @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2015, 2016, 2017 "IoT.bzh" + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "process-name.h" + +int process_name_set_name(const char *name) +{ + return prctl(PR_SET_NAME, name); +} + +int process_name_replace_cmdline(char **argv, const char *name) +{ + char *beg, *end, **av, c; + size_t length; + + /* update the command line */ + av = argv; + if (!av) { + errno = EINVAL; + return -1; /* no command line update required */ + } + + /* longest prefix */ + end = beg = *av; + while (*av) + if (*av++ == end) + while(*end++) + ; + if (end == beg) { + errno = EINVAL; + return -1; /* nothing to change */ + } + + /* patch the command line */ + av = &argv[1]; + end--; + while (beg != end && (c = *name++)) { + if (c != ' ' || !*av) + *beg++ = c; + else { + *beg++ = 0; + *av++ = beg; + } + } + /* terminate last arg */ + if (beg != end) + *beg++ = 0; + /* update remaining args (for keeping initial length correct) */ + while (*av) + *av++ = beg; + /* fulfill last arg with spaces */ + while (beg != end) + *beg++ = ' '; + *beg = 0; + + return 0; +} + diff --git a/src/process-name.h b/src/process-name.h new file mode 100644 index 00000000..874753f6 --- /dev/null +++ b/src/process-name.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2015, 2016, 2017 "IoT.bzh" + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +extern int process_name_set_name(const char *name); +extern int process_name_replace_cmdline(char **argv, const char *name); + -- 2.16.6