RS: allow service program name to be overridden
Until now, the program name of a service was always the file name (without directory) of the service binary. The program name is used to, among other things, find the corresponding system.conf entry. With ASR moving to a situation where all rerandomized service binaries are stored in a single directory, this can no longer be maintained. Instead, the service(8) command can now be instructed to override the service program name, using its new -progname option. Change-Id: I981e9b35232c88048d8804ec5eca58d1e4a5db82
This commit is contained in:
parent
6068a2ee9f
commit
23199f6205
@ -123,6 +123,7 @@ static int known_request_types[] = {
|
||||
* system service
|
||||
*/
|
||||
#define ARG_LABELNAME "-label" /* custom label name */
|
||||
#define ARG_PROGNAME "-progname" /* custom program name */
|
||||
#define ARG_CONFIG "-config" /* name of the file with the resource
|
||||
* configuration
|
||||
*/
|
||||
@ -149,6 +150,7 @@ static char *req_label = NULL;
|
||||
static char *req_trg_label = NULL;
|
||||
static char *req_path = NULL;
|
||||
static char *req_path_self = SELF_REQ_PATH;
|
||||
static char *req_progname = NULL;
|
||||
static char *req_args = "";
|
||||
static int req_major = 0;
|
||||
static int devman_id = 0;
|
||||
@ -177,14 +179,14 @@ static void print_usage(char *app_name, char *problem)
|
||||
fprintf(stderr, "Warning, %s\n", problem);
|
||||
fprintf(stderr, "Usage:\n");
|
||||
fprintf(stderr,
|
||||
" %s [%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s] (up|run|edit|update) <binary|%s> [%s <args>] [%s <special>] [%s <major_nr>] [%s <dev_id>] [%s <ticks>] [%s <path>] [%s <name>] [%s <path>] [%s <state value|eval_expression>] [%s <time>] [%s <bytes>] [%s <bytes>] [%s <name>] [(%s|%s <src_label1,src_type1:src_label2,:,src_type3:...>)*] [%s <count>] [%s <restarts>]\n",
|
||||
" %s [%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s] (up|run|edit|update) <binary|%s> [%s <args>] [%s <special>] [%s <major_nr>] [%s <dev_id>] [%s <ticks>] [%s <path>] [%s <name>] [%s <name>] [%s <path>] [%s <state value|eval_expression>] [%s <time>] [%s <bytes>] [%s <bytes>] [%s <name>] [(%s|%s <src_label1,src_type1:src_label2,:,src_type3:...>)*] [%s <count>] [%s <restarts>]\n",
|
||||
app_name, OPT_COPY, OPT_REUSE, OPT_NOBLOCK, OPT_REPLICA, OPT_NO_BIN_EXP,
|
||||
OPT_BATCH, OPT_ASR_LU, OPT_PREPARE_ONLY_LU, OPT_FORCE_SELF_LU,
|
||||
OPT_FORCE_INIT_CRASH, OPT_FORCE_INIT_FAIL, OPT_FORCE_INIT_TIMEOUT,
|
||||
OPT_FORCE_INIT_DEFCB, OPT_NOMMAP_LU, OPT_DETACH,
|
||||
OPT_NORESTART, OPT_FORCE_INIT_ST, SELF_BINARY,
|
||||
ARG_ARGS, ARG_DEV, ARG_MAJOR, ARG_DEVMANID, ARG_PERIOD,
|
||||
ARG_SCRIPT, ARG_LABELNAME, ARG_CONFIG, ARG_LU_STATE, ARG_LU_MAXTIME,
|
||||
ARG_SCRIPT, ARG_LABELNAME, ARG_PROGNAME, ARG_CONFIG, ARG_LU_STATE, ARG_LU_MAXTIME,
|
||||
ARG_HEAP_PREALLOC, ARG_MAP_PREALLOC, ARG_TRG_LABELNAME, ARG_LU_IPC_BL, ARG_LU_IPC_WL,
|
||||
ARG_ASR_COUNT, ARG_RESTARTS);
|
||||
fprintf(stderr, " %s down <label>\n", app_name);
|
||||
@ -564,6 +566,9 @@ static int parse_arguments(int argc, char **argv, u32_t *rss_flags)
|
||||
else if (strcmp(argv[i], ARG_TRG_LABELNAME)==0) {
|
||||
req_trg_label = argv[i+1];
|
||||
}
|
||||
else if (strcmp(argv[i], ARG_PROGNAME)==0) {
|
||||
req_progname = argv[i+1];
|
||||
}
|
||||
else if (strcmp(argv[i], ARG_CONFIG)==0) {
|
||||
req_config = argv[i+1];
|
||||
custom_config_file = 1;
|
||||
@ -734,9 +739,13 @@ int main(int argc, char **argv)
|
||||
case RS_UP:
|
||||
case RS_EDIT:
|
||||
/* Build space-separated command string to be passed to RS server. */
|
||||
progname = strrchr(req_path, '/');
|
||||
assert(progname); /* an absolute path was required */
|
||||
progname++; /* skip last slash */
|
||||
if (req_progname != NULL) {
|
||||
progname = req_progname;
|
||||
} else {
|
||||
progname = strrchr(req_path, '/');
|
||||
assert(progname); /* an absolute path was required */
|
||||
progname++; /* skip last slash */
|
||||
}
|
||||
strcpy(command, req_path);
|
||||
command[strlen(req_path)] = ' ';
|
||||
strcpy(command+strlen(req_path)+1, req_args);
|
||||
@ -753,6 +762,8 @@ int main(int argc, char **argv)
|
||||
/* Set specifics */
|
||||
config.rs_start.rss_cmd= command;
|
||||
config.rs_start.rss_cmdlen= strlen(command);
|
||||
config.rs_start.rss_progname= progname;
|
||||
config.rs_start.rss_prognamelen= strlen(progname);
|
||||
config.rs_start.rss_major= req_major;
|
||||
config.rs_start.rss_period= req_period;
|
||||
config.rs_start.rss_script= req_script;
|
||||
|
@ -135,6 +135,8 @@ struct rs_start
|
||||
struct rss_label rss_control[RS_NR_CONTROL];
|
||||
struct rs_state_data rss_state_data;
|
||||
int devman_id;
|
||||
char *rss_progname;
|
||||
size_t rss_prognamelen;
|
||||
/*
|
||||
* SMP specific data
|
||||
*
|
||||
|
@ -18,8 +18,8 @@ static struct exec_loaders {
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
int srv_execve(int proc_e, char *exec, size_t exec_len, char **argv,
|
||||
char **envp)
|
||||
int srv_execve(int proc_e, char *exec, size_t exec_len, char *progname,
|
||||
char **argv, char **envp)
|
||||
{
|
||||
size_t frame_size = 0; /* Size of the new initial stack. */
|
||||
int argc = 0; /* Argument count. */
|
||||
@ -29,7 +29,6 @@ int srv_execve(int proc_e, char *exec, size_t exec_len, char **argv,
|
||||
struct ps_strings *psp;
|
||||
int vsp = 0; /* (virtual) Stack pointer in new address space. */
|
||||
|
||||
char *progname;
|
||||
int r;
|
||||
|
||||
minix_stack_params(argv[0], argv, envp, &frame_size, &overflow,
|
||||
@ -50,8 +49,6 @@ int srv_execve(int proc_e, char *exec, size_t exec_len, char **argv,
|
||||
minix_stack_fill(argv[0], argc, argv, envc, envp, frame_size, frame,
|
||||
&vsp, &psp);
|
||||
|
||||
(progname=strrchr(argv[0], '/')) ? progname++ : (progname=argv[0]);
|
||||
|
||||
r = do_exec(proc_e, exec, exec_len, progname, frame, frame_size,
|
||||
vsp + ((char *)psp - frame));
|
||||
|
||||
|
@ -305,11 +305,13 @@ static int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *UNUSED(info))
|
||||
*/
|
||||
rpub->dev_nr = boot_image_dev->dev_nr; /* major device number */
|
||||
|
||||
/* Build command settings. This will also set the process name. */
|
||||
/* Build command settings. Also set the process name. */
|
||||
strlcpy(rp->r_cmd, ip->proc_name, sizeof(rp->r_cmd));
|
||||
rp->r_script[0]= '\0';
|
||||
build_cmd_dep(rp);
|
||||
|
||||
strlcpy(rpub->proc_name, ip->proc_name, sizeof(rpub->proc_name));
|
||||
|
||||
/* Initialize vm call mask bitmap. */
|
||||
calls = SRV_OR_USR(rp, SRV_VC, USR_VC) == ALL_C ? all_c : no_c;
|
||||
fill_call_mask(calls, NR_VM_CALLS, rpub->vm_call_mask, VM_RQ_BASE, TRUE);
|
||||
|
@ -320,18 +320,6 @@ void build_cmd_dep(struct rproc *rp)
|
||||
assert(arg_count < ARGV_ELEMENTS);
|
||||
rp->r_argv[arg_count] = NULL; /* end with NULL pointer */
|
||||
rp->r_argc = arg_count;
|
||||
|
||||
/* Build process name. */
|
||||
cmd_ptr = strrchr(rp->r_argv[0], '/');
|
||||
if (cmd_ptr)
|
||||
cmd_ptr++;
|
||||
else
|
||||
cmd_ptr= rp->r_argv[0];
|
||||
len= strlen(cmd_ptr);
|
||||
if (len > RS_MAX_LABEL_LEN-1)
|
||||
len= RS_MAX_LABEL_LEN-1; /* truncate name */
|
||||
memcpy(rpub->proc_name, cmd_ptr, len);
|
||||
rpub->proc_name[len]= '\0';
|
||||
}
|
||||
|
||||
/*===========================================================================*
|
||||
@ -642,8 +630,8 @@ struct rproc *rp;
|
||||
}
|
||||
if(rs_verbose)
|
||||
printf("RS: execing child with srv_execve()...\n");
|
||||
s = srv_execve(child_proc_nr_e, rp->r_exec, rp->r_exec_len, rp->r_argv,
|
||||
environ);
|
||||
s = srv_execve(child_proc_nr_e, rp->r_exec, rp->r_exec_len, rpub->proc_name,
|
||||
rp->r_argv, environ);
|
||||
vm_memctl(RS_PROC_NR, VM_RS_MEM_PIN, 0, 0);
|
||||
if (s != OK) {
|
||||
printf("RS: srv_execve failed: %d\n", s);
|
||||
@ -1588,9 +1576,16 @@ endpoint_t source;
|
||||
rp->r_cmd[rs_start->rss_cmdlen] = '\0'; /* ensure it is terminated */
|
||||
if (rp->r_cmd[0] != '/') return(EINVAL); /* insist on absolute path */
|
||||
|
||||
/* Build cmd dependencies: argv and program name. */
|
||||
/* Build cmd dependencies (argv). */
|
||||
build_cmd_dep(rp);
|
||||
|
||||
/* Copy in the program name. */
|
||||
if (rs_start->rss_prognamelen > sizeof(rpub->proc_name)-1) return(E2BIG);
|
||||
s=sys_datacopy(source, (vir_bytes) rs_start->rss_progname,
|
||||
SELF, (vir_bytes) rpub->proc_name, rs_start->rss_prognamelen);
|
||||
if (s != OK) return(s);
|
||||
rpub->proc_name[rs_start->rss_prognamelen] = '\0';
|
||||
|
||||
/* Update label if not already set. */
|
||||
if(!strcmp(rpub->label, "")) {
|
||||
if(rs_start->rss_label.l_len > 0) {
|
||||
|
@ -5,8 +5,8 @@ struct rproc;
|
||||
struct rprocupd;
|
||||
|
||||
/* exec.c */
|
||||
int srv_execve(int proc_e, char *exec, size_t exec_len, char *argv[],
|
||||
char **env);
|
||||
int srv_execve(int proc_e, char *exec, size_t exec_len, char *progname,
|
||||
char *argv[], char **env);
|
||||
|
||||
/* main.c */
|
||||
int main(void);
|
||||
|
@ -27,6 +27,8 @@ put_struct_rs_start(struct trace_proc * proc, const char * name,
|
||||
put_flags(proc, "rss_flags", rss_flags, COUNT(rss_flags),
|
||||
"0x%x", buf.rss_flags);
|
||||
put_buf(proc, "rss_cmd", 0, (vir_bytes)buf.rss_cmd, buf.rss_cmdlen);
|
||||
put_buf(proc, "rss_progname", 0, (vir_bytes)buf.rss_progname,
|
||||
buf.rss_prognamelen);
|
||||
put_buf(proc, "rss_label", 0, (vir_bytes)buf.rss_label.l_addr,
|
||||
buf.rss_label.l_len);
|
||||
if (verbose > 0 || buf.rss_major != 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user