handle incoming traffic on UDP sockets
Costa Tsaousis (ktsaou) committed
Jan 11, 2018 at 10:52 UTC
f7378ece2b98d54c7d59ac9a5fb56f86b8a53b0b
1 file changed
+17
-10
src/socket.c
+17
-10
@@ -1111,6 +1111,8 @@ void *poll_default_add_callback(POLLINFO *pi, short int *events, void *data) {
1111
(void)events;
1112
(void)data;
1113
1114
+ // error("POLLFD: internal error: poll_default_add_callback() called");
1115
+
1116
return NULL;
1117
}
1118
@@ -1120,7 +1122,7 @@ void poll_default_del_callback(POLLINFO *pi) {
1122
}
1123
1124
int poll_default_rcv_callback(POLLINFO *pi, short int *events) {
1123
- (void)events;
1125
+ *events |= POLLIN;
1126
1127
char buffer[1024 + 1];
1128
@@ -1130,12 +1132,12 @@ int poll_default_rcv_callback(POLLINFO *pi, short int *events) {
1132
if (rc < 0) {
1133
// read failed
1134
if (errno != EWOULDBLOCK && errno != EAGAIN) {
1133
- error("POLLFD: recv() failed.");
1135
+ error("POLLFD: poll_default_rcv_callback(): recv() failed with %zd.", rc);
1136
return -1;
1137
}
1138
} else if (rc) {
1139
// data received
1138
- info("POLLFD: internal error: discarding %zd bytes received on socket %d", rc, pi->fd);
1140
+ info("POLLFD: internal error: poll_default_rcv_callback() is discarding %zd bytes received on socket %d", rc, pi->fd);
1141
}
1142
} while (rc != -1);
1143
@@ -1145,7 +1147,7 @@ int poll_default_rcv_callback(POLLINFO *pi, short int *events) {
1147
int poll_default_snd_callback(POLLINFO *pi, short int *events) {
1148
*events &= ~POLLOUT;
1149
1148
- info("POLLFD: internal error: nothing to send on socket %d", pi->fd);
1150
+ info("POLLFD: internal error: poll_default_snd_callback(): nothing to send on socket %d", pi->fd);
1151
return 0;
1152
}
1153
@@ -1301,6 +1303,11 @@ void poll_events(LISTEN_SOCKETS *sockets
1303
, SIMPLE_PATTERN *access_list
1304
, void *data
1305
) {
1306
+ if(!sockets || !sockets->opened) {
1307
+ error("POLLFD: internal error: no listening sockets are opened");
1308
+ return;
1309
+ }
1310
+
1311
int retval;
1312
1313
POLLJOB p = {
@@ -1328,10 +1335,10 @@ void poll_events(LISTEN_SOCKETS *sockets
1335
, POLLINFO_FLAG_SERVER_SOCKET
1336
, (sockets->fds_names[i])?sockets->fds_names[i]:"UNKNOWN"
1337
, ""
1331
- , poll_default_add_callback
1332
- , poll_default_del_callback
1333
- , poll_default_rcv_callback
1334
- , poll_default_snd_callback
1338
+ , p.add_callback
1339
+ , p.del_callback
1340
+ , p.rcv_callback
1341
+ , p.snd_callback
1342
, NULL
1343
);
1344
@@ -1348,8 +1355,8 @@ void poll_events(LISTEN_SOCKETS *sockets
1355
retval = poll(p.fds, p.max + 1, timeout);
1356
1357
if(unlikely(retval == -1)) {
1351
- error("POLLFD: LISTENER: poll() failed.");
1352
- continue;
1358
+ error("POLLFD: LISTENER: poll() failed while waiting on %zu sockets.", p.max + 1);
1359
+ break;
1360
}
1361
else if(unlikely(!retval)) {
1362
debug(D_POLLFD, "POLLFD: LISTENER: poll() timeout.");