comparison libpurple/dnssrv.c @ 31742:ad79fa168cee

Fixes to the PurpleSrvTxtQueryUiOps code. Refs #12647 committer: Paul Aurich <paul@darkrain42.org>
author thijsalkemade@gmail.com
date Sun, 17 Jul 2011 17:14:21 +0000
parents 92f3d821653f
children a40d1cb09beb
comparison
equal deleted inserted replaced
31741:f7c94fc60a0c 31742:ad79fa168cee
521 } 521 }
522 } 522 }
523 } 523 }
524 524
525 waitpid(query_data->pid, &status, 0); 525 waitpid(query_data->pid, &status, 0);
526 purple_srv_cancel(query_data); 526 purple_srv_txt_query_destroy(query_data);
527 } 527 }
528 528
529 #else /* _WIN32 */ 529 #else /* _WIN32 */
530 530
531 /** The Jabber Server code was inspiration for parts of this. */ 531 /** The Jabber Server code was inspiration for parts of this. */
581 } 581 }
582 582
583 query_data->resolver = NULL; 583 query_data->resolver = NULL;
584 query_data->handle = 0; 584 query_data->handle = 0;
585 585
586 purple_srv_cancel(query_data); 586 purple_srv_txt_query_destroy(query_data);
587 587
588 return FALSE; 588 return FALSE;
589 } 589 }
590 590
591 static gpointer 591 static gpointer
734 query_data = g_new0(PurpleSrvTxtQueryData, 1); 734 query_data = g_new0(PurpleSrvTxtQueryData, 1);
735 query_data->type = PurpleDnsTypeSrv; 735 query_data->type = PurpleDnsTypeSrv;
736 query_data->cb.srv = cb; 736 query_data->cb.srv = cb;
737 query_data->extradata = extradata; 737 query_data->extradata = extradata;
738 query_data->query = query; 738 query_data->query = query;
739 query_data->fd_in = -1;
740 query_data->fd_out = -1;
739 741
740 if (purple_srv_txt_query_ui_resolve(query_data)) 742 if (purple_srv_txt_query_ui_resolve(query_data))
741 { 743 {
742 return query_data; 744 return query_data;
743 } 745 }
866 query_data = g_new0(PurpleSrvTxtQueryData, 1); 868 query_data = g_new0(PurpleSrvTxtQueryData, 1);
867 query_data->type = PurpleDnsTypeTxt; 869 query_data->type = PurpleDnsTypeTxt;
868 query_data->cb.txt = cb; 870 query_data->cb.txt = cb;
869 query_data->extradata = extradata; 871 query_data->extradata = extradata;
870 query_data->query = query; 872 query_data->query = query;
873 query_data->fd_in = -1;
874 query_data->fd_out = -1;
871 875
872 if (purple_srv_txt_query_ui_resolve(query_data)) { 876 if (purple_srv_txt_query_ui_resolve(query_data)) {
873 /* query intentionally not freed 877 /* query intentionally not freed
874 */ 878 */
875 return query_data; 879 return query_data;
947 return query_data; 951 return query_data;
948 #endif 952 #endif
949 } 953 }
950 954
951 void 955 void
952 purple_srv_cancel(PurpleSrvTxtQueryData *query_data) 956 purple_srv_txt_query_destroy(PurpleSrvTxtQueryData *query_data)
953 { 957 {
954 PurpleSrvTxtQueryUiOps *ops = purple_srv_txt_query_get_ui_ops(); 958 PurpleSrvTxtQueryUiOps *ops = purple_srv_txt_query_get_ui_ops();
955 959
956 if (ops && ops->destroy) 960 if (ops && ops->destroy)
957 ops->destroy(query_data); 961 ops->destroy(query_data);
967 * finish. 971 * finish.
968 */ 972 */
969 query_data->cb.srv = NULL; 973 query_data->cb.srv = NULL;
970 return; 974 return;
971 } 975 }
972 g_free(query_data->query);
973 g_free(query_data->error_message); 976 g_free(query_data->error_message);
974 #else 977 #else
975 close(query_data->fd_out); 978 if (query_data->fd_out != -1)
976 close(query_data->fd_in); 979 close(query_data->fd_out);
977 #endif 980 if (query_data->fd_in != -1)
981 close(query_data->fd_in);
982 #endif
983 g_free(query_data->query);
978 g_free(query_data); 984 g_free(query_data);
979 } 985 }
980 986
981 void 987 void
982 purple_txt_cancel(PurpleSrvTxtQueryData *query_data) 988 purple_txt_cancel(PurpleSrvTxtQueryData *query_data)
983 { 989 {
984 purple_srv_cancel(query_data); 990 purple_srv_txt_query_destroy(query_data);
991 }
992
993 void
994 purple_srv_cancel(PurpleSrvTxtQueryData *query_data)
995 {
996 purple_srv_txt_query_destroy(query_data);
985 } 997 }
986 998
987 const gchar * 999 const gchar *
988 purple_txt_response_get_content(PurpleTxtResponse *resp) 1000 purple_txt_response_get_content(PurpleTxtResponse *resp)
989 { 1001 {
1004 * Only used as the callback for the ui ops. 1016 * Only used as the callback for the ui ops.
1005 */ 1017 */
1006 static void 1018 static void
1007 purple_srv_query_resolved(PurpleSrvTxtQueryData *query_data, GList *records) 1019 purple_srv_query_resolved(PurpleSrvTxtQueryData *query_data, GList *records)
1008 { 1020 {
1021 GList *sorted_records, *l;
1022 PurpleSrvResponse *records_array;
1023 int i;
1024
1009 g_return_if_fail(records != NULL); 1025 g_return_if_fail(records != NULL);
1026
1027 if (query_data->cb.srv == NULL) {
1028 purple_srv_txt_query_destroy(query_data);
1029
1030 g_list_foreach(records, (GFunc)g_free, NULL);
1031 g_list_free(records);
1032 return;
1033 }
1034
1035 sorted_records = purple_srv_sort(records);
1036
1037 purple_debug_info("dnssrv", "SRV records resolved for %s, count: %d\n", query_data->query, g_list_length(sorted_records));
1038
1039 records_array = g_new(PurpleSrvResponse, g_list_length(sorted_records));
1040
1041 i = 0;
1042
1043 for (l = sorted_records; l; l = l->next, i++) {
1044 records_array[i] = *(PurpleSrvResponse *)l->data;
1045 }
1046
1047 query_data->cb.srv(records_array, i, query_data->extradata);
1010 1048
1011 purple_debug_info("dnssrv", "SRV records resolved for %s, count: %d\n", query_data->query, g_list_length(records)); 1049 purple_srv_txt_query_destroy(query_data);
1012 1050
1013 if (query_data->cb.srv != NULL) 1051 g_list_foreach(sorted_records, (GFunc)g_free, NULL);
1014 query_data->cb.srv(purple_srv_sort(records)->data, g_list_length(records), query_data->extradata); 1052 g_list_free(sorted_records);
1015 } 1053 }
1016 1054
1017 /* 1055 /*
1018 * Only used as the callback for the ui ops. 1056 * Only used as the callback for the ui ops.
1019 */ 1057 */
1022 { 1060 {
1023 g_return_if_fail(entries != NULL); 1061 g_return_if_fail(entries != NULL);
1024 1062
1025 purple_debug_info("dnssrv", "TXT entries resolved for %s, count: %d\n", query_data->query, g_list_length(entries)); 1063 purple_debug_info("dnssrv", "TXT entries resolved for %s, count: %d\n", query_data->query, g_list_length(entries));
1026 1064
1065 /* the callback should g_free the entries.
1066 */
1027 if (query_data->cb.txt != NULL) 1067 if (query_data->cb.txt != NULL)
1028 query_data->cb.txt(entries, query_data->extradata); 1068 query_data->cb.txt(entries, query_data->extradata);
1069 else {
1070 g_list_foreach(entries, (GFunc)g_free, NULL);
1071 g_list_free(entries);
1072 }
1073
1074 purple_srv_txt_query_destroy(query_data);
1029 } 1075 }
1030 1076
1031 static void 1077 static void
1032 purple_srv_query_failed(PurpleSrvTxtQueryData *query_data, const gchar *error_message) 1078 purple_srv_query_failed(PurpleSrvTxtQueryData *query_data, const gchar *error_message)
1033 { 1079 {
1034 purple_debug_error("dnssrv", "%s\n", error_message); 1080 purple_debug_error("dnssrv", "%s\n", error_message);
1035 1081
1036 if (query_data->cb.srv != NULL) 1082 if (query_data->cb.srv != NULL)
1037 query_data->cb.srv(NULL, 0, query_data->extradata); 1083 query_data->cb.srv(NULL, 0, query_data->extradata);
1038 1084
1039 purple_srv_cancel(query_data); 1085 purple_srv_txt_query_destroy(query_data);
1040 } 1086 }
1041 1087
1042 static gboolean 1088 static gboolean
1043 purple_srv_txt_query_ui_resolve(PurpleSrvTxtQueryData *query_data) 1089 purple_srv_txt_query_ui_resolve(PurpleSrvTxtQueryData *query_data)
1044 { 1090 {