Annotation of embedaddon/nginx/src/os/unix/ngx_setproctitle.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * Copyright (C) Igor Sysoev
                      4:  * Copyright (C) Nginx, Inc.
                      5:  */
                      6: 
                      7: 
                      8: #include <ngx_config.h>
                      9: #include <ngx_core.h>
                     10: 
                     11: 
                     12: #if (NGX_SETPROCTITLE_USES_ENV)
                     13: 
                     14: /*
                     15:  * To change the process title in Linux and Solaris we have to set argv[1]
                     16:  * to NULL and to copy the title to the same place where the argv[0] points to.
                     17:  * However, argv[0] may be too small to hold a new title.  Fortunately, Linux
                     18:  * and Solaris store argv[] and environ[] one after another.  So we should
                     19:  * ensure that is the continuous memory and then we allocate the new memory
                     20:  * for environ[] and copy it.  After this we could use the memory starting
                     21:  * from argv[0] for our process title.
                     22:  *
                     23:  * The Solaris's standard /bin/ps does not show the changed process title.
                     24:  * You have to use "/usr/ucb/ps -w" instead.  Besides, the UCB ps does not
                     25:  * show a new title if its length less than the origin command line length.
                     26:  * To avoid it we append to a new title the origin command line in the
                     27:  * parenthesis.
                     28:  */
                     29: 
                     30: extern char **environ;
                     31: 
                     32: static char *ngx_os_argv_last;
                     33: 
                     34: ngx_int_t
                     35: ngx_init_setproctitle(ngx_log_t *log)
                     36: {
                     37:     u_char      *p;
                     38:     size_t       size;
                     39:     ngx_uint_t   i;
                     40: 
                     41:     size = 0;
                     42: 
                     43:     for (i = 0; environ[i]; i++) {
                     44:         size += ngx_strlen(environ[i]) + 1;
                     45:     }
                     46: 
                     47:     p = ngx_alloc(size, log);
                     48:     if (p == NULL) {
                     49:         return NGX_ERROR;
                     50:     }
                     51: 
                     52:     ngx_os_argv_last = ngx_os_argv[0];
                     53: 
                     54:     for (i = 0; ngx_os_argv[i]; i++) {
                     55:         if (ngx_os_argv_last == ngx_os_argv[i]) {
                     56:             ngx_os_argv_last = ngx_os_argv[i] + ngx_strlen(ngx_os_argv[i]) + 1;
                     57:         }
                     58:     }
                     59: 
                     60:     for (i = 0; environ[i]; i++) {
                     61:         if (ngx_os_argv_last == environ[i]) {
                     62: 
                     63:             size = ngx_strlen(environ[i]) + 1;
                     64:             ngx_os_argv_last = environ[i] + size;
                     65: 
                     66:             ngx_cpystrn(p, (u_char *) environ[i], size);
                     67:             environ[i] = (char *) p;
                     68:             p += size;
                     69:         }
                     70:     }
                     71: 
                     72:     ngx_os_argv_last--;
                     73: 
                     74:     return NGX_OK;
                     75: }
                     76: 
                     77: 
                     78: void
                     79: ngx_setproctitle(char *title)
                     80: {
                     81:     u_char     *p;
                     82: 
                     83: #if (NGX_SOLARIS)
                     84: 
                     85:     ngx_int_t   i;
                     86:     size_t      size;
                     87: 
                     88: #endif
                     89: 
                     90:     ngx_os_argv[1] = NULL;
                     91: 
                     92:     p = ngx_cpystrn((u_char *) ngx_os_argv[0], (u_char *) "nginx: ",
                     93:                     ngx_os_argv_last - ngx_os_argv[0]);
                     94: 
                     95:     p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char *) p);
                     96: 
                     97: #if (NGX_SOLARIS)
                     98: 
                     99:     size = 0;
                    100: 
                    101:     for (i = 0; i < ngx_argc; i++) {
                    102:         size += ngx_strlen(ngx_argv[i]) + 1;
                    103:     }
                    104: 
                    105:     if (size > (size_t) ((char *) p - ngx_os_argv[0])) {
                    106: 
                    107:         /*
                    108:          * ngx_setproctitle() is too rare operation so we use
                    109:          * the non-optimized copies
                    110:          */
                    111: 
                    112:         p = ngx_cpystrn(p, (u_char *) " (", ngx_os_argv_last - (char *) p);
                    113: 
                    114:         for (i = 0; i < ngx_argc; i++) {
                    115:             p = ngx_cpystrn(p, (u_char *) ngx_argv[i],
                    116:                             ngx_os_argv_last - (char *) p);
                    117:             p = ngx_cpystrn(p, (u_char *) " ", ngx_os_argv_last - (char *) p);
                    118:         }
                    119: 
                    120:         if (*(p - 1) == ' ') {
                    121:             *(p - 1) = ')';
                    122:         }
                    123:     }
                    124: 
                    125: #endif
                    126: 
                    127:     if (ngx_os_argv_last - (char *) p) {
                    128:         ngx_memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p);
                    129:     }
                    130: 
                    131:     ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
                    132:                    "setproctitle: \"%s\"", ngx_os_argv[0]);
                    133: }
                    134: 
                    135: #endif /* NGX_SETPROCTITLE_USES_ENV */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>