|
@@ -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 */
|