Mercurial > pidgin
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 { |