]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Implement file close in network tranference.
authorManoel Rebelo Abranches <mrabran@br.ibm.com>
Tue, 10 May 2011 12:32:38 +0000 (09:32 -0300)
committerManoel Rebelo Abranches <mrabran@br.ibm.com>
Tue, 10 May 2011 12:32:38 +0000 (09:32 -0300)
Stop receiving packets from card on error.

grub-core/kern/file.c
grub-core/net/net.c

index 6e7ed0e578a01efb253ad5020e417a0a429f5b98..2b3e9d68902d2a9a71087c950ed5d7a41e45c8d1 100644 (file)
@@ -27,6 +27,7 @@
 
 grub_ssize_t (*grub_file_net_read) (grub_file_t file, void *buf, grub_size_t len) = NULL;
 grub_err_t (*grub_file_net_open) (struct grub_file *file, const char *name) = NULL;
+grub_err_t (*grub_file_net_close) (grub_file_t file) = NULL;
 grub_err_t (*grub_file_net_seek) (struct grub_file *file, grub_off_t offset) = NULL;
 
 grub_file_filter_t grub_file_filters_all[GRUB_FILE_FILTER_MAX];
@@ -176,8 +177,11 @@ grub_err_t
 grub_file_close (grub_file_t file)
 {
   if (file->device->net)
-    return grub_errno;
-
+    {
+      grub_file_net_close (file);
+      return grub_errno;
+    }
   if (file->fs->close)
     (file->fs->close) (file);
 
index cdeaa5a3274791838db91f66140a1032c507abb7..6ccf207258f7e35ed56b1d6d713ebbd997525cc9 100644 (file)
@@ -619,18 +619,35 @@ fail:
 
 }
 
+static grub_err_t
+grub_net_file_close_real (grub_file_t file)
+{
+  grub_net_socket_t sock = file->device->net->socket;
+  while (sock->packs->first)
+    {
+      grub_netbuff_free (sock->packs->first->nb);
+      grub_net_remove_packet (sock->packs->first);
+    }
+  grub_net_socket_unregister (sock);
+  grub_free (sock);
+  return GRUB_ERR_NONE;
+
+}
+
 static grub_err_t
 receive_packets (struct grub_net_card *card)
 {
   /* Maybe should be better have a fixed number of packets for each card
      and just mark them as used and not used.  */ 
   struct grub_net_buff *nb;
+  grub_err_t err;
   nb = grub_netbuff_alloc (1500);
   if (!nb)
     return grub_errno;
 
-  card->driver->recv (card, nb);
-  return GRUB_ERR_NONE;
+  if ((err = card->driver->recv (card, nb)) != GRUB_ERR_NONE)
+    grub_netbuff_free (nb);
+  return err;
 }
 
 void
@@ -642,7 +659,8 @@ grub_net_pool_cards (unsigned time)
     {
       start_time = grub_get_time_ms ();
        while( (grub_get_time_ms () - start_time) < time)       
-         receive_packets (card);
+         if( receive_packets (card) != GRUB_ERR_NONE)
+          break;
     }
 }
 
@@ -1018,6 +1036,7 @@ GRUB_MOD_INIT(net)
 
   grub_net_open = grub_net_open_real;
   grub_file_net_open = grub_net_file_open_real;
+  grub_file_net_close = grub_net_file_close_real;
   grub_file_net_read = grub_net_read_real;
   grub_file_net_seek = grub_net_seek_real;
 }
@@ -1034,4 +1053,5 @@ GRUB_MOD_FINI(net)
   grub_net_open = NULL;
   grub_file_net_read = NULL;
   grub_file_net_open = NULL;
+  grub_file_net_close = NULL;
 }