annotate src/os/unix/ngx_setproctitle.c @ 391:1d9bef53cd8e

Range filter: late_ranges functionality. Add one more filtering point after postpone filter. This allows to serve range capable replies with subrequests. It's not as efficient as range filtering for static data (i.e. doesn't save us from reading data from disk if some filter needs them in memory), but it may save some network bandwidth for us and for our users.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 21 Jul 2008 05:33:01 +0400
parents 6ae11d59d10e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11 #if (NGX_SETPROCTITLE_USES_ENV)
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 /*
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 * To change the process title in Linux and Solaris we have to set argv[1]
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 * to NULL and to copy the title to the same place where the argv[0] points to.
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 * However, argv[0] may be too small to hold a new title. Fortunately, Linux
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 * and Solaris store argv[] and environ[] one after another. So we should
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 * ensure that is the continuous memory and then we allocate the new memory
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 * for environ[] and copy it. After this we could use the memory starting
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 * from argv[0] for our process title.
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 *
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 * The Solaris's standard /bin/ps does not show the changed process title.
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 * You have to use "/usr/ucb/ps -w" instead. Besides, the UCB ps dos not
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 * show a new title if its length less than the origin command line length.
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 * To avoid it we append to a new title the origin command line in the
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 * parenthesis.
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 */
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 extern char **environ;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 static char *ngx_os_argv_last;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32
42
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 4
diff changeset
33 ngx_int_t
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 4
diff changeset
34 ngx_init_setproctitle(ngx_log_t *log)
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 {
42
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 4
diff changeset
36 u_char *p;
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 size_t size;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 ngx_uint_t i;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 size = 0;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 for (i = 0; environ[i]; i++) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 size += ngx_strlen(environ[i]) + 1;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 42
diff changeset
46 p = ngx_alloc(size, log);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 42
diff changeset
47 if (p == NULL) {
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 return NGX_ERROR;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 ngx_os_argv_last = ngx_os_argv[0];
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 for (i = 0; ngx_os_argv[i]; i++) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 if (ngx_os_argv_last == ngx_os_argv[i]) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 ngx_os_argv_last = ngx_os_argv[i] + ngx_strlen(ngx_os_argv[i]) + 1;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 for (i = 0; environ[i]; i++) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 if (ngx_os_argv_last == environ[i]) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 size = ngx_strlen(environ[i]) + 1;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 ngx_os_argv_last = environ[i] + size;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64
42
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 4
diff changeset
65 ngx_cpystrn(p, (u_char *) environ[i], size);
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 4
diff changeset
66 environ[i] = (char *) p;
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 p += size;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 ngx_os_argv_last--;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 return NGX_OK;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76
42
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 4
diff changeset
77 void
41ccba1aba45 nginx 0.1.21
Igor Sysoev <http://sysoev.ru>
parents: 4
diff changeset
78 ngx_setproctitle(char *title)
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 u_char *p;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
82 #if (NGX_SOLARIS)
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 ngx_int_t i;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 size_t size;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 #endif
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 ngx_os_argv[1] = NULL;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
91 p = ngx_cpystrn((u_char *) ngx_os_argv[0], (u_char *) "nginx: ",
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 ngx_os_argv_last - ngx_os_argv[0]);
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char *) p);
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
96 #if (NGX_SOLARIS)
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98 size = 0;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 for (i = 0; i < ngx_argc; i++) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 size += ngx_strlen(ngx_argv[i]) + 1;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 if (size > (size_t) ((char *) p - ngx_os_argv[0])) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 /*
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 * ngx_setproctitle() is too rare operation so we use
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 * the non-optimized copies
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 */
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 p = ngx_cpystrn(p, (u_char *) " (", ngx_os_argv_last - (char *) p);
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 for (i = 0; i < ngx_argc; i++) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 p = ngx_cpystrn(p, (u_char *) ngx_argv[i],
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 ngx_os_argv_last - (char *) p);
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 p = ngx_cpystrn(p, (u_char *) " ", ngx_os_argv_last - (char *) p);
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 if (*(p - 1) == ' ') {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 *(p - 1) = ')';
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 #endif
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 if (ngx_os_argv_last - (char *) p) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 ngx_memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p);
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 "setproctitle: \"%s\"", ngx_os_argv[0]);
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
134 #endif /* NGX_SETPROCTITLE_USES_ENV */