diff --git a/api/glue/device.c b/api/glue/device.c index e63b5c2a474a2729fd8a2243102c8d9cb8278c95..191deadf6d5d3534c752ce1a4c9d6fc961f6baf3 100644 --- a/api/glue/device.c +++ b/api/glue/device.c @@ -154,6 +154,43 @@ eb_status_t eb_device_open(eb_socket_t socketp, const char* address, eb_width_t return EB_OK; } +eb_link_t eb_device_new_slave(eb_socket_t socketp, eb_transport_t transportp, eb_link_t linkp) { + eb_device_t devicep; + eb_link_t new_linkp; + struct eb_device* device; + struct eb_transport* transport; + struct eb_socket* socket; + struct eb_link* link; + + devicep = eb_new_device(); + if (devicep == EB_NULL) goto fail0; + + new_linkp = eb_new_link(); + if (new_linkp == EB_NULL) goto fail1; + + socket = EB_SOCKET(socketp); + device = EB_DEVICE(devicep); + + device->socket = socketp; + device->passive = devicep; + device->unready = 0; + device->widths = 0; + device->link = linkp; + device->transport = transportp; + device->next = socket->first_device; + socket->first_device = devicep; + + return new_linkp; + +fail1: + eb_free_device(devicep); +fail0: + transport = EB_TRANSPORT(transportp); + link = EB_LINK(linkp); + eb_transports[transport->link_type].disconnect(transport, link); + return linkp; +} + eb_status_t eb_device_close(eb_device_t devicep) { struct eb_socket* socket; struct eb_device* device; diff --git a/api/glue/device.h b/api/glue/device.h index 53ca195c33b1561c54929e6024650c619fb4f3a0..f38cb35a36bfb2138ee6aa915a893bdd44facefe 100644 --- a/api/glue/device.h +++ b/api/glue/device.h @@ -49,5 +49,7 @@ struct eb_device { eb_transport_t transport; }; +/* Create a new slave device */ +eb_link_t eb_device_new_slave(eb_socket_t socketp, eb_transport_t transportp, eb_link_t linkp); #endif diff --git a/api/glue/socket.c b/api/glue/socket.c index 6e6214dde5b90079f348d23436897692effbb7ae..ac2a36a9fad153aab1c4b2eb28f06977c2282035 100644 --- a/api/glue/socket.c +++ b/api/glue/socket.c @@ -303,8 +303,10 @@ eb_status_t eb_socket_poll(eb_socket_t socketp) { struct eb_transport* transport; struct eb_response* response; struct eb_cycle* cycle; + struct eb_link* new_link; eb_device_t devicep, next_devicep; eb_transport_t transportp, next_transportp; + eb_link_t new_linkp; eb_response_t responsep; eb_cycle_t cyclep; eb_socket_aux_t auxp; @@ -338,16 +340,25 @@ eb_status_t eb_socket_poll(eb_socket_t socketp) { /* Step 2. Check all devices */ - /* Poll all the transports */ + /* Get some memory for accepting connections */ + new_linkp = eb_new_link(); + new_link = 0; + + /* Poll all the transports, potentially discovering new devices */ aux = EB_SOCKET_AUX(auxp); for (transportp = aux->first_transport; transportp != EB_NULL; transportp = next_transportp) { transport = EB_TRANSPORT(transportp); next_transportp = transport->next; eb_device_slave(socketp, transportp, EB_NULL); + + /* Try to accept inbound connections */ + if (new_linkp != EB_NULL) new_link = EB_LINK(new_linkp); + if ((*eb_transports[transport->link_type].accept)(transport, new_link) > 0) + new_linkp = eb_device_new_slave(socketp, transportp, new_linkp); } - /* Add all the sockets to the listen set */ + /* Poll all the connections */ socket = EB_SOCKET(socketp); for (devicep = socket->first_device; devicep != EB_NULL; devicep = next_devicep) { device = EB_DEVICE(devicep);