|
Lines 34-43
Link Here
|
| 34 |
/** |
34 |
/** |
| 35 |
* open the errorlog |
35 |
* open the errorlog |
| 36 |
* |
36 |
* |
| 37 |
* we have 3 possibilities: |
37 |
* we have 4 possibilities: |
| 38 |
* - stderr (default) |
38 |
* - stderr (default) |
| 39 |
* - syslog |
39 |
* - syslog |
| 40 |
* - logfile |
40 |
* - logfile |
|
|
41 |
* - pipe |
| 41 |
* |
42 |
* |
| 42 |
* if the open failed, report to the user and die |
43 |
* if the open failed, report to the user and die |
| 43 |
* |
44 |
* |
|
Lines 57-77
Link Here
|
| 57 |
srv->errorlog_mode = ERRORLOG_SYSLOG; |
58 |
srv->errorlog_mode = ERRORLOG_SYSLOG; |
| 58 |
} else if (!buffer_is_empty(srv->srvconf.errorlog_file)) { |
59 |
} else if (!buffer_is_empty(srv->srvconf.errorlog_file)) { |
| 59 |
const char *logfile = srv->srvconf.errorlog_file->ptr; |
60 |
const char *logfile = srv->srvconf.errorlog_file->ptr; |
| 60 |
|
61 |
|
| 61 |
if (-1 == (srv->errorlog_fd = open(logfile, O_APPEND | O_WRONLY | O_CREAT | O_LARGEFILE, 0644))) { |
62 |
if (logfile[0] == '|') { |
| 62 |
log_error_write(srv, __FILE__, __LINE__, "SSSS", |
63 |
#ifdef HAVE_FORK |
| 63 |
"opening errorlog '", logfile, |
64 |
/* create write pipe and spawn process */ |
| 64 |
"' failed: ", strerror(errno)); |
65 |
|
| 65 |
|
66 |
int to_log_fds[2]; |
|
|
67 |
pid_t pid; |
| 68 |
|
| 69 |
if (pipe(to_log_fds)) { |
| 70 |
log_error_write(srv, __FILE__, __LINE__, "ss", |
| 71 |
"pipe failed: ", strerror(errno)); |
| 72 |
return -1; |
| 73 |
} |
| 74 |
|
| 75 |
/* fork, execve */ |
| 76 |
switch (pid = fork()) { |
| 77 |
case 0: |
| 78 |
/* child */ |
| 79 |
|
| 80 |
close(STDIN_FILENO); |
| 81 |
dup2(to_log_fds[0], STDIN_FILENO); |
| 82 |
close(to_log_fds[0]); |
| 83 |
/* not needed */ |
| 84 |
close(to_log_fds[1]); |
| 85 |
|
| 86 |
/* we don't need the client socket */ |
| 87 |
for (fd = 3; fd < 256; fd++) { |
| 88 |
close(fd); |
| 89 |
} |
| 90 |
|
| 91 |
/* exec the log-process (skip the | ) |
| 92 |
* |
| 93 |
*/ |
| 94 |
|
| 95 |
execl("/bin/sh", "sh", "-c", logfile + 1, NULL); |
| 96 |
|
| 97 |
log_error_write(srv, __FILE__, __LINE__, "sss", |
| 98 |
"spawning log-process failed: ", |
| 99 |
strerror(errno), logfile + 1); |
| 100 |
|
| 101 |
exit(-1); |
| 102 |
break; |
| 103 |
case -1: |
| 104 |
/* error */ |
| 105 |
log_error_write(srv, __FILE__, __LINE__, "ss", "fork failed:", strerror(errno)); |
| 106 |
break; |
| 107 |
default: |
| 108 |
close(to_log_fds[0]); |
| 109 |
|
| 110 |
srv->errorlog_fd = to_log_fds[1]; |
| 111 |
|
| 112 |
break; |
| 113 |
} |
| 114 |
srv->errorlog_mode = ERRORLOG_PIPE; |
| 115 |
#else |
| 116 |
log_error_write(srv, __FILE__, __LINE__, "SSS", |
| 117 |
"opening errorlog '", logfile,"' impossible"); |
| 66 |
return -1; |
118 |
return -1; |
| 67 |
} |
119 |
#endif |
|
|
120 |
} else { |
| 121 |
if (-1 == (srv->errorlog_fd = open(logfile, O_APPEND | O_WRONLY | O_CREAT | O_LARGEFILE, 0644))) { |
| 122 |
log_error_write(srv, __FILE__, __LINE__, "SSSS", |
| 123 |
"opening errorlog '", logfile, |
| 124 |
"' failed: ", strerror(errno)); |
| 125 |
|
| 126 |
return -1; |
| 127 |
} |
| 128 |
srv->errorlog_mode = ERRORLOG_FILE; |
| 129 |
} |
| 68 |
#ifdef FD_CLOEXEC |
130 |
#ifdef FD_CLOEXEC |
| 69 |
/* close fd on exec (cgi) */ |
131 |
/* close fd on exec (cgi) */ |
| 70 |
fcntl(srv->errorlog_fd, F_SETFD, FD_CLOEXEC); |
132 |
fcntl(srv->errorlog_fd, F_SETFD, FD_CLOEXEC); |
| 71 |
#endif |
133 |
#endif |
| 72 |
srv->errorlog_mode = ERRORLOG_FILE; |
134 |
} |
| 73 |
} |
135 |
|
| 74 |
|
|
|
| 75 |
log_error_write(srv, __FILE__, __LINE__, "s", "server started"); |
136 |
log_error_write(srv, __FILE__, __LINE__, "s", "server started"); |
| 76 |
|
137 |
|
| 77 |
#ifdef HAVE_VALGRIND_VALGRIND_H |
138 |
#ifdef HAVE_VALGRIND_VALGRIND_H |
|
Lines 99-105
Link Here
|
| 99 |
*/ |
160 |
*/ |
| 100 |
|
161 |
|
| 101 |
int log_error_cycle(server *srv) { |
162 |
int log_error_cycle(server *srv) { |
| 102 |
/* only cycle if we are not in syslog-mode */ |
163 |
/* only cycle if the error log is a file */ |
| 103 |
|
164 |
|
| 104 |
if (srv->errorlog_mode == ERRORLOG_FILE) { |
165 |
if (srv->errorlog_mode == ERRORLOG_FILE) { |
| 105 |
const char *logfile = srv->srvconf.errorlog_file->ptr; |
166 |
const char *logfile = srv->srvconf.errorlog_file->ptr; |
|
Lines 135-140
Link Here
|
| 135 |
log_error_write(srv, __FILE__, __LINE__, "s", "server stopped"); |
196 |
log_error_write(srv, __FILE__, __LINE__, "s", "server stopped"); |
| 136 |
|
197 |
|
| 137 |
switch(srv->errorlog_mode) { |
198 |
switch(srv->errorlog_mode) { |
|
|
199 |
case ERRORLOG_PIPE: /* fall through */ |
| 138 |
case ERRORLOG_FILE: |
200 |
case ERRORLOG_FILE: |
| 139 |
close(srv->errorlog_fd); |
201 |
close(srv->errorlog_fd); |
| 140 |
break; |
202 |
break; |
|
Lines 154-159
Link Here
|
| 154 |
va_list ap; |
216 |
va_list ap; |
| 155 |
|
217 |
|
| 156 |
switch(srv->errorlog_mode) { |
218 |
switch(srv->errorlog_mode) { |
|
|
219 |
case ERRORLOG_PIPE: |
| 157 |
case ERRORLOG_FILE: |
220 |
case ERRORLOG_FILE: |
| 158 |
case ERRORLOG_STDERR: |
221 |
case ERRORLOG_STDERR: |
| 159 |
/* cache the generated timestamp */ |
222 |
/* cache the generated timestamp */ |
|
Lines 238-243
Link Here
|
| 238 |
va_end(ap); |
301 |
va_end(ap); |
| 239 |
|
302 |
|
| 240 |
switch(srv->errorlog_mode) { |
303 |
switch(srv->errorlog_mode) { |
|
|
304 |
case ERRORLOG_PIPE: /* fall through */ |
| 241 |
case ERRORLOG_FILE: |
305 |
case ERRORLOG_FILE: |
| 242 |
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, "\n"); |
306 |
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, "\n"); |
| 243 |
write(srv->errorlog_fd, srv->errorlog_buf->ptr, srv->errorlog_buf->used - 1); |
307 |
write(srv->errorlog_fd, srv->errorlog_buf->ptr, srv->errorlog_buf->used - 1); |