]> granicus.if.org Git - php/commitdiff
- Fixed #52660 (custom process title for FPM)
authorJérôme Loyet <fat@php.net>
Fri, 12 Nov 2010 00:30:35 +0000 (00:30 +0000)
committerJérôme Loyet <fat@php.net>
Fri, 12 Nov 2010 00:30:35 +0000 (00:30 +0000)
sapi/fpm/config.m4
sapi/fpm/fpm/fpm.c
sapi/fpm/fpm/fpm_conf.c
sapi/fpm/fpm/fpm_env.c
sapi/fpm/fpm/fpm_env.h

index fc5de678045e1962d53821ba0e33ade905e5a405..59cfda5dfa05d80409d0b080b958b8447e150708 100644 (file)
@@ -219,7 +219,7 @@ dnl }}}
 dnl configure checks {{{
 AC_DEFUN([AC_FPM_STDLIBS],
 [
-  AC_CHECK_FUNCS(setenv clearenv)
+  AC_CHECK_FUNCS(setenv clearenv setproctitle)
 
   AC_SEARCH_LIBS(socket, socket)
   AC_SEARCH_LIBS(inet_addr, nsl)
index fd4617350e53122678ff9037ae2efad8f57851a2..871d7645468bc2d45993b6550c3e27e14a124edc 100644 (file)
@@ -33,9 +33,9 @@ int fpm_init(int argc, char **argv, char *config, struct event_base **base) /* {
                0 > fpm_stdio_init_main()            ||
                0 > fpm_conf_init_main()             ||
                0 > fpm_unix_init_main()             ||
+               0 > fpm_pctl_init_main()             ||
                0 > fpm_env_init_main()              ||
                0 > fpm_signals_init_main()          ||
-               0 > fpm_pctl_init_main()             ||
                0 > fpm_children_init_main()         ||
                0 > fpm_sockets_init_main()          ||
                0 > fpm_worker_pool_init_main()      ||
index 296f669b64ae440226d4bdf575d739fd46b8f0c3..ff0ae7fcdbef983b5f214922266982081025ae9a 100644 (file)
@@ -698,6 +698,7 @@ static void fpm_conf_cleanup(int which, void *arg) /* {{{ */
        free(fpm_global_config.error_log);
        fpm_global_config.pid_file = 0;
        fpm_global_config.error_log = 0;
+       efree(fpm_globals.config);
 }
 /* }}} */
 
@@ -1010,38 +1011,34 @@ int fpm_conf_load_ini_file(char *filename TSRMLS_DC) /* {{{ */
 
 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;
        }
index ddc4705ecb367a5d2c7388e5c37fc2ad2bbbb8dc..aa647d15bcdb39e8ca9cbf26497a238d1811ab15 100644 (file)
 #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) /* {{{ */
@@ -111,9 +119,30 @@ static char * nvmatch(char *s1, char *s2) /* {{{ */
 /* }}} */
 #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();
 
@@ -169,12 +198,79 @@ static int fpm_env_conf_wp(struct fpm_worker_pool_s *wp) /* {{{ */
 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;
 }
 /* }}} */
index 0f79ed7869c522f68350d04a0d378ed1ede047c1..bf472368da3574c5a8e6b037241f488833c854d9 100644 (file)
@@ -7,8 +7,11 @@
 
 #include "fpm_worker_pool.h"
 
+#define SETPROCTITLE_PREFIX "php-fpm: "
+
 int fpm_env_init_child(struct fpm_worker_pool_s *wp);
 int fpm_env_init_main();
+void fpm_env_setproctitle(char *title);
 
 extern char **environ;