Révision 455d784c
Ajouté par Ermal il y a presque 10 ans
pfPorts/check_reload_status/files/check_reload_status.c | ||
---|---|---|
55 | 55 |
|
56 | 56 |
#include "fastcgi.h" |
57 | 57 |
|
58 |
/* function definitions */ |
|
59 |
static void handle_signal(int); |
|
60 |
static void handle_signal_act(int, siginfo_t *, void *); |
|
61 |
static void run_command(struct command *, char *); |
|
62 |
static void set_blockmode(int socket, int cmd); |
|
63 |
struct command * match_command(struct command *target, char *wordpassed); |
|
64 |
struct command * parse_command(int fd, int argc, char **argv); |
|
65 |
static void socket_read_command(int socket, short event, void *arg); |
|
66 |
static void show_command_list(int fd, const struct command *list); |
|
67 |
static void socket_accept_command(int socket, short event, void *arg); |
|
68 |
static void socket_close_command(int fd, struct event *ev); |
|
69 |
static void socket_read_fcgi(int, short, void *); |
|
70 |
static void fcgi_send_command(int, short, void *); |
|
71 |
static int fcgi_open_socket(void); |
|
72 |
|
|
73 | 58 |
/* |
74 | 59 |
* Internal representation of a packet. |
75 | 60 |
*/ |
... | ... | |
81 | 66 |
int requestId; |
82 | 67 |
int aggregate; |
83 | 68 |
int dontexec; |
69 |
int socket; |
|
70 |
struct event socket_ev; |
|
84 | 71 |
}; |
85 | 72 |
TAILQ_HEAD(runqueue, runq) cmds = TAILQ_HEAD_INITIALIZER(cmds);; |
86 | 73 |
|
74 |
/* function definitions */ |
|
75 |
static void handle_signal(int); |
|
76 |
static void handle_signal_act(int, siginfo_t *, void *); |
|
77 |
static void run_command(struct command *, char *); |
|
78 |
static void set_blockmode(int socket, int cmd); |
|
79 |
struct command * match_command(struct command *target, char *wordpassed); |
|
80 |
struct command * parse_command(int fd, int argc, char **argv); |
|
81 |
static void socket_read_command(int socket, short event, void *arg); |
|
82 |
static void show_command_list(int fd, const struct command *list); |
|
83 |
static void socket_accept_command(int socket, short event, void *arg); |
|
84 |
static void socket_close_command(int fd, struct event *ev); |
|
85 |
static void socket_read_fcgi(int, short, void *); |
|
86 |
static void fcgi_send_command(int, short, void *); |
|
87 |
static int fcgi_open_socket(struct runq *); |
|
88 |
|
|
87 | 89 |
static pid_t ppid = -1; |
88 | 90 |
static struct utsname uts; |
89 |
static int fcgifd = -1; |
|
90 | 91 |
static int keepalive = 1; |
91 | 92 |
static char *fcgipath = (char *)FCGI_SOCK_PATH; |
92 |
struct event fcgiev; |
|
93 | 93 |
|
94 | 94 |
static int |
95 | 95 |
prepare_packet(FCGI_Header *header, int type, int lcontent, int requestId) |
... | ... | |
126 | 126 |
} |
127 | 127 |
|
128 | 128 |
static int |
129 |
fcgi_open_socket() |
|
129 |
fcgi_open_socket(struct runq *cmd)
|
|
130 | 130 |
{ |
131 | 131 |
struct sockaddr_un sun; |
132 |
int fcgifd; |
|
132 | 133 |
|
133 | 134 |
fcgifd = socket(PF_UNIX, SOCK_STREAM, 0); |
134 | 135 |
if (fcgifd < 0) { |
135 |
printf("Could not socket\n");
|
|
136 |
syslog(LOG_ERR, "Could not socket\n");
|
|
136 | 137 |
return (-1); |
137 | 138 |
} |
138 | 139 |
|
... | ... | |
140 | 141 |
sun.sun_family = PF_UNIX; |
141 | 142 |
strlcpy(sun.sun_path, fcgipath, sizeof(sun.sun_path)); |
142 | 143 |
if (connect(fcgifd, (struct sockaddr *)&sun, sizeof(sun)) < 0) { |
143 |
printf("Could not bind\n");
|
|
144 |
syslog(LOG_ERR, "Could not connect to %s\n", fcgipath);
|
|
144 | 145 |
close(fcgifd); |
145 | 146 |
return (-1); |
146 | 147 |
} |
147 | 148 |
|
148 | 149 |
set_blockmode(fcgifd, O_NONBLOCK | FD_CLOEXEC); |
149 | 150 |
|
150 |
event_set(&fcgiev, fcgifd, EV_READ | EV_PERSIST, socket_read_fcgi, &fcgiev);
|
|
151 |
event_add(&fcgiev, NULL);
|
|
151 |
event_set(&cmd->socket_ev, fcgifd, EV_READ | EV_PERSIST, socket_read_fcgi, cmd);
|
|
152 |
event_add(&cmd->socket_ev, NULL);
|
|
152 | 153 |
|
153 | 154 |
return (fcgifd); |
154 | 155 |
} |
... | ... | |
296 | 297 |
struct timeval tv = { 8, 0 }; |
297 | 298 |
static int requestId = 0; |
298 | 299 |
int len, result; |
299 |
char *p, sbuf[4096], buf[4096]; |
|
300 |
char *p, sbuf[4096], buf[4096], *bufptr;
|
|
300 | 301 |
|
301 | 302 |
cmd = arg; |
302 | 303 |
if (cmd == NULL) |
... | ... | |
305 | 306 |
if (cmd->dontexec) { |
306 | 307 |
TAILQ_REMOVE(&cmds, cmd, rq_link); |
307 | 308 |
timeout_del(&cmd->ev); |
309 |
event_del(&cmd->socket_ev); |
|
308 | 310 |
free(cmd); |
309 | 311 |
return; |
310 | 312 |
} |
... | ... | |
348 | 350 |
#endif |
349 | 351 |
memset(buf, 0, sizeof(buf)); |
350 | 352 |
|
353 |
bufptr = buf; |
|
351 | 354 |
bHeader = (FCGI_BeginRequestRecord *)buf; |
352 | 355 |
prepare_packet(&bHeader->header, FCGI_BEGIN_REQUEST, sizeof(bHeader->body), requestId); |
353 | 356 |
bHeader->body.roleB0 = (unsigned char)FCGI_RESPONDER; |
354 | 357 |
bHeader->body.flags = (unsigned char)(keepalive ? FCGI_KEEP_CONN : 0); |
355 |
bHeader++; |
|
356 |
tmpl = (FCGI_Header *)bHeader; |
|
358 |
|
|
359 |
bufptr += sizeof(FCGI_Header); |
|
360 |
tmpl = (FCGI_Header *)bufptr; |
|
357 | 361 |
prepare_packet(tmpl, FCGI_PARAMS, sbuf_len(&sb), requestId); |
358 |
tmpl++; |
|
362 |
|
|
363 |
bufptr += sizeof(FCGI_Header); |
|
364 |
tmpl = (FCGI_Header *)bufptr; |
|
359 | 365 |
memcpy((char *)tmpl, sbuf_data(&sb), sbuf_len(&sb)); |
360 |
tmpl = (FCGI_Header *)(((char *)tmpl) + sbuf_len(&sb)); |
|
366 |
|
|
367 |
bufptr += sbuf_len(&sb); |
|
368 |
tmpl = (FCGI_Header *)bufptr; |
|
361 | 369 |
prepare_packet(tmpl, FCGI_PARAMS, 0, requestId); |
362 |
tmpl++; |
|
370 |
|
|
371 |
bufptr += sizeof(FCGI_Header); |
|
372 |
tmpl = (FCGI_Header *)bufptr; |
|
363 | 373 |
prepare_packet(tmpl, FCGI_STDIN, 0, requestId); |
364 |
if (fcgifd < 0) { |
|
365 |
syslog(LOG_ERR, "Reopening fcgi socket"); |
|
366 |
if (fcgi_open_socket() < 0) { |
|
374 |
if (cmd->socket < 0) { |
|
375 |
if ((cmd->socket = fcgi_open_socket(cmd)) < 0) { |
|
367 | 376 |
/* Reschedule */ |
368 | 377 |
tv.tv_sec = 1; |
378 |
cmd->socket = -1; |
|
369 | 379 |
timeout_add(&cmd->ev, &tv); |
370 | 380 |
return; |
371 | 381 |
} |
372 | 382 |
} |
373 | 383 |
|
374 |
result = write(fcgifd, buf, len);
|
|
384 |
result = write(cmd->socket, buf, len);
|
|
375 | 385 |
if (result < 0) { |
376 |
if (fcgifd) {
|
|
377 |
event_del(&fcgiev);
|
|
378 |
close(fcgifd);
|
|
386 |
if (cmd->socket) {
|
|
387 |
event_del(&cmd->socket_ev);
|
|
388 |
close(cmd->socket);
|
|
379 | 389 |
} |
380 |
fcgifd = -1;
|
|
390 |
cmd->socket = -1;
|
|
381 | 391 |
syslog(LOG_ERR, "Something wrong happened while sending request: %m\n"); |
382 | 392 |
timeout_add(&cmd->ev, &tv); |
383 | 393 |
} else if (cmd->aggregate > 0) { |
... | ... | |
495 | 505 |
break; |
496 | 506 |
} |
497 | 507 |
|
498 |
if (cmd->cmd.flags & FCGICMD) |
|
508 |
if (cmd->cmd.flags & FCGICMD) { |
|
509 |
command->socket = fcgi_open_socket(command); |
|
499 | 510 |
timeout_set(&command->ev, fcgi_send_command, command); |
500 |
else
|
|
511 |
} else {
|
|
501 | 512 |
timeout_set(&command->ev, run_command_detailed, command); |
513 |
} |
|
502 | 514 |
timeout_add(&command->ev, &tv); |
503 | 515 |
|
504 | 516 |
return; |
... | ... | |
513 | 525 |
} |
514 | 526 |
|
515 | 527 |
static void |
516 |
socket_read_fcgi(int fd, short event, void *arg __unused)
|
|
528 |
socket_read_fcgi(int fd, short event, void *arg) |
|
517 | 529 |
{ |
518 |
struct runq *tmpcmd = NULL;
|
|
530 |
struct runq *tmpcmd = arg;
|
|
519 | 531 |
FCGI_Header header; |
520 | 532 |
char buf[4096]; |
521 | 533 |
int len, terr, success = 0; |
522 | 534 |
|
523 | 535 |
if (event == EV_TIMEOUT) { |
524 | 536 |
close(fd); |
525 |
fcgi_open_socket(); |
|
537 |
fcgi_open_socket(tmpcmd);
|
|
526 | 538 |
return; |
527 | 539 |
} |
528 | 540 |
|
... | ... | |
530 | 542 |
memset(&header, 0, sizeof(header)); |
531 | 543 |
if (recv(fd, &header, sizeof(header), 0) > 0) { |
532 | 544 |
len = (header.requestIdB1 << 8) | header.requestIdB0; |
533 |
TAILQ_FOREACH(tmpcmd, &cmds, rq_link) { |
|
534 |
if (tmpcmd->requestId == len) |
|
535 |
break; |
|
536 |
} |
|
537 | 545 |
len = (header.contentLengthB1 << 8) | header.contentLengthB0; |
538 | 546 |
len += header.paddingLength; |
539 | 547 |
|
... | ... | |
544 | 552 |
/* XXX: Should check if len > sizeof(buf)? */ |
545 | 553 |
terr = recv(fd, buf, len, 0); |
546 | 554 |
if (terr < 0) { |
547 |
//syslog(LOG_ERR, "Something happened during recv of data");
|
|
555 |
syslog(LOG_ERR, "Something happened during recv of data: %m");
|
|
548 | 556 |
return; |
549 | 557 |
} |
550 | 558 |
} |
... | ... | |
583 | 591 |
if (success) { |
584 | 592 |
TAILQ_REMOVE(&cmds, tmpcmd, rq_link); |
585 | 593 |
timeout_del(&tmpcmd->ev); |
594 |
event_del(&tmpcmd->socket_ev); |
|
586 | 595 |
free(tmpcmd); |
587 | 596 |
} else { |
588 | 597 |
/* Rexec the command so the event is not lost. */ |
Formats disponibles : Unified diff
Actually use a separate socket for each fcgi request since its required on STREAM sockets. Facepalm for before