Projet

Général

Profil

« Précédent | Suivant » 

Révision 455d784c

Ajouté par Ermal il y a presque 10 ans

Actually use a separate socket for each fcgi request since its required on STREAM sockets. Facepalm for before

Voir les différences:

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