int yahoo_packet_send(struct yahoo_packet *pkt, YahooData *yd) { size_t len; gssize ret; guchar *data; if (yd->fd < 0) return -1; len = yahoo_packet_build(pkt, 0, yd->wm, yd->jp, &data); yahoo_packet_dump(data, len); if (yd->txhandler == 0) ret = write(yd->fd, data, len); else { ret = -1; errno = EAGAIN; } if (ret < 0 && errno == EAGAIN) ret = 0; else if (ret <= 0) { purple_debug_warning("yahoo", "Only wrote %" G_GSSIZE_FORMAT " of %" G_GSIZE_FORMAT " bytes!\n", ret, len); g_free(data); return ret; } if ((gsize)ret < len) { if (yd->txhandler == 0) yd->txhandler = purple_input_add(yd->fd, PURPLE_INPUT_WRITE, yahoo_packet_send_can_write, yd); purple_circ_buffer_append(yd->txbuf, data + ret, len - ret); } g_free(data); return ret; }
int yahoo_packet_send(struct yahoo_packet *pkt, struct yahoo_data *yd) { size_t len; int ret; guchar *data; if (yd->fd < 0) return -1; len = yahoo_packet_build(pkt, 0, yd->wm, yd->jp, &data); yahoo_packet_dump(data, len); if (yd->txhandler == -1) ret = write(yd->fd, data, len); else { ret = -1; errno = EAGAIN; } if (ret < 0 && errno == EAGAIN) ret = 0; else if (ret <= 0) { gaim_debug_warning("yahoo", "Only wrote %d of %d bytes!", ret, len); g_free(data); return ret; } if (ret < len) { if (yd->txhandler == -1) yd->txhandler = gaim_input_add(yd->fd, GAIM_INPUT_WRITE, yahoo_packet_send_can_write, yd); gaim_circ_buffer_append(yd->txbuf, data + ret, len - ret); } g_free(data); return ret; }