File: logsocket_plugin.c

package info (click to toggle)
uwsgi 2.0.31-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 6,624 kB
  • sloc: ansic: 87,072; python: 7,010; cpp: 1,133; java: 708; perl: 678; sh: 585; ruby: 555; makefile: 148; xml: 130; cs: 121; objc: 37; php: 28; erlang: 20; javascript: 11
file content (74 lines) | stat: -rw-r--r-- 1,608 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "../../uwsgi.h"

extern struct uwsgi_server uwsgi;

ssize_t uwsgi_socket_logger(struct uwsgi_logger *ul, char *message, size_t len) {

	int family = AF_UNIX;

	if (!ul->configured) {

		char *comma = strchr(ul->arg, ',');
		if (comma) {
			ul->data = comma+1;
			*comma = 0;
		}

        	char *colon = strchr(ul->arg, ':');
        	if (colon) {
                	family = AF_INET;
                	ul->addr_len = socket_to_in_addr(ul->arg, colon, 0, &ul->addr.sa_in);
        	}
        	else {
                	ul->addr_len = socket_to_un_addr(ul->arg, &ul->addr.sa_un);
        	}

        	ul->fd = socket(family, SOCK_DGRAM, 0);
        	if (ul->fd < 0) {
                	uwsgi_error_safe("socket()");
			exit(1);
        	}

		memset(&ul->msg, 0, sizeof(struct msghdr));

		ul->msg.msg_name = &ul->addr;
		ul->msg.msg_namelen = ul->addr_len;
		if (ul->data) {
			ul->msg.msg_iov = uwsgi_malloc(sizeof(struct iovec) * 2);
			ul->msg.msg_iov[0].iov_base = ul->data;
			ul->msg.msg_iov[0].iov_len = strlen(ul->data);
			ul->msg.msg_iovlen = 2;
			ul->count = 1;
		}
		else {
			ul->msg.msg_iov = uwsgi_malloc(sizeof(struct iovec));
			ul->msg.msg_iovlen = 1;
			ul->count = 0;
		}

		if (comma) {
			*comma = ',' ;
		}

		ul->configured = 1;
	}

	
	ul->msg.msg_iov[ul->count].iov_base = message;
	ul->msg.msg_iov[ul->count].iov_len = len;

	return sendmsg(ul->fd, &ul->msg, 0);

}

void uwsgi_logsocket_register() {
	uwsgi_register_logger("socket", uwsgi_socket_logger);
}

struct uwsgi_plugin logsocket_plugin = {

        .name = "logsocket",
        .on_load = uwsgi_logsocket_register,

};