Annotation of embedaddon/nginx/src/os/unix/ngx_setproctitle.c, revision 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>