|
|
|
|
@ -27,7 +27,7 @@ static void control_udp_closed(int fd, void *p) {
|
|
|
|
|
|
|
|
|
|
static void control_udp_incoming(int fd, void *p) {
|
|
|
|
|
struct control_udp *u = p;
|
|
|
|
|
int ret;
|
|
|
|
|
int ret, len;
|
|
|
|
|
char buf[8192];
|
|
|
|
|
struct sockaddr_in sin;
|
|
|
|
|
socklen_t sin_len;
|
|
|
|
|
@ -38,17 +38,17 @@ static void control_udp_incoming(int fd, void *p) {
|
|
|
|
|
struct iovec iov[10];
|
|
|
|
|
|
|
|
|
|
sin_len = sizeof(sin);
|
|
|
|
|
ret = recvfrom(fd, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &sin, &sin_len);
|
|
|
|
|
if (ret <= 0) {
|
|
|
|
|
len = recvfrom(fd, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &sin, &sin_len);
|
|
|
|
|
if (len <= 0) {
|
|
|
|
|
mylog(LOG_WARNING, "Error reading from UDP socket");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buf[ret] = '\0';
|
|
|
|
|
buf[len] = '\0';
|
|
|
|
|
|
|
|
|
|
ret = pcre_exec(u->parse_re, u->parse_ree, buf, ret, 0, 0, ovec, G_N_ELEMENTS(ovec));
|
|
|
|
|
ret = pcre_exec(u->parse_re, u->parse_ree, buf, len, 0, 0, ovec, G_N_ELEMENTS(ovec));
|
|
|
|
|
if (ret <= 0) {
|
|
|
|
|
ret = pcre_exec(u->fallback_re, NULL, buf, ret, 0, 0, ovec, G_N_ELEMENTS(ovec));
|
|
|
|
|
ret = pcre_exec(u->fallback_re, NULL, buf, len, 0, 0, ovec, G_N_ELEMENTS(ovec));
|
|
|
|
|
if (ret <= 0) {
|
|
|
|
|
mylog(LOG_WARNING, "Unable to parse command line from udp:" DF ": %s", DP(sin), buf);
|
|
|
|
|
return;
|
|
|
|
|
@ -203,6 +203,9 @@ struct control_udp *control_udp_new(struct poller *p, u_int32_t ip, u_int16_t po
|
|
|
|
|
/* cookie cmd flags callid addr port */
|
|
|
|
|
c->fallback_re = pcre_compile("^(\\S+)(?:\\s+(\\S)\\S*\\s+\\S+(\\s+\\S+)(\\s+\\S+))?", PCRE_DOLLAR_ENDONLY | PCRE_DOTALL | PCRE_CASELESS, &errptr, &erroff, NULL);
|
|
|
|
|
|
|
|
|
|
if (!c->parse_re || !c->fallback_re)
|
|
|
|
|
goto fail2;
|
|
|
|
|
|
|
|
|
|
ZERO(i);
|
|
|
|
|
i.fd = fd;
|
|
|
|
|
i.closed = control_udp_closed;
|
|
|
|
|
|