]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
remove sockfd from the public API
authorAlan T. DeKok <aland@freeradius.org>
Wed, 7 Jun 2017 14:14:04 +0000 (10:14 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 7 Jun 2017 14:15:07 +0000 (10:15 -0400)
src/lib/io/io.h
src/lib/io/network.c
src/lib/io/network.h
src/lib/io/schedule.c
src/lib/io/schedule.h
src/modules/proto_radius/proto_radius.c
src/modules/proto_radius/proto_radius_udp.c
src/tests/util/radius_schedule_test.c

index 53f5e4dba7002aa3142f7632ec7294c722596727..561e40acbc5461a3d7dd5a3a07c0e4699ec9715e 100644 (file)
@@ -183,7 +183,6 @@ typedef size_t (*fr_io_nak_t)(void const *io_ctx, uint8_t *const packet, size_t
  *  saying "I took saved the data, but the socket wasn't ready, so you
  *  need to call me again at a later point".
  *
- * @param[in] sockfd           the file descriptor to use
  * @param[in] io_ctx           the context for this function
  * @param[in,out] buffer       the buffer where the raw packet will be written to (or read from)
  * @param[in] buffer_len       the length of the buffer
@@ -191,7 +190,7 @@ typedef size_t (*fr_io_nak_t)(void const *io_ctx, uint8_t *const packet, size_t
  *     - <0 on error
  *     - >=0 length of the data read or written.
  */
-typedef ssize_t (*fr_io_data_t)(int sockfd, void *io_ctx, uint8_t *buffer, size_t buffer_len);
+typedef ssize_t (*fr_io_data_t)(void *io_ctx, uint8_t *buffer, size_t buffer_len);
 
 /**  Handle a close or error on the socket.
  *
@@ -200,13 +199,12 @@ typedef ssize_t (*fr_io_data_t)(int sockfd, void *io_ctx, uint8_t *buffer, size_
  *  before "close".  On normal finish, the "close" function will be
  *  called.
  *
- * @param[in] sockfd           the file descriptor to use
  * @param[in] io_ctx           the context for this function
  * @return
  *     - 0 on success
  *     - <0 on error
  */
-typedef int (*fr_io_signal_t)(int sockfd, void *io_ctx);
+typedef int (*fr_io_signal_t)(void *io_ctx);
 
 /** Process a request through the transport async state machine.
  *
index a9597d8a57c96f8b2dc3a2edb423c0dd89bb1f44..cbdbb981f7d342d0de64c11d06e7dd03ade9f148 100644 (file)
@@ -45,7 +45,6 @@ typedef struct fr_network_worker_t {
 typedef struct fr_network_socket_t {
        fr_dlist_t              entry;
 
-       int                     fd;                     //!< the file descriptor
        void                    *ctx;                   //!< transport context
        fr_io_op_t              *transport;             //!< the transport
 
@@ -320,7 +319,7 @@ static void fr_network_read(UNUSED fr_event_list_t *el, int sockfd, void *ctx)
        ssize_t data_size;
        fr_channel_data_t *cd;
 
-       rad_assert(s->fd == sockfd);
+       rad_assert(s->transport->fd(s->ctx) == sockfd);
 
        fr_log(nr->log, L_DBG, "network read");
 
@@ -351,7 +350,7 @@ static void fr_network_read(UNUSED fr_event_list_t *el, int sockfd, void *ctx)
         *      network side knows that it needs to close the
         *      connection.
         */
-       data_size = s->transport->read(sockfd, s->ctx, cd->m.data, cd->m.rb_size);
+       data_size = s->transport->read(s->ctx, cd->m.data, cd->m.rb_size);
        if (data_size == 0) {
                fr_log(nr->log, L_DBG_ERR, "got no data from transport read");
 
@@ -375,9 +374,9 @@ static void fr_network_read(UNUSED fr_event_list_t *el, int sockfd, void *ctx)
         *      fr_io_op_t.
         */
        if (data_size < 0) {
-               fr_log(nr->log, L_DBG_ERR, "error from transport read on socket %d", s->fd);
+               fr_log(nr->log, L_DBG_ERR, "error from transport read on socket %d", sockfd);
 
-               (void) fr_event_fd_delete(nr->el, s->fd);
+               (void) fr_event_fd_delete(nr->el, sockfd);
                fr_dlist_remove(&s->entry);
                talloc_free(s);
                return;
@@ -390,7 +389,6 @@ static void fr_network_read(UNUSED fr_event_list_t *el, int sockfd, void *ctx)
         *      Initialize the rest of the fields of the channel data.
         */
        cd->m.when = fr_time();
-       cd->io->fd = sockfd;
        cd->priority = 0;
        cd->io->ctx = s->ctx;
        cd->io->op = s->transport;
@@ -413,12 +411,12 @@ static void fr_network_read(UNUSED fr_event_list_t *el, int sockfd, void *ctx)
  * @param sockfd the socket which is ready to write
  * @param ctx the network socket context.
  */
-static void fr_network_write(UNUSED fr_event_list_t *el, int sockfd, void *ctx)
+static void fr_network_write(UNUSED fr_event_list_t *el, UNUSED int sockfd, void *ctx)
 {
        fr_network_socket_t *s = ctx;
 
-       if (s->transport->flush(sockfd, s->ctx) < 0) {
-               s->transport->error(sockfd, s->ctx);
+       if (s->transport->flush(s->ctx) < 0) {
+               s->transport->error(s->ctx);
                talloc_free(s);
        }
 }
@@ -429,11 +427,11 @@ static void fr_network_write(UNUSED fr_event_list_t *el, int sockfd, void *ctx)
  * @param sockfd the socket which has a fatal error.
  * @param ctx the network socket context.
  */
-static void fr_network_error(UNUSED fr_event_list_t *el, int sockfd, void *ctx)
+static void fr_network_error(UNUSED fr_event_list_t *el, UNUSED int sockfd, void *ctx)
 {
        fr_network_socket_t *s = ctx;
 
-       s->transport->error(sockfd, s->ctx);
+       s->transport->error(s->ctx);
        talloc_free(s);
 }
 
@@ -441,14 +439,14 @@ static int _network_socket_free(fr_network_socket_t *s)
 {
        fr_network_t *nr = talloc_parent(s);
 
-       fr_event_fd_delete(nr->el, s->fd);
+       fr_event_fd_delete(nr->el, s->transport->fd(s->ctx));
 
        fr_dlist_remove(&s->entry);
 
        if (s->transport->close) {
-               s->transport->close(s->fd, s->ctx);
+               s->transport->close(s->ctx);
        } else {
-               close(s->fd);
+               close(s->transport->fd(s->ctx));
        }
 
        return 0;
@@ -463,6 +461,7 @@ static int _network_socket_free(fr_network_socket_t *s)
  */
 static void fr_network_socket_callback(void *ctx, void const *data, size_t data_size, UNUSED fr_time_t now)
 {
+       int fd;
        fr_network_t *nr = ctx;
        fr_network_socket_t *s;
        fr_event_fd_handler_t write_fn, error_fn;
@@ -501,7 +500,9 @@ static void fr_network_socket_callback(void *ctx, void const *data, size_t data_
 
        if (s->transport->error) error_fn = fr_network_error;
 
-       if (fr_event_fd_insert(nr->el, s->fd, fr_network_read, write_fn, error_fn, s) < 0) {
+       fd = s->transport->fd(s->ctx);
+
+       if (fr_event_fd_insert(nr->el, fd, fr_network_read, write_fn, error_fn, s) < 0) {
                fr_log(nr->log, L_ERR, "Failed adding new socket to event loop: %s", fr_strerror());
                talloc_free(s);
                return;
@@ -509,7 +510,7 @@ static void fr_network_socket_callback(void *ctx, void const *data, size_t data_
 
        fr_dlist_insert_head(&nr->sockets, &s->entry);
 
-       fr_log(nr->log, L_DBG, "Using new socket with FD %d", s->fd);
+       fr_log(nr->log, L_DBG, "Using new socket with FD %d", fd);
 }
 
 
@@ -764,7 +765,7 @@ void fr_network(fr_network_t *nr)
                 *      the reply is a NAK, don't write it to the
                 *      network.
                 */
-               rcode = io->op->write(io->fd, io->ctx, cd->m.data, cd->m.data_size);
+               rcode = io->op->write(io->ctx, cd->m.data, cd->m.data_size);
                if (rcode < 0) {
                        fr_dlist_t *entry;
 
@@ -774,16 +775,16 @@ void fr_network(fr_network_t *nr)
                         *      Don't call close, as that will be done
                         *      in the destructor.
                         */
-                       if (io->op->error) io->op->error(io->fd, io->ctx);
+                       if (io->op->error) io->op->error(io->ctx);
 
                        /*
-                        *      Find the socket which matches this
-                        *      file descriptor.
+                        *      Find the fr_network_socket_t which
+                        *      matches this message.
                         *
-                        *      @todo - put them into a binary tree
-                        *      based on FD.  That way we can handle
-                        *      tens of thousands without walking a
-                        *      linked list.
+                        *      @todo - put them into a binary tree.
+                        *      That way we can handle tens of
+                        *      thousands without walking a linked
+                        *      list.
                         */
                        for (entry = FR_DLIST_FIRST(nr->sockets);
                             entry != NULL;
@@ -791,7 +792,7 @@ void fr_network(fr_network_t *nr)
                                fr_network_socket_t *s;
 
                                s = fr_ptr_to_type(fr_network_socket_t, entry, entry);
-                               if (s->fd == io->fd) {
+                               if (s->ctx == io->ctx) {
                                        talloc_free(s);
                                        break;
                                }
@@ -823,16 +824,14 @@ void fr_network_exit(fr_network_t *nr)
 /** Add a socket to a network
  *
  * @param nr the network
- * @param fd the file descriptor for the socket
  * @param ctx the context for the transport
  * @param transport the transport
  */
-int fr_network_socket_add(fr_network_t *nr, int fd, void *ctx, fr_io_op_t *transport)
+int fr_network_socket_add(fr_network_t *nr, void *ctx, fr_io_op_t *transport)
 {
        fr_network_socket_t m;
 
        memset(&m, 0, sizeof(m));
-       m.fd = fd;
        m.ctx = ctx;
        m.transport = transport;
 
index 968c485bc3454d3d2fc45db2093096aa2f3928e6..292af2ed62741fec741fb6a766280f413b266e60 100644 (file)
@@ -38,7 +38,7 @@ void fr_network_exit(fr_network_t *nr);
 int fr_network_destroy(fr_network_t *nr) CC_HINT(nonnull);
 void fr_network(fr_network_t *nr) CC_HINT(nonnull);
 
-int fr_network_socket_add(fr_network_t *nr, int fd, void *ctx, fr_io_op_t *transport) CC_HINT(nonnull);
+int fr_network_socket_add(fr_network_t *nr, void *ctx, fr_io_op_t *transport) CC_HINT(nonnull);
 int fr_network_worker_add(fr_network_t *nr, fr_worker_t *worker) CC_HINT(nonnull);
 
 #ifdef __cplusplus
index 6ba5a763169f07a26cf2769a6961db228fe210e2..06d37986b8d97ae85adbf58bc3fd272691beaa5c 100644 (file)
@@ -629,16 +629,15 @@ int fr_schedule_destroy(fr_schedule_t *sc)
 /** Add a socket to a scheduler.
  *
  * @param sc the scheduler
- * @param fd the file descriptor for the socket
  * @param ctx the context for the transport
  * @param transport the transport
  * @return
  *     - NULL on error
  *     - the fr_network_t that the socket was added to.
  */
-fr_network_t *fr_schedule_socket_add(fr_schedule_t *sc, int fd, void *ctx, fr_io_op_t *transport)
+fr_network_t *fr_schedule_socket_add(fr_schedule_t *sc, void *ctx, fr_io_op_t *transport)
 {
-       if (fr_network_socket_add(sc->sn->rc, fd, ctx, transport) < 0) {
+       if (fr_network_socket_add(sc->sn->rc, ctx, transport) < 0) {
                return NULL;
        }
 
index ace2d1dd46aa023d0d87f5f92fb7045f7d5400f0..fbf17973d5c1ee7483e54a6d63747ca49db861ce 100644 (file)
@@ -43,7 +43,7 @@ fr_schedule_t *fr_schedule_create(TALLOC_CTX *ctx, fr_log_t *log, int max_inputs
 int fr_schedule_destroy(fr_schedule_t *sc);
 int fr_schedule_get_worker_kq(fr_schedule_t *sc);
 
-fr_network_t *fr_schedule_socket_add(fr_schedule_t *sc, int fd, void *ctx, fr_io_op_t *transport) CC_HINT(nonnull);
+fr_network_t *fr_schedule_socket_add(fr_schedule_t *sc, void *ctx, fr_io_op_t *transport) CC_HINT(nonnull);
 
 #ifdef __cplusplus
 }
index ad4663c02263b0ecc8ec04c7dcbb3c434cd61024..110f67fd25372f95475617b0ad17038f027a1494 100644 (file)
@@ -215,6 +215,10 @@ static int open_transport(proto_radius_ctx_t *ctx, UNUSED fr_schedule_t *handle,
                return -1;
        }
 
+       /*
+        *      Add port_name
+        */
+
        app_io = (fr_app_io_t const *) module->common;
        if (app_io->instantiate(io_cs, io_ctx) < 0) {
                cf_log_err_cs(cs, "Failed instantiating 'transport = %s'", value);
index 2e7c1572ea71bee4889799dea0c9c2c7f47a89c6..963d2fd78431f1d1fea9c86666743fc540be299a 100644 (file)
@@ -73,7 +73,7 @@ static const CONF_PARSER udp_listen_conf[] = {
        CONF_PARSER_TERMINATOR
 };
 
-static ssize_t mod_read(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_read(void *ctx, uint8_t *buffer, size_t buffer_len)
 {
        ssize_t data_size;
        size_t packet_len;
@@ -82,7 +82,7 @@ static ssize_t mod_read(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_le
 
        pc->salen = sizeof(pc->src);
 
-       data_size = recvfrom(sockfd, buffer, buffer_len, 0, (struct sockaddr *) &pc->src, &pc->salen);
+       data_size = recvfrom(pc->sockfd, buffer, buffer_len, 0, (struct sockaddr *) &pc->src, &pc->salen);
        if (data_size <= 0) return data_size;
 
        packet_len = data_size;
@@ -108,7 +108,7 @@ static ssize_t mod_read(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_le
 }
 
 
-static ssize_t mod_write(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_len)
+static ssize_t mod_write(void *ctx, uint8_t *buffer, size_t buffer_len)
 {
        ssize_t data_size;
        fr_packet_ctx_t *pc = ctx;
@@ -118,7 +118,7 @@ static ssize_t mod_write(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_l
        /*
         *      @todo - do more stuff
         */
-       data_size = sendto(sockfd, buffer, buffer_len, 0, (struct sockaddr *) &pc->src, pc->salen);
+       data_size = sendto(pc->sockfd, buffer, buffer_len, 0, (struct sockaddr *) &pc->src, pc->salen);
        if (data_size <= 0) return data_size;
 
        /*
index 6562e814f9a627b573c498939eead7bb5ec55c64..e1b0893afd08fcdbd00a0b129c481ab31d43e8a6 100644 (file)
@@ -115,14 +115,14 @@ static size_t test_nak(void const *ctx, uint8_t *const packet, size_t packet_len
        return 10;
 }
 
-static ssize_t test_read(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_len)
+static ssize_t test_read(void *ctx, uint8_t *buffer, size_t buffer_len)
 {
        ssize_t data_size;
        fr_packet_ctx_t *pc = ctx;
 
        pc->salen = sizeof(pc->src);
 
-       data_size = recvfrom(sockfd, buffer, buffer_len, 0, (struct sockaddr *) &pc->src, &pc->salen);
+       data_size = recvfrom(pc->sockfd, buffer, buffer_len, 0, (struct sockaddr *) &pc->src, &pc->salen);
        if (data_size <= 0) return data_size;
 
        /*
@@ -135,14 +135,14 @@ static ssize_t test_read(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_l
 }
 
 
-static ssize_t test_write(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_len)
+static ssize_t test_write(void *ctx, uint8_t *buffer, size_t buffer_len)
 {
        ssize_t data_size;
        fr_packet_ctx_t *pc = ctx;
 
        pc->salen = sizeof(pc->src);
 
-       data_size = sendto(sockfd, buffer, buffer_len, 0, (struct sockaddr *) &pc->src, pc->salen);
+       data_size = sendto(pc->sockfd, buffer, buffer_len, 0, (struct sockaddr *) &pc->src, pc->salen);
        if (data_size <= 0) return data_size;
 
        /*
@@ -152,6 +152,13 @@ static ssize_t test_write(int sockfd, void *ctx, uint8_t *buffer, size_t buffer_
        return data_size;
 }
 
+static int test_fd(void *ctx)
+{
+       fr_packet_ctx_t *pc = ctx;
+
+       return pc->sockfd;
+}
+
 
 static fr_io_op_t transport = {
        .name = "schedule-test",
@@ -161,6 +168,7 @@ static fr_io_op_t transport = {
        .decode = test_decode,
        .encode = test_encode,
        .nak = test_nak,
+       .fd = test_fd,
 };
 
 static void NEVER_RETURNS usage(void)
@@ -265,7 +273,7 @@ int main(int argc, char *argv[])
 
        packet_ctx.sockfd = sockfd;
 
-       (void) fr_schedule_socket_add(sched, sockfd, &packet_ctx, &transport);
+       (void) fr_schedule_socket_add(sched, &packet_ctx, &transport);
 
        sleep(10);