Browse Source

io: add io_conn_fd()

Useful for getsockname().

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 12 years ago
parent
commit
8700faf27f
3 changed files with 17 additions and 1 deletions
  1. 5 0
      ccan/io/io.c
  2. 8 0
      ccan/io/io.h
  3. 4 1
      ccan/io/test/run-01-start-finish.c

+ 5 - 0
ccan/io/io.c

@@ -472,6 +472,11 @@ struct io_plan io_break_(void *ret, struct io_plan plan)
 	return plan;
 	return plan;
 }
 }
 
 
+int io_conn_fd(const struct io_conn *conn)
+{
+	return conn->fd.fd;
+}
+
 void io_set_alloc(void *(*allocfn)(size_t size),
 void io_set_alloc(void *(*allocfn)(size_t size),
 		  void *(*reallocfn)(void *ptr, size_t size),
 		  void *(*reallocfn)(void *ptr, size_t size),
 		  void (*freefn)(void *ptr))
 		  void (*freefn)(void *ptr))

+ 8 - 0
ccan/io/io.h

@@ -491,6 +491,14 @@ struct io_plan io_close_cb(struct io_conn *, void *unused);
  */
  */
 void *io_loop(void);
 void *io_loop(void);
 
 
+/**
+ * io_conn_fd - get the fd from a connection.
+ * @conn: the connection.
+ *
+ * Sometimes useful, eg for getsockname().
+ */
+int io_conn_fd(const struct io_conn *conn);
+
 /**
 /**
  * io_set_alloc - set alloc/realloc/free function for io to use.
  * io_set_alloc - set alloc/realloc/free function for io to use.
  * @allocfn: allocator function
  * @allocfn: allocator function

+ 4 - 1
ccan/io/test/run-01-start-finish.c

@@ -9,10 +9,12 @@
 #ifndef PORT
 #ifndef PORT
 #define PORT "65001"
 #define PORT "65001"
 #endif
 #endif
+static int expected_fd;
 
 
 static void finish_ok(struct io_conn *conn, int *state)
 static void finish_ok(struct io_conn *conn, int *state)
 {
 {
 	ok1(*state == 1);
 	ok1(*state == 1);
+	ok1(io_conn_fd(conn) == expected_fd);
 	(*state)++;
 	(*state)++;
 	io_break(state + 1, io_idle());
 	io_break(state + 1, io_idle());
 }
 }
@@ -21,6 +23,7 @@ static void init_conn(int fd, int *state)
 {
 {
 	ok1(*state == 0);
 	ok1(*state == 0);
 	(*state)++;
 	(*state)++;
+	expected_fd = fd;
 	io_set_finish(io_new_conn(fd, io_close()), finish_ok, state);
 	io_set_finish(io_new_conn(fd, io_close()), finish_ok, state);
 }
 }
 
 
@@ -64,7 +67,7 @@ int main(void)
 	int fd;
 	int fd;
 
 
 	/* This is how many tests you plan to run */
 	/* This is how many tests you plan to run */
-	plan_tests(9);
+	plan_tests(10);
 	fd = make_listen_fd(PORT, &addrinfo);
 	fd = make_listen_fd(PORT, &addrinfo);
 	ok1(fd >= 0);
 	ok1(fd >= 0);
 	l = io_new_listener(fd, init_conn, &state);
 	l = io_new_listener(fd, init_conn, &state);