Thu, 27 May 2021 20:25:24 -0500
Change the default irc server to libera.chat
This seems to make the most sense for users right now as many many channels have migrated away from freenode with many of them moving to libera.
Testing Done:
Compile only.
Reviewed at https://reviews.imfreedom.org/r/675/
| 8351 | 1 | /** |
| 2 | * @file dcc_send.c Functions used in sending files with DCC SEND | |
| 3 | * | |
| 15884 | 4 | * purple |
| 8351 | 5 | * |
| 6 | * Copyright (C) 2004, Timothy T Ringenbach <omarvo@hotmail.com> | |
| 15884 | 7 | * Copyright (C) 2003, Robbert Haarman <purple@inglorion.net> |
| 8351 | 8 | * |
| 9 | * This program is free software; you can redistribute it and/or modify | |
| 10 | * it under the terms of the GNU General Public License as published by | |
| 11 | * the Free Software Foundation; either version 2 of the License, or | |
| 12 | * (at your option) any later version. | |
| 13 | * | |
| 14 | * This program is distributed in the hope that it will be useful, | |
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 | * GNU General Public License for more details. | |
| 18 | * | |
| 19 | * You should have received a copy of the GNU General Public License | |
| 20 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
15884
diff
changeset
|
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 8351 | 22 | */ |
| 23 | ||
| 24 | #include "internal.h" | |
| 25 | #include "irc.h" | |
| 26 | #include "debug.h" | |
| 27 | #include "ft.h" | |
|
40755
fb2056ce3c58
Implement mitigation for GHSL-2021-045
Gary Kramlich <grim@reaperworld.com>
parents:
36028
diff
changeset
|
28 | #include "glibcompat.h" |
| 8351 | 29 | #include "notify.h" |
| 30 | #include "network.h" | |
| 31 | ||
| 32 | /*************************************************************************** | |
| 33 | * Functions related to receiving files via DCC SEND | |
| 34 | ***************************************************************************/ | |
| 35 | ||
| 36 | struct irc_xfer_rx_data { | |
| 37 | gchar *ip; | |
| 38 | }; | |
| 39 | ||
| 15884 | 40 | static void irc_dccsend_recv_destroy(PurpleXfer *xfer) |
| 8351 | 41 | { |
| 42 | struct irc_xfer_rx_data *xd = xfer->data; | |
| 43 | ||
|
21676
dabfb5216949
Fix #3983 by canceling the file transfer when connecting to the remote host fails.
Daniel Atallah <datallah@pidgin.im>
parents:
21389
diff
changeset
|
44 | g_free(xd->ip); |
| 8351 | 45 | g_free(xd); |
| 46 | } | |
| 47 | ||
| 48 | /* | |
| 49 | * This function is called whenever data is received. | |
| 50 | * It sends the acknowledgement (in the form of a total byte count as an | |
| 51 | * unsigned 4 byte integer in network byte order) | |
| 52 | */ | |
| 15884 | 53 | static void irc_dccsend_recv_ack(PurpleXfer *xfer, const guchar *data, size_t size) { |
|
27472
68b65e95f436
Don't send 64-bit DCC application-level acknowledgments on 64-bit systems.
Ethan Blanton <elb@pidgin.im>
parents:
24763
diff
changeset
|
54 | guint32 l; |
|
22196
5f46b63e2c0d
Part of a large patch from o_sukhodolsky to fix some build warnings.
Richard Laager <rlaager@pidgin.im>
parents:
21676
diff
changeset
|
55 | size_t result; |
| 8351 | 56 | |
| 57 | l = htonl(xfer->bytes_sent); | |
|
22196
5f46b63e2c0d
Part of a large patch from o_sukhodolsky to fix some build warnings.
Richard Laager <rlaager@pidgin.im>
parents:
21676
diff
changeset
|
58 | result = write(xfer->fd, &l, sizeof(l)); |
|
5f46b63e2c0d
Part of a large patch from o_sukhodolsky to fix some build warnings.
Richard Laager <rlaager@pidgin.im>
parents:
21676
diff
changeset
|
59 | if (result != sizeof(l)) { |
|
22257
dd49963fe3f6
Use g_strerror() instead of strerror() in a few places.
Richard Laager <rlaager@pidgin.im>
parents:
22196
diff
changeset
|
60 | purple_debug_error("irc", "unable to send acknowledgement: %s\n", g_strerror(errno)); |
|
22196
5f46b63e2c0d
Part of a large patch from o_sukhodolsky to fix some build warnings.
Richard Laager <rlaager@pidgin.im>
parents:
21676
diff
changeset
|
61 | /* TODO: We should probably close the connection here or something. */ |
|
5f46b63e2c0d
Part of a large patch from o_sukhodolsky to fix some build warnings.
Richard Laager <rlaager@pidgin.im>
parents:
21676
diff
changeset
|
62 | } |
| 8351 | 63 | } |
| 64 | ||
| 15884 | 65 | static void irc_dccsend_recv_init(PurpleXfer *xfer) { |
| 8351 | 66 | struct irc_xfer_rx_data *xd = xfer->data; |
| 67 | ||
| 15884 | 68 | purple_xfer_start(xfer, -1, xd->ip, xfer->remote_port); |
| 8351 | 69 | g_free(xd->ip); |
| 70 | xd->ip = NULL; | |
| 71 | } | |
| 72 | ||
| 73 | /* This function makes the necessary arrangements for receiving files */ | |
| 74 | void irc_dccsend_recv(struct irc_conn *irc, const char *from, const char *msg) { | |
| 15884 | 75 | PurpleXfer *xfer; |
| 8351 | 76 | struct irc_xfer_rx_data *xd; |
| 77 | gchar **token; | |
| 78 | struct in_addr addr; | |
| 79 | GString *filename; | |
| 80 | int i = 0; | |
| 81 | guint32 nip; | |
| 82 | ||
| 83 | token = g_strsplit(msg, " ", 0); | |
| 84 | if (!token[0] || !token[1] || !token[2]) { | |
| 85 | g_strfreev(token); | |
| 86 | return; | |
| 87 | } | |
| 88 | ||
| 89 | filename = g_string_new(""); | |
| 90 | if (token[0][0] == '"') { | |
| 91 | if (!strchr(&(token[0][1]), '"')) { | |
| 92 | g_string_append(filename, &(token[0][1])); | |
| 93 | for (i = 1; token[i]; i++) | |
| 94 | if (!strchr(token[i], '"')) { | |
| 95 | g_string_append_printf(filename, " %s", token[i]); | |
| 96 | } else { | |
| 97 | g_string_append_len(filename, token[i], strlen(token[i]) - 1); | |
| 98 | break; | |
| 99 | } | |
| 100 | } else { | |
| 101 | g_string_append_len(filename, &(token[0][1]), strlen(&(token[0][1])) - 1); | |
| 102 | } | |
| 103 | } else { | |
| 104 | g_string_append(filename, token[0]); | |
| 105 | } | |
| 106 | ||
| 107 | if (!token[i] || !token[i+1] || !token[i+2]) { | |
| 108 | g_strfreev(token); | |
| 109 | g_string_free(filename, TRUE); | |
| 110 | return; | |
| 111 | } | |
| 112 | i++; | |
| 113 | ||
| 15884 | 114 | xfer = purple_xfer_new(irc->account, PURPLE_XFER_RECEIVE, from); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
115 | if (xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
116 | { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
117 | xd = g_new0(struct irc_xfer_rx_data, 1); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
118 | xfer->data = xd; |
| 8351 | 119 | |
| 15884 | 120 | purple_xfer_set_filename(xfer, filename->str); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
121 | xfer->remote_port = atoi(token[i+1]); |
| 8351 | 122 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
123 | nip = strtoul(token[i], NULL, 10); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
124 | if (nip) { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
125 | addr.s_addr = htonl(nip); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
126 | xd->ip = g_strdup(inet_ntoa(addr)); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
127 | } else { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
128 | xd->ip = g_strdup(token[i]); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
129 | } |
|
21676
dabfb5216949
Fix #3983 by canceling the file transfer when connecting to the remote host fails.
Daniel Atallah <datallah@pidgin.im>
parents:
21389
diff
changeset
|
130 | purple_debug(PURPLE_DEBUG_INFO, "irc", "Receiving file (%s) from %s\n", |
|
dabfb5216949
Fix #3983 by canceling the file transfer when connecting to the remote host fails.
Daniel Atallah <datallah@pidgin.im>
parents:
21389
diff
changeset
|
131 | filename->str, xd->ip); |
| 15884 | 132 | purple_xfer_set_size(xfer, token[i+2] ? atoi(token[i+2]) : 0); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
27635
diff
changeset
|
133 | |
| 15884 | 134 | purple_xfer_set_init_fnc(xfer, irc_dccsend_recv_init); |
| 135 | purple_xfer_set_ack_fnc(xfer, irc_dccsend_recv_ack); | |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
27635
diff
changeset
|
136 | |
| 15884 | 137 | purple_xfer_set_end_fnc(xfer, irc_dccsend_recv_destroy); |
| 138 | purple_xfer_set_request_denied_fnc(xfer, irc_dccsend_recv_destroy); | |
|
22590
174fe7103cbd
some memleak fixes from Andrew Gaul again:
Andrew Gaul <andrew@gaul.org>
parents:
22257
diff
changeset
|
139 | purple_xfer_set_cancel_recv_fnc(xfer, irc_dccsend_recv_destroy); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
27635
diff
changeset
|
140 | |
| 15884 | 141 | purple_xfer_request(xfer); |
| 8351 | 142 | } |
| 143 | g_strfreev(token); | |
| 144 | g_string_free(filename, TRUE); | |
| 145 | } | |
| 146 | ||
| 147 | /******************************************************************* | |
| 148 | * Functions related to sending files via DCC SEND | |
| 149 | *******************************************************************/ | |
| 150 | ||
| 151 | struct irc_xfer_send_data { | |
| 15884 | 152 | PurpleNetworkListenData *listen_data; |
| 8351 | 153 | gint inpa; |
| 154 | int fd; | |
| 155 | guchar *rxqueue; | |
| 156 | guint rxlen; | |
| 157 | }; | |
| 158 | ||
| 15884 | 159 | static void irc_dccsend_send_destroy(PurpleXfer *xfer) |
| 8351 | 160 | { |
| 161 | struct irc_xfer_send_data *xd = xfer->data; | |
| 162 | ||
| 163 | if (xd == NULL) | |
| 164 | return; | |
| 165 | ||
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
166 | if (xd->listen_data != NULL) |
| 15884 | 167 | purple_network_listen_cancel(xd->listen_data); |
| 8351 | 168 | if (xd->inpa > 0) |
| 15884 | 169 | purple_input_remove(xd->inpa); |
| 8351 | 170 | if (xd->fd != -1) |
| 171 | close(xd->fd); | |
| 172 | ||
|
21676
dabfb5216949
Fix #3983 by canceling the file transfer when connecting to the remote host fails.
Daniel Atallah <datallah@pidgin.im>
parents:
21389
diff
changeset
|
173 | g_free(xd->rxqueue); |
| 8351 | 174 | |
| 175 | g_free(xd); | |
| 176 | } | |
| 177 | ||
| 178 | /* just in case you were wondering, this is why DCC is gay */ | |
| 15884 | 179 | static void irc_dccsend_send_read(gpointer data, int source, PurpleInputCondition cond) |
| 8351 | 180 | { |
| 15884 | 181 | PurpleXfer *xfer = data; |
| 8351 | 182 | struct irc_xfer_send_data *xd = xfer->data; |
|
22591
12cc742a8a5a
When Andrew was working on the memleak fixes, he pondered why buffer was
Ka-Hing Cheung <khc@pidgin.im>
parents:
22590
diff
changeset
|
183 | char buffer[64]; |
| 8351 | 184 | int len; |
| 185 | ||
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
186 | len = read(source, buffer, sizeof(buffer)); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
187 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
188 | if (len < 0 && errno == EAGAIN) |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
189 | return; |
|
13788
019bc2080927
[gaim-migrate @ 16198]
Daniel Atallah <datallah@pidgin.im>
parents:
13201
diff
changeset
|
190 | else if (len <= 0) { |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
191 | /* XXX: Shouldn't this be canceling the transfer? */ |
| 15884 | 192 | purple_input_remove(xd->inpa); |
| 8351 | 193 | xd->inpa = 0; |
| 194 | return; | |
| 195 | } | |
| 196 | ||
| 197 | xd->rxqueue = g_realloc(xd->rxqueue, len + xd->rxlen); | |
| 198 | memcpy(xd->rxqueue + xd->rxlen, buffer, len); | |
| 199 | xd->rxlen += len; | |
| 200 | ||
| 201 | while (1) { | |
|
11318
13fa1d5134f3
[gaim-migrate @ 13521]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11159
diff
changeset
|
202 | size_t acked; |
| 8351 | 203 | |
| 204 | if (xd->rxlen < 4) | |
| 205 | break; | |
| 206 | ||
| 207 | acked = ntohl(*((gint32 *)xd->rxqueue)); | |
| 208 | ||
| 209 | xd->rxlen -= 4; | |
| 210 | if (xd->rxlen) { | |
|
40755
fb2056ce3c58
Implement mitigation for GHSL-2021-045
Gary Kramlich <grim@reaperworld.com>
parents:
36028
diff
changeset
|
211 | unsigned char *tmp = g_memdup2(xd->rxqueue + 4, xd->rxlen); |
| 8351 | 212 | g_free(xd->rxqueue); |
| 213 | xd->rxqueue = tmp; | |
| 214 | } else { | |
| 215 | g_free(xd->rxqueue); | |
| 216 | xd->rxqueue = NULL; | |
| 217 | } | |
| 218 | ||
| 15884 | 219 | if (acked >= purple_xfer_get_size(xfer)) { |
| 220 | purple_input_remove(xd->inpa); | |
| 8351 | 221 | xd->inpa = 0; |
| 15884 | 222 | purple_xfer_set_completed(xfer, TRUE); |
| 223 | purple_xfer_end(xfer); | |
| 8351 | 224 | return; |
| 225 | } | |
| 226 | } | |
| 227 | } | |
| 228 | ||
| 15884 | 229 | static gssize irc_dccsend_send_write(const guchar *buffer, size_t size, PurpleXfer *xfer) |
| 8351 | 230 | { |
|
12151
8002bb57756b
[gaim-migrate @ 14452]
Richard Laager <rlaager@pidgin.im>
parents:
12143
diff
changeset
|
231 | gssize s; |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
232 | int ret; |
| 8351 | 233 | |
| 15884 | 234 | s = MIN(purple_xfer_get_bytes_remaining(xfer), size); |
| 8351 | 235 | if (!s) |
| 236 | return 0; | |
| 237 | ||
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
238 | ret = write(xfer->fd, buffer, s); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
239 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
240 | if (ret < 0 && errno == EAGAIN) |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
241 | ret = 0; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
242 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12909
diff
changeset
|
243 | return ret; |
| 8351 | 244 | } |
| 245 | ||
| 15884 | 246 | static void irc_dccsend_send_connected(gpointer data, int source, PurpleInputCondition cond) { |
| 247 | PurpleXfer *xfer = (PurpleXfer *) data; | |
| 8351 | 248 | struct irc_xfer_send_data *xd = xfer->data; |
|
36028
fc5300cb3617
Get rid of fair amount of copy-pasta and coverity warnings
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35991
diff
changeset
|
249 | int conn; |
| 8351 | 250 | |
| 251 | conn = accept(xd->fd, NULL, 0); | |
| 252 | if (conn == -1) { | |
| 253 | /* Accepting the connection failed. This could just be related | |
| 254 | * to the nonblocking nature of the listening socket, so we'll | |
| 255 | * just try again next time */ | |
| 256 | /* Let's print an error message anyway */ | |
|
21389
e1dd8142bb87
replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents:
19859
diff
changeset
|
257 | purple_debug_warning("irc", "accept: %s\n", g_strerror(errno)); |
| 8351 | 258 | return; |
| 259 | } | |
| 260 | ||
| 15884 | 261 | purple_input_remove(xfer->watcher); |
| 8351 | 262 | xfer->watcher = 0; |
| 263 | close(xd->fd); | |
| 264 | xd->fd = -1; | |
| 265 | ||
|
36028
fc5300cb3617
Get rid of fair amount of copy-pasta and coverity warnings
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35991
diff
changeset
|
266 | _purple_network_set_common_socket_flags(conn); |
|
24042
098a3f96a0b9
Use non-blocking io for IRC DCC transfers.
Daniel Atallah <datallah@pidgin.im>
parents:
22591
diff
changeset
|
267 | |
| 15884 | 268 | xd->inpa = purple_input_add(conn, PURPLE_INPUT_READ, irc_dccsend_send_read, xfer); |
| 8351 | 269 | /* Start the transfer */ |
| 15884 | 270 | purple_xfer_start(xfer, conn, NULL, 0); |
| 8351 | 271 | } |
| 272 | ||
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
273 | static void |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
274 | irc_dccsend_network_listen_cb(int sock, gpointer data) |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
275 | { |
| 15884 | 276 | PurpleXfer *xfer = data; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
277 | struct irc_xfer_send_data *xd; |
| 15884 | 278 | PurpleConnection *gc; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
279 | struct irc_conn *irc; |
| 8351 | 280 | const char *arg[2]; |
| 281 | char *tmp; | |
| 282 | struct in_addr addr; | |
| 283 | unsigned short int port; | |
| 284 | ||
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
285 | xd = xfer->data; |
|
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
286 | xd->listen_data = NULL; |
|
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
287 | |
| 15884 | 288 | if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL |
| 289 | || purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_REMOTE) { | |
| 290 | purple_xfer_unref(xfer); | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
291 | return; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
292 | } |
| 8351 | 293 | |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
294 | xd = xfer->data; |
| 15884 | 295 | gc = purple_account_get_connection(purple_xfer_get_account(xfer)); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
296 | irc = gc->proto_data; |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
297 | |
| 15884 | 298 | purple_xfer_unref(xfer); |
| 8351 | 299 | |
| 300 | if (sock < 0) { | |
| 15884 | 301 | purple_notify_error(gc, NULL, _("File Transfer Failed"), |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27472
diff
changeset
|
302 | _("Unable to open a listening port.")); |
| 15884 | 303 | purple_xfer_cancel_local(xfer); |
| 8351 | 304 | return; |
| 305 | } | |
| 306 | ||
| 307 | xd->fd = sock; | |
| 308 | ||
| 15884 | 309 | port = purple_network_get_port_from_fd(sock); |
| 310 | purple_debug_misc("irc", "port is %hu\n", port); | |
| 8351 | 311 | /* Monitor the listening socket */ |
| 15884 | 312 | xfer->watcher = purple_input_add(sock, PURPLE_INPUT_READ, |
|
24763
67d9d4c975c0
Replace spaces wth tabs in indentation and tabs with spaces in line continuations.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
24042
diff
changeset
|
313 | irc_dccsend_send_connected, xfer); |
| 8351 | 314 | |
| 315 | /* Send the intended recipient the DCC request */ | |
| 316 | arg[0] = xfer->who; | |
| 15884 | 317 | inet_aton(purple_network_get_my_ip(irc->fd), &addr); |
|
11656
56f5e598dc6c
[gaim-migrate @ 13940]
Richard Laager <rlaager@pidgin.im>
parents:
11318
diff
changeset
|
318 | arg[1] = tmp = g_strdup_printf("\001DCC SEND \"%s\" %u %hu %" G_GSIZE_FORMAT "\001", |
|
24763
67d9d4c975c0
Replace spaces wth tabs in indentation and tabs with spaces in line continuations.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
24042
diff
changeset
|
319 | xfer->filename, ntohl(addr.s_addr), |
|
67d9d4c975c0
Replace spaces wth tabs in indentation and tabs with spaces in line continuations.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
24042
diff
changeset
|
320 | port, xfer->size); |
| 8351 | 321 | |
| 10555 | 322 | irc_cmd_privmsg(gc->proto_data, "msg", NULL, arg); |
| 8351 | 323 | g_free(tmp); |
| 324 | } | |
| 325 | ||
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
326 | /* |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
327 | * This function is called after the user has selected a file to send. |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
328 | */ |
| 15884 | 329 | static void irc_dccsend_send_init(PurpleXfer *xfer) { |
| 330 | PurpleConnection *gc = purple_account_get_connection(purple_xfer_get_account(xfer)); | |
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
331 | struct irc_xfer_send_data *xd = xfer->data; |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
332 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
333 | xfer->filename = g_path_get_basename(xfer->local_filename); |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
334 | |
| 15884 | 335 | purple_xfer_ref(xfer); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
336 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
337 | /* Create a listening socket */ |
| 15884 | 338 | xd->listen_data = purple_network_listen_range(0, 0, SOCK_STREAM, |
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
339 | irc_dccsend_network_listen_cb, xfer); |
|
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
340 | if (xd->listen_data == NULL) { |
| 15884 | 341 | purple_xfer_unref(xfer); |
| 342 | purple_notify_error(gc, NULL, _("File Transfer Failed"), | |
|
27635
0cd19038c417
More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents:
27472
diff
changeset
|
343 | _("Unable to open a listening port.")); |
| 15884 | 344 | purple_xfer_cancel_local(xfer); |
|
12909
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
345 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
346 | |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
347 | } |
|
dfcf4df1dcd7
[gaim-migrate @ 15262]
Daniel Atallah <datallah@pidgin.im>
parents:
12730
diff
changeset
|
348 | |
| 15884 | 349 | PurpleXfer *irc_dccsend_new_xfer(PurpleConnection *gc, const char *who) { |
| 350 | PurpleXfer *xfer; | |
| 8351 | 351 | struct irc_xfer_send_data *xd; |
| 352 | ||
| 353 | /* Build the file transfer handle */ | |
| 15884 | 354 | xfer = purple_xfer_new(purple_connection_get_account(gc), PURPLE_XFER_SEND, who); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
355 | if (xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
356 | { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
357 | xd = g_new0(struct irc_xfer_send_data, 1); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
358 | xd->fd = -1; |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
359 | xfer->data = xd; |
| 8351 | 360 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
361 | /* Setup our I/O op functions */ |
| 15884 | 362 | purple_xfer_set_init_fnc(xfer, irc_dccsend_send_init); |
| 363 | purple_xfer_set_write_fnc(xfer, irc_dccsend_send_write); | |
| 364 | purple_xfer_set_end_fnc(xfer, irc_dccsend_send_destroy); | |
| 365 | purple_xfer_set_request_denied_fnc(xfer, irc_dccsend_send_destroy); | |
| 366 | purple_xfer_set_cancel_send_fnc(xfer, irc_dccsend_send_destroy); | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14329
diff
changeset
|
367 | } |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
368 | |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
369 | return xfer; |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
370 | } |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
371 | |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
372 | /** |
| 15884 | 373 | * Purple calls this function when the user selects Send File from the |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
374 | * buddy menu |
| 15884 | 375 | * It sets up the PurpleXfer struct and tells Purple to go ahead |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
376 | */ |
| 15884 | 377 | void irc_dccsend_send_file(PurpleConnection *gc, const char *who, const char *file) { |
| 378 | PurpleXfer *xfer = irc_dccsend_new_xfer(gc, who); | |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
379 | |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11656
diff
changeset
|
380 | /* Perform the request */ |
|
9466
b6425eab60ca
[gaim-migrate @ 10291]
Daniel Atallah <datallah@pidgin.im>
parents:
8838
diff
changeset
|
381 | if (file) |
| 15884 | 382 | purple_xfer_request_accepted(xfer, file); |
|
9466
b6425eab60ca
[gaim-migrate @ 10291]
Daniel Atallah <datallah@pidgin.im>
parents:
8838
diff
changeset
|
383 | else |
| 15884 | 384 | purple_xfer_request(xfer); |
| 8351 | 385 | } |