~ubuntu-branches/ubuntu/raring/glib2.0/raring-proposed

« back to all changes in this revision

Viewing changes to gio/gnetworkaddress.c

  • Committer: Package Import Robot
  • Author(s): Iain Lane
  • Date: 2013-03-22 15:34:02 UTC
  • mfrom: (172.1.9 experimental)
  • Revision ID: package-import@ubuntu.com-20130322153402-sairsye8us9zxmew
Tags: 2.35.9-2ubuntu1
* Resynchronise with Debian experimental, remaining change:
  - Make python BD :all to facilitate cross building

Show diffs side-by-side

added added

removed removed

Lines of Context:
65
65
  guint16 port;
66
66
  GList *sockaddrs;
67
67
  gchar *scheme;
 
68
 
 
69
  gint64 resolver_serial;
68
70
};
69
71
 
70
72
enum {
226
228
 
227
229
static void
228
230
g_network_address_set_addresses (GNetworkAddress *addr,
229
 
                                 GList           *addresses)
 
231
                                 GList           *addresses,
 
232
                                 guint64          resolver_serial)
230
233
{
231
234
  GList *a;
232
235
  GSocketAddress *sockaddr;
241
244
    }
242
245
  g_list_free (addresses);
243
246
  addr->priv->sockaddrs = g_list_reverse (addr->priv->sockaddrs);
 
247
 
 
248
  addr->priv->resolver_serial = resolver_serial;
244
249
}
245
250
 
246
251
static gboolean
846
851
 
847
852
  if (addr_enum->addresses == NULL)
848
853
    {
849
 
      if (!addr_enum->addr->priv->sockaddrs)
850
 
        g_network_address_parse_sockaddr (addr_enum->addr);
851
 
      if (!addr_enum->addr->priv->sockaddrs)
852
 
        {
853
 
          GResolver *resolver = g_resolver_get_default ();
 
854
      GNetworkAddress *addr = addr_enum->addr;
 
855
      GResolver *resolver = g_resolver_get_default ();
 
856
      gint64 serial = g_resolver_get_serial (resolver);
 
857
 
 
858
      if (addr->priv->resolver_serial != 0 &&
 
859
          addr->priv->resolver_serial != serial)
 
860
        {
 
861
          /* Resolver has reloaded, discard cached addresses */
 
862
          g_list_free_full (addr->priv->sockaddrs, g_object_unref);
 
863
          addr->priv->sockaddrs = NULL;
 
864
        }
 
865
 
 
866
      if (!addr->priv->sockaddrs)
 
867
        g_network_address_parse_sockaddr (addr);
 
868
      if (!addr->priv->sockaddrs)
 
869
        {
854
870
          GList *addresses;
855
871
 
856
872
          addresses = g_resolver_lookup_by_name (resolver,
857
 
                                                 addr_enum->addr->priv->hostname,
 
873
                                                 addr->priv->hostname,
858
874
                                                 cancellable, error);
859
 
          g_object_unref (resolver);
860
 
 
861
875
          if (!addresses)
862
 
            return NULL;
 
876
            {
 
877
              g_object_unref (resolver);
 
878
              return NULL;
 
879
            }
863
880
 
864
 
          g_network_address_set_addresses (addr_enum->addr, addresses);
 
881
          g_network_address_set_addresses (addr, addresses, serial);
865
882
        }
866
883
          
867
 
      addr_enum->addresses = addr_enum->addr->priv->sockaddrs;
 
884
      addr_enum->addresses = addr->priv->sockaddrs;
868
885
      addr_enum->next = addr_enum->addresses;
 
886
      g_object_unref (resolver);
869
887
    }
870
888
 
871
889
  if (addr_enum->next == NULL)
916
934
      addresses = g_resolver_lookup_by_name_finish (resolver, result, &error);
917
935
 
918
936
      if (!error)
919
 
        g_network_address_set_addresses (addr_enum->addr, addresses);
 
937
        {
 
938
          g_network_address_set_addresses (addr_enum->addr, addresses,
 
939
                                           g_resolver_get_serial (resolver));
 
940
        }
920
941
    }
921
942
  have_addresses (addr_enum, task, error);
922
943
}
936
957
 
937
958
  if (addr_enum->addresses == NULL)
938
959
    {
939
 
      if (!addr_enum->addr->priv->sockaddrs)
940
 
        {
941
 
          if (g_network_address_parse_sockaddr (addr_enum->addr))
 
960
      GNetworkAddress *addr = addr_enum->addr;
 
961
      GResolver *resolver = g_resolver_get_default ();
 
962
      gint64 serial = g_resolver_get_serial (resolver);
 
963
 
 
964
      if (addr->priv->resolver_serial != 0 &&
 
965
          addr->priv->resolver_serial != serial)
 
966
        {
 
967
          /* Resolver has reloaded, discard cached addresses */
 
968
          g_list_free_full (addr->priv->sockaddrs, g_object_unref);
 
969
          addr->priv->sockaddrs = NULL;
 
970
        }
 
971
 
 
972
      if (!addr->priv->sockaddrs)
 
973
        {
 
974
          if (g_network_address_parse_sockaddr (addr))
942
975
            have_addresses (addr_enum, task, NULL);
943
976
          else
944
977
            {
945
 
              GResolver *resolver = g_resolver_get_default ();
946
 
 
947
978
              g_resolver_lookup_by_name_async (resolver,
948
 
                                               addr_enum->addr->priv->hostname,
 
979
                                               addr->priv->hostname,
949
980
                                               cancellable,
950
981
                                               got_addresses, task);
951
 
              g_object_unref (resolver);
952
982
            }
 
983
          g_object_unref (resolver);
953
984
          return;
954
985
        }
955
986
 
956
 
      addr_enum->addresses = addr_enum->addr->priv->sockaddrs;
 
987
      addr_enum->addresses = addr->priv->sockaddrs;
957
988
      addr_enum->next = addr_enum->addresses;
 
989
      g_object_unref (resolver);
958
990
    }
959
991
 
960
992
  if (addr_enum->next)