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>