Mercurial > pidgin
comparison libpurple/dnssrv.c @ 20635:84c80c8b0e40
Close the pipes to the dnssrv child process. Fixes #3245
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Tue, 25 Sep 2007 04:51:04 +0000 |
parents | 6bf32c9e15a7 |
children | 4604cad304cb |
comparison
equal
deleted
inserted
replaced
20634:275fe4d67158 | 20635:84c80c8b0e40 |
---|---|
67 GThread *resolver; | 67 GThread *resolver; |
68 char *query; | 68 char *query; |
69 char *error_message; | 69 char *error_message; |
70 GSList *results; | 70 GSList *results; |
71 #else | 71 #else |
72 int fd_in, fd_out; | |
72 pid_t pid; | 73 pid_t pid; |
73 #endif | 74 #endif |
74 }; | 75 }; |
75 | 76 |
76 static gint | 77 static gint |
110 | 111 |
111 #ifdef HAVE_SIGNAL_H | 112 #ifdef HAVE_SIGNAL_H |
112 purple_restore_default_signal_handlers(); | 113 purple_restore_default_signal_handlers(); |
113 #endif | 114 #endif |
114 | 115 |
115 if (read(in, query, 256) <= 0) | 116 if (read(in, query, 256) <= 0) { |
117 close(out); | |
118 close(in); | |
116 _exit(0); | 119 _exit(0); |
120 } | |
117 | 121 |
118 size = res_query( query, C_IN, T_SRV, (u_char*)&answer, sizeof( answer)); | 122 size = res_query( query, C_IN, T_SRV, (u_char*)&answer, sizeof( answer)); |
119 | 123 |
120 qdcount = ntohs(answer.hdr.qdcount); | 124 qdcount = ntohs(answer.hdr.qdcount); |
121 ancount = ntohs(answer.hdr.ancount); | 125 ancount = ntohs(answer.hdr.ancount); |
176 { | 180 { |
177 write(out, ret->data, sizeof(PurpleSrvResponse)); | 181 write(out, ret->data, sizeof(PurpleSrvResponse)); |
178 g_free(ret->data); | 182 g_free(ret->data); |
179 ret = g_list_remove(ret, ret->data); | 183 ret = g_list_remove(ret, ret->data); |
180 } | 184 } |
185 | |
186 close(out); | |
187 close(in); | |
181 | 188 |
182 _exit(0); | 189 _exit(0); |
183 } | 190 } |
184 | 191 |
185 static void | 192 static void |
356 | 363 |
357 query_data = g_new0(PurpleSrvQueryData, 1); | 364 query_data = g_new0(PurpleSrvQueryData, 1); |
358 query_data->cb = cb; | 365 query_data->cb = cb; |
359 query_data->extradata = extradata; | 366 query_data->extradata = extradata; |
360 query_data->pid = pid; | 367 query_data->pid = pid; |
368 query_data->fd_out = out[0]; | |
369 query_data->fd_in = in[1]; | |
361 query_data->handle = purple_input_add(out[0], PURPLE_INPUT_READ, resolved, query_data); | 370 query_data->handle = purple_input_add(out[0], PURPLE_INPUT_READ, resolved, query_data); |
362 | 371 |
363 g_free(query); | 372 g_free(query); |
364 | 373 |
365 return query_data; | 374 return query_data; |
397 } | 406 } |
398 | 407 |
399 void | 408 void |
400 purple_srv_cancel(PurpleSrvQueryData *query_data) | 409 purple_srv_cancel(PurpleSrvQueryData *query_data) |
401 { | 410 { |
411 printf("purple_srv_cancel(%p)\n", query_data); | |
402 if (query_data->handle > 0) | 412 if (query_data->handle > 0) |
403 purple_input_remove(query_data->handle); | 413 purple_input_remove(query_data->handle); |
404 #ifdef _WIN32 | 414 #ifdef _WIN32 |
405 if (query_data->resolver != NULL) | 415 if (query_data->resolver != NULL) |
406 { | 416 { |
412 query_data->cb = NULL; | 422 query_data->cb = NULL; |
413 return; | 423 return; |
414 } | 424 } |
415 g_free(query_data->query); | 425 g_free(query_data->query); |
416 g_free(query_data->error_message); | 426 g_free(query_data->error_message); |
427 #else | |
428 close(query_data->fd_out); | |
429 close(query_data->fd_in); | |
417 #endif | 430 #endif |
418 g_free(query_data); | 431 g_free(query_data); |
419 } | 432 } |