Browse Source

[resolv] Simplify xfer_redirect() logic

Now that we have xfer_vreopen() as the default .vredirect handler,
sending redirection events can become simpler.
tags/v0.9.8
Michael Brown 15 years ago
parent
commit
edea441ad5
1 changed files with 30 additions and 11 deletions
  1. 30
    11
      src/core/resolv.c

+ 30
- 11
src/core/resolv.c View File

@@ -302,9 +302,36 @@ struct named_socket {
302 302
 	int have_local;
303 303
 };
304 304
 
305
+/**
306
+ * Finish using named socket
307
+ *
308
+ * @v named		Named socket
309
+ * @v rc		Reason for finish
310
+ */
311
+static void named_done ( struct named_socket *named, int rc ) {
312
+
313
+	/* Close all interfaces */
314
+	resolv_nullify ( &named->resolv );
315
+	xfer_nullify ( &named->xfer );
316
+	xfer_close ( &named->xfer, rc );
317
+}
318
+
319
+/**
320
+ * Handle close() event
321
+ *
322
+ * @v xfer		Data transfer interface
323
+ * @v rc		Reason for close
324
+ */
325
+static void named_xfer_close ( struct xfer_interface *xfer, int rc ) {
326
+	struct named_socket *named =
327
+		container_of ( xfer, struct named_socket, xfer );
328
+
329
+	named_done ( named, rc );
330
+}
331
+
305 332
 /** Named socket opener data transfer interface operations */
306 333
 static struct xfer_interface_operations named_xfer_ops = {
307
-	.close		= ignore_xfer_close,
334
+	.close		= named_xfer_close,
308 335
 	.vredirect	= ignore_xfer_vredirect,
309 336
 	.window		= no_xfer_window,
310 337
 	.alloc_iob	= default_xfer_alloc_iob,
@@ -324,10 +351,6 @@ static void named_resolv_done ( struct resolv_interface *resolv,
324 351
 	struct named_socket *named =
325 352
 		container_of ( resolv, struct named_socket, resolv );
326 353
 
327
-	/* Unplug resolver and nullify data transfer interface */
328
-	resolv_unplug ( &named->resolv );
329
-	xfer_nullify ( &named->xfer );
330
-
331 354
 	/* Redirect if name resolution was successful */
332 355
 	if ( rc == 0 ) {
333 356
 		rc = xfer_redirect ( &named->xfer, LOCATION_SOCKET,
@@ -336,12 +359,8 @@ static void named_resolv_done ( struct resolv_interface *resolv,
336 359
 				       &named->local : NULL ) );
337 360
 	}
338 361
 
339
-	/* Close data transfer interface if redirection failed */
340
-	if ( rc != 0 )
341
-		xfer_close ( &named->xfer, rc );
342
-
343
-	/* Unplug data transfer interface */
344
-	xfer_unplug ( &named->xfer );
362
+	/* Terminate resolution */
363
+	named_done ( named, rc );
345 364
 }
346 365
 
347 366
 /** Named socket opener name resolution interface operations */

Loading…
Cancel
Save