return_if_fail(execv_req->path != NULL);
return_if_fail(execv_req->argv != NULL);
+ /* Do best to set proctitle if below hack don't work */
+ mowgli_proctitle_set("%s", execv_req->argv[0]);
execv(execv_req->path, execv_req->argv);
mowgli_free(execv_req->argv);
}
mowgli_process_t *
-mowgli_process_clone(mowgli_process_start_fn_t start_fn, void *userdata)
+mowgli_process_clone(mowgli_process_start_fn_t start_fn, const char *procname, void *userdata)
{
#ifndef _WIN32
mowgli_process_t *out;
break;
case 0:
+ /* Do our best to set this... */
+ mowgli_proctitle_set("%s", procname);
start_fn(out->userdata);
_exit(255);
for (i = 0; argv[i] != NULL; i++)
req->argv[i] = argv[i];
- return mowgli_process_clone((mowgli_process_start_fn_t) mowgli_process_cloned_execv, req);
+ return mowgli_process_clone((mowgli_process_start_fn_t) mowgli_process_cloned_execv, req->argv[0], req);
}
void
}
mowgli_eventloop_helper_proc_t *
-mowgli_helper_create(mowgli_eventloop_t *eventloop, mowgli_eventloop_helper_start_fn_t *start_fn, void *userdata)
+mowgli_helper_create(mowgli_eventloop_t *eventloop, mowgli_eventloop_helper_start_fn_t *start_fn, const char *helpername, void *userdata)
{
mowgli_eventloop_helper_proc_t *helper;
mowgli_helper_create_req_t child;
mowgli_pollable_set_nonblocking(helper->pfd, true);
/* spawn helper process using mowgli_process_clone() */
- helper->child = mowgli_process_clone((mowgli_process_start_fn_t) mowgli_helper_trampoline, &child);
+ helper->child = mowgli_process_clone((mowgli_process_start_fn_t) mowgli_helper_trampoline, helpername, &child);
if (helper->child == NULL)
{
* If we're going to overwrite the argv area, count the available space.
* Also move the environment to make additional room.
*/
+ char *end_of_area = NULL;
+ char **new_environ;
+ int i;
+
+ /*
+ * check for contiguous argv strings
+ */
+ for (i = 0; i < argc; i++)
+ {
+ if (i == 0 || end_of_area + 1 == argv[i])
+ end_of_area = argv[i] + strlen(argv[i]);
+ }
+
+ if (end_of_area == NULL) /* probably can't happen? */
{
- char *end_of_area = NULL;
- char **new_environ;
- int i;
-
- /*
- * check for contiguous argv strings
- */
- for (i = 0; i < argc; i++)
- {
- if (i == 0 || end_of_area + 1 == argv[i])
- end_of_area = argv[i] + strlen(argv[i]);
- }
-
- if (end_of_area == NULL) /* probably can't happen? */
- {
- ps_buffer = NULL;
- ps_buffer_size = 0;
- return argv;
- }
-
- /*
- * check for contiguous environ strings following argv
- */
- for (i = 0; environ[i] != NULL; i++)
- {
- if (end_of_area + 1 == environ[i])
- end_of_area = environ[i] + strlen(environ[i]);
- }
-
- ps_buffer = argv[0];
- ps_buffer_size = end_of_area - argv[0];
-
- /*
- * move the environment out of the way
- */
- new_environ = (char **) malloc((i + 1) * sizeof(char *));
- for (i = 0; environ[i] != NULL; i++)
- new_environ[i] = mowgli_strdup(environ[i]);
- new_environ[i] = NULL;
- environ = new_environ;
+ ps_buffer = NULL;
+ ps_buffer_size = 0;
+ return argv;
}
+
+ /*
+ * check for contiguous environ strings following argv
+ */
+ for (i = 0; environ[i] != NULL; i++)
+ {
+ if (end_of_area + 1 == environ[i])
+ end_of_area = environ[i] + strlen(environ[i]);
+ }
+
+ ps_buffer = argv[0];
+ ps_buffer_size = end_of_area - argv[0];
+
+ /*
+ * move the environment out of the way
+ */
+ new_environ = (char **) malloc((i + 1) * sizeof(char *));
+ for (i = 0; environ[i] != NULL; i++)
+ new_environ[i] = mowgli_strdup(environ[i]);
+ new_environ[i] = NULL;
+ environ = new_environ;
+
#endif /* MOWGLI_SETPROC_USE_CLOBBER_ARGV */
#if defined(MOWGLI_SETPROC_USE_CHANGE_ARGV) || defined(MOWGLI_SETPROC_USE_CLOBBER_ARGV)
* argument string if the argv storage has been clobbered meanwhile. Other
* platforms have other dependencies on argv[].
*/
- {
- char **new_argv;
- int i;
- new_argv = (char **) malloc((argc + 1) * sizeof(char *));
- for (i = 0; i < argc; i++)
- new_argv[i] = mowgli_strdup(argv[i]);
- new_argv[argc] = NULL;
+ char **new_argv;
+ int i;
+
+ new_argv = (char **) malloc((argc + 1) * sizeof(char *));
+ for (i = 0; i < argc; i++)
+ new_argv[i] = mowgli_strdup(argv[i]);
+ new_argv[argc] = NULL;
#if defined(__darwin__)
- /*
- * Darwin (and perhaps other NeXT-derived platforms?) has a static
- * copy of the argv pointer, which we may fix like so:
- */
- *_NSGetArgv() = new_argv;
+ /*
+ * Darwin (and perhaps other NeXT-derived platforms?) has a static
+ * copy of the argv pointer, which we may fix like so:
+ */
+ *_NSGetArgv() = new_argv;
#endif
- argv = new_argv;
- }
+ argv = new_argv;
+
#endif /* MOWGLI_SETPROC_USE_CHANGE_ARGV or MOWGLI_SETPROC_USE_CLOBBER_ARGV */
return argv;
vsnprintf(ps_buffer, ps_buffer_size, fmt, va);
va_end(va);
+ return_if_fail(*ps_buffer == NULL);
+
ps_buffer_cur_len = ps_buffer_fixed_size = strlen(ps_buffer);
#ifdef MOWGLI_SETPROC_USE_CHANGE_ARGV
#ifdef MOWGLI_SETPROC_USE_PRCTL
/* Limit us to 16 chars to be safe */
- char procbuf[17];
+ char procbuf[16];
mowgli_strlcpy(procbuf, ps_buffer, sizeof(procbuf));
prctl(PR_SET_NAME, procbuf, 0, 0, 0);
printf("%s\n", procbuf);