free(fpm_global_config.error_log);
fpm_global_config.pid_file = 0;
fpm_global_config.error_log = 0;
+ efree(fpm_globals.config);
}
/* }}} */
int fpm_conf_init_main() /* {{{ */
{
- char *filename = fpm_globals.config;
- int free = 0;
int ret;
TSRMLS_FETCH();
- if (filename == NULL) {
- spprintf(&filename, 0, "%s/php-fpm.conf", PHP_SYSCONFDIR);
- free = 1;
+ if (fpm_globals.config == NULL) {
+ spprintf(&fpm_globals.config, 0, "%s/php-fpm.conf", PHP_SYSCONFDIR);
+ if (!fpm_globals.config) {
+ zlog(ZLOG_SYSERROR, "spprintf() failed (\"%s/php-fpm.conf\")", PHP_SYSCONFDIR);
+ return -1;
+ }
}
- ret = fpm_conf_load_ini_file(filename TSRMLS_CC);
+ ret = fpm_conf_load_ini_file(fpm_globals.config TSRMLS_CC);
if (0 > ret) {
- zlog(ZLOG_ERROR, "failed to load configuration file '%s'", filename);
- if (free) efree(filename);
+ zlog(ZLOG_ERROR, "failed to load configuration file '%s'", fpm_globals.config);
return -1;
}
if (0 > fpm_conf_post_process()) {
zlog(ZLOG_ERROR, "failed to post process the configuration");
- if (free) efree(filename);
return -1;
}
if (fpm_globals.test_conf) {
- zlog(ZLOG_NOTICE, "configuration file %s test is successful\n", filename);
- if (free) efree(filename);
+ zlog(ZLOG_NOTICE, "configuration file %s test is successful\n", fpm_globals.config);
return -1;
}
- if (free) efree(filename);
-
if (0 > fpm_cleanup_add(FPM_CLEANUP_ALL, fpm_conf_cleanup, 0)) {
return -1;
}
#include <string.h>
#include "fpm_env.h"
+#include "fpm.h"
#include "zlog.h"
+#ifndef HAVE_SETPROCTITLE
+#ifdef __linux__
+static char **fpm_env_argv = NULL;
+static size_t fpm_env_argv_len = 0;
+#endif
+#endif
+
#ifndef HAVE_SETENV
# ifdef (__sparc__ || __sparc)
int setenv(char *name, char *value, int clobber) /* {{{ */
/* }}} */
#endif
+void fpm_env_setproctitle(char *title) /* {{{ */
+{
+#ifdef HAVE_SETPROCTITLE
+ setproctitle("%s", title);
+#else
+#ifdef __linux__
+ if (fpm_env_argv != NULL && fpm_env_argv_len > strlen(SETPROCTITLE_PREFIX) + 3) {
+ memset(fpm_env_argv[0], 0, fpm_env_argv_len);
+ strncpy(fpm_env_argv[0], SETPROCTITLE_PREFIX, fpm_env_argv_len - 2);
+ strncpy(fpm_env_argv[0] + strlen(SETPROCTITLE_PREFIX), title, fpm_env_argv_len - strlen(SETPROCTITLE_PREFIX) - 2);
+ fpm_env_argv[1] = NULL;
+ }
+#endif
+#endif
+}
+/* }}} */
+
int fpm_env_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
{
struct key_value_s *kv;
+ char *title;
+ spprintf(&title, 0, "pool %s", wp->config->name);
+ fpm_env_setproctitle(title);
+ efree(title);
clearenv();
int fpm_env_init_main() /* {{{ */
{
struct fpm_worker_pool_s *wp;
+ int i;
+ char *first = NULL;
+ char *last = NULL;
+ char *title;
for (wp = fpm_worker_all_pools; wp; wp = wp->next) {
if (0 > fpm_env_conf_wp(wp)) {
return -1;
}
}
+#ifndef HAVE_SETPROCTITLE
+#ifdef __linux__
+ /*
+ * This piece of code has been inspirated from nginx and pureftpd code, whic
+ * are under BSD licence.
+ *
+ * To change the process title in Linux we have to set argv[1] to NULL
+ * and to copy the title to the same place where the argv[0] points to.
+ * However, argv[0] may be too small to hold a new title. Fortunately, Linux
+ * store argv[] and environ[] one after another. So we should ensure that is
+ * the continuous memory and then we allocate the new memory for environ[]
+ * and copy it. After this we could use the memory starting from argv[0] for
+ * our process title.
+ */
+
+ for (i = 0; i < fpm_globals.argc; i++) {
+ if (first == NULL) {
+ first = fpm_globals.argv[i];
+ }
+ if (last == NULL || fpm_globals.argv[i] == last + 1) {
+ last = fpm_globals.argv[i] + strlen(fpm_globals.argv[i]);
+ }
+ }
+ if (environ) {
+ for (i = 0; environ[i]; i++) {
+ if (first == NULL) {
+ first = environ[i];
+ }
+ if (last == NULL || environ[i] == last + 1) {
+ last = environ[i] + strlen(environ[i]);
+ }
+ }
+ }
+ if (first == NULL || last == NULL) {
+ return 0;
+ }
+
+ fpm_env_argv_len = last - first;
+ fpm_env_argv = fpm_globals.argv;
+ if (environ != NULL) {
+ char **new_environ;
+ unsigned int env_nb = 0U;
+
+ while (environ[env_nb]) {
+ env_nb++;
+ }
+
+ if ((new_environ = malloc((1U + env_nb) * sizeof (char *))) == NULL) {
+ return -1;
+ }
+ new_environ[env_nb] = NULL;
+ while (env_nb > 0U) {
+ env_nb--;
+ new_environ[env_nb] = strdup(environ[env_nb]);
+ }
+ environ = new_environ;
+ }
+#endif
+#endif
+
+ spprintf(&title, 0, "master process (%s)", fpm_globals.config);
+ fpm_env_setproctitle(title);
+ efree(title);
return 0;
}
/* }}} */