-/*
- dispatch any incoming meta requests
-*/
-int handle_incoming_meta_data(conn_list_t *cl)
-{
- int x, l = sizeof(x);
- unsigned char tmp[1600];
- int request;
- int lenin = 0;
-cp
- if(getsockopt(cl->meta_socket, SOL_SOCKET, SO_ERROR, &x, &l) < 0)
- {
- syslog(LOG_ERR, "This is a bug: %s:%d: %d:%m", __FILE__, __LINE__, cl->meta_socket);
- return -1;
- }
- if(x)
- {
- syslog(LOG_ERR, "Metadata socket error: %s", sys_errlist[x]);
- return -1;
- }
-
- if(read(cl->meta_socket, &tmp, 1) <= 0)
- {
- syslog(LOG_ERR, "Receive failed: %m");
- return -1;
- }
-
- request = (int)(tmp[0]);
-
- if(debug_lvl > 3)
- syslog(LOG_DEBUG, "got request %d", request);
-
- /* This is a hack. After an ACK request, multiple ADD_HOSTs can
- follow. So if the request is one of these, only read as much
- bytes as necessary. (Luckily the ADD_HOST request is of fixed
- length) :P -- ivo */
-
- if(request != ACK)
- {
- if(request == ADD_HOST)
- {
- if((lenin = read(cl->meta_socket, &tmp[1], sizeof(add_host_t) - 1)) <= 0)
- {
- syslog(LOG_ERR, "Receive failed for ADD_HOST: %m");
- return -1;
- }
- }
- else
- {
- if((lenin = read(cl->meta_socket, &tmp[1], sizeof(tmp) - 1)) <= 0)
- {
- if(errno != EAGAIN) /* talk about hacks... */
- {
- syslog(LOG_ERR, "Receive failed: %m");
- return -1;
+ tv.tv_sec = 1 + (rand() & 7); /* Approx. 5 seconds, randomized to prevent global synchronisation effects */
+ tv.tv_usec = 0;
+
+ maxfd = build_fdset(&fset);
+
+ r = select(maxfd + 1, &fset, NULL, NULL, &tv);
+
+ if(r < 0) {
+ if(errno != EINTR && errno != EAGAIN) {
+ syslog(LOG_ERR, _("Error while waiting for input: %s"),
+ strerror(errno));
+ cp_trace();
+ dump_connections();
+ return;
+ }
+
+ continue;