diff options
author | Michael Brown | 2009-03-30 16:23:57 +0200 |
---|---|---|
committer | Michael Brown | 2009-03-30 16:23:57 +0200 |
commit | edea441ad59bd6eaa75bc7613bb8b850f866de9e (patch) | |
tree | 83cc85bb1071103719ac11a84a066c4efee2f11c | |
parent | [http] Support HTTP redirection (diff) | |
download | ipxe-edea441ad59bd6eaa75bc7613bb8b850f866de9e.tar.gz ipxe-edea441ad59bd6eaa75bc7613bb8b850f866de9e.tar.xz ipxe-edea441ad59bd6eaa75bc7613bb8b850f866de9e.zip |
[resolv] Simplify xfer_redirect() logic
Now that we have xfer_vreopen() as the default .vredirect handler,
sending redirection events can become simpler.
-rw-r--r-- | src/core/resolv.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/src/core/resolv.c b/src/core/resolv.c index 33e341d2..5a5d4afe 100644 --- a/src/core/resolv.c +++ b/src/core/resolv.c @@ -302,9 +302,36 @@ struct named_socket { int have_local; }; +/** + * Finish using named socket + * + * @v named Named socket + * @v rc Reason for finish + */ +static void named_done ( struct named_socket *named, int rc ) { + + /* Close all interfaces */ + resolv_nullify ( &named->resolv ); + xfer_nullify ( &named->xfer ); + xfer_close ( &named->xfer, rc ); +} + +/** + * Handle close() event + * + * @v xfer Data transfer interface + * @v rc Reason for close + */ +static void named_xfer_close ( struct xfer_interface *xfer, int rc ) { + struct named_socket *named = + container_of ( xfer, struct named_socket, xfer ); + + named_done ( named, rc ); +} + /** Named socket opener data transfer interface operations */ static struct xfer_interface_operations named_xfer_ops = { - .close = ignore_xfer_close, + .close = named_xfer_close, .vredirect = ignore_xfer_vredirect, .window = no_xfer_window, .alloc_iob = default_xfer_alloc_iob, @@ -324,10 +351,6 @@ static void named_resolv_done ( struct resolv_interface *resolv, struct named_socket *named = container_of ( resolv, struct named_socket, resolv ); - /* Unplug resolver and nullify data transfer interface */ - resolv_unplug ( &named->resolv ); - xfer_nullify ( &named->xfer ); - /* Redirect if name resolution was successful */ if ( rc == 0 ) { rc = xfer_redirect ( &named->xfer, LOCATION_SOCKET, @@ -336,12 +359,8 @@ static void named_resolv_done ( struct resolv_interface *resolv, &named->local : NULL ) ); } - /* Close data transfer interface if redirection failed */ - if ( rc != 0 ) - xfer_close ( &named->xfer, rc ); - - /* Unplug data transfer interface */ - xfer_unplug ( &named->xfer ); + /* Terminate resolution */ + named_done ( named, rc ); } /** Named socket opener name resolution interface operations */ |