964
979
if (!strncasecmp(msg, "TYPING", strlen("TYPING")))
965
YAHOO_CALLBACK(ext_yahoo_typing_notify)(yd->client_id, from, stat);
980
YAHOO_CALLBACK(ext_yahoo_typing_notify)(yd->client_id, to, from, stat);
966
981
else if (!strncasecmp(msg, "GAME", strlen("GAME")))
967
YAHOO_CALLBACK(ext_yahoo_game_notify)(yd->client_id, from, stat);
982
YAHOO_CALLBACK(ext_yahoo_game_notify)(yd->client_id, to, from, stat);
968
983
else if (!strncasecmp(msg, "WEBCAMINVITE", strlen("WEBCAMINVITE")))
970
985
if (!strcmp(ind, " ")) {
971
YAHOO_CALLBACK(ext_yahoo_webcam_invite)(yd->client_id, from);
986
YAHOO_CALLBACK(ext_yahoo_webcam_invite)(yd->client_id, to, from);
973
988
accept = atoi(ind);
974
989
/* accept the invitation (-1 = deny 1 = accept) */
977
YAHOO_CALLBACK(ext_yahoo_webcam_invite_reply)(yd->client_id, from, accept);
992
YAHOO_CALLBACK(ext_yahoo_webcam_invite_reply)(yd->client_id, to, from, accept);
1107
1122
if(pkt->status == 2)
1109
1124
else if(members)
1110
YAHOO_CALLBACK(ext_yahoo_got_conf_invite)(yd->client_id, host, room, msg, members);
1125
YAHOO_CALLBACK(ext_yahoo_got_conf_invite)(yd->client_id, id, host, room, msg, members);
1112
YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, msg, 0);
1127
YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, msg, 0, E_CONFNOTAVAIL);
1114
1129
case YAHOO_SERVICE_CONFADDINVITE:
1115
1130
if(pkt->status == 2)
1118
YAHOO_CALLBACK(ext_yahoo_got_conf_invite)(yd->client_id, host, room, msg, members);
1133
YAHOO_CALLBACK(ext_yahoo_got_conf_invite)(yd->client_id, id, host, room, msg, members);
1120
1135
case YAHOO_SERVICE_CONFDECLINE:
1122
YAHOO_CALLBACK(ext_yahoo_conf_userdecline)(yd->client_id, who, room, msg);
1137
YAHOO_CALLBACK(ext_yahoo_conf_userdecline)(yd->client_id, id, who, room, msg);
1124
1139
case YAHOO_SERVICE_CONFLOGON:
1126
YAHOO_CALLBACK(ext_yahoo_conf_userjoin)(yd->client_id, who, room);
1141
YAHOO_CALLBACK(ext_yahoo_conf_userjoin)(yd->client_id, id, who, room);
1128
1143
case YAHOO_SERVICE_CONFLOGOFF:
1130
YAHOO_CALLBACK(ext_yahoo_conf_userleave)(yd->client_id, who, room);
1145
YAHOO_CALLBACK(ext_yahoo_conf_userleave)(yd->client_id, id, who, room);
1132
1147
case YAHOO_SERVICE_CONFMSG:
1134
YAHOO_CALLBACK(ext_yahoo_conf_message)(yd->client_id, who, room, msg, utf8);
1149
YAHOO_CALLBACK(ext_yahoo_conf_message)(yd->client_id, id, who, room, msg, utf8);
1265
1286
case YAHOO_SERVICE_CHATEXIT:
1267
YAHOO_CALLBACK(ext_yahoo_chat_userleave)(yid->yd->client_id, room, who);
1288
YAHOO_CALLBACK(ext_yahoo_chat_userleave)(yid->yd->client_id, id, room, who);
1270
1291
case YAHOO_SERVICE_COMMENT:
1272
YAHOO_CALLBACK(ext_yahoo_chat_message)(yid->yd->client_id, who, room, msg, msgtype, utf8);
1293
YAHOO_CALLBACK(ext_yahoo_chat_message)(yid->yd->client_id, id, who, room, msg, msgtype, utf8);
1328
1349
if (pkt->service == YAHOO_SERVICE_SYSMESSAGE) {
1329
1350
YAHOO_CALLBACK(ext_yahoo_system_message)(yd->client_id, message->msg);
1330
1351
} else if (pkt->status <= 2 || pkt->status == 5) {
1331
YAHOO_CALLBACK(ext_yahoo_got_im)(yd->client_id, message->from, message->msg, message->tm, pkt->status, message->utf8);
1352
YAHOO_CALLBACK(ext_yahoo_got_im)(yd->client_id, message->to, message->from, message->msg, message->tm, pkt->status, message->utf8);
1332
1353
} else if (pkt->status == 0xffffffff) {
1333
YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, message->msg, 0);
1354
YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, message->msg, 0, E_SYSTEM);
1345
1366
struct yahoo_data *yd = yid->yd;
1370
char *name; /* 7 name */
1371
int state; /* 10 state */
1372
int flags; /* 13 flags, bit 0 = pager, bit 1 = chat, bit 2 = game */
1373
int mobile; /* 60 mobile */
1374
char *msg; /* 19 custom status message */
1375
int away; /* 47 away (or invisible)*/
1376
int buddy_session; /* 11 state */
1377
int f17; /* 17 in chat? then what about flags? */
1378
int idle; /* 137 seconds idle */
1379
int f138; /* 138 state */
1380
char *f184; /* 184 state */
1381
int f192; /* 192 state */
1382
int f10001; /* 10001 state */
1383
int f10002; /* 10002 state */
1384
int f198; /* 198 state */
1385
char *f197; /* 197 state */
1386
char *f205; /* 205 state */
1387
int f213; /* 213 state */
1352
if(pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) {
1392
if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) {
1353
1393
YAHOO_CALLBACK(ext_yahoo_login_response)(yd->client_id, YAHOO_LOGIN_DUPL, NULL);
1373
1413
NOTICE(("key %d:%s", pair->key, pair->value));
1375
1415
case 7: /* the current buddy */
1416
u = y_new0(struct user, 1);
1417
u->name = pair->value;
1418
users = y_list_prepend(users, u);
1378
1420
case 10: /* state */
1379
state = strtol(pair->value, NULL, 10);
1421
((struct user*)users->data)->state = strtol(pair->value, NULL, 10);
1381
1423
case 19: /* custom status message */
1424
((struct user*)users->data)->msg = pair->value;
1384
1426
case 47: /* is it an away message or not */
1385
away = atoi(pair->value);
1427
((struct user*)users->data)->away = atoi(pair->value);
1387
1429
case 137: /* seconds idle */
1388
idle = atoi(pair->value);
1430
((struct user*)users->data)->idle = atoi(pair->value);
1390
case 11: /* what is this? */
1391
NOTICE(("key %d:%s", pair->key, pair->value));
1432
case 11: /* this is the buddy's session id */
1433
((struct user*)users->data)->buddy_session = atoi(pair->value);
1393
1435
case 17: /* in chat? */
1395
case 13: /* in pager? */
1396
if (pkt->service == YAHOO_SERVICE_LOGOFF || strtol(pair->value, NULL, 10) == 0) {
1397
YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, YAHOO_STATUS_OFFLINE, NULL, 1);
1400
if (state == YAHOO_STATUS_AVAILABLE) {
1401
YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, state, NULL, 0);
1402
} else if (state == YAHOO_STATUS_CUSTOM) {
1403
YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, state, msg, away);
1405
YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, state, NULL, idle);
1436
((struct user*)users->data)->f17 = atoi(pair->value);
1438
case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */
1439
((struct user*)users->data)->flags = atoi(pair->value);
1441
case 60: /* SMS -> 1 MOBILE USER */
1410
1442
/* sometimes going offline makes this 2, but invisible never sends it */
1411
NOTICE(("key %d:%s", pair->key, pair->value));
1443
((struct user*)users->data)->mobile = atoi(pair->value);
1446
((struct user*)users->data)->f138 = atoi(pair->value);
1449
((struct user*)users->data)->f184 = pair->value;
1452
((struct user*)users->data)->f192 = atoi(pair->value);
1455
((struct user*)users->data)->f10001 = atoi(pair->value);
1458
((struct user*)users->data)->f10002 = atoi(pair->value);
1461
((struct user*)users->data)->f198 = atoi(pair->value);
1464
((struct user*)users->data)->f197 = pair->value;
1467
((struct user*)users->data)->f205 = pair->value;
1470
((struct user*)users->data)->f213 = atoi(pair->value);
1413
1472
case 16: /* Custom error message */
1414
YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, pair->value, 0);
1473
YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, pair->value, 0, E_CUSTOM);
1417
1476
WARNING(("unknown status key %d:%s", pair->key, pair->value));
1483
struct user *u = users->data;
1485
if (u->name != NULL) {
1486
if (pkt->service == YAHOO_SERVICE_LOGOFF || u->flags == 0) {
1487
YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0);
1489
YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, u->name, u->state, u->msg, u->away, u->idle, u->mobile);
1493
users = y_list_remove_link(users, users);
1423
1499
static void yahoo_process_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
1602
static void yahoo_process_picture_checksum( struct yahoo_input_data *yid, struct yahoo_packet *pkt)
1604
struct yahoo_data *yd = yid->yd;
1610
for(l = pkt->hash; l; l = l->next)
1612
struct yahoo_pair *pair = l->data;
1625
checksum = atoi( pair->value );
1630
YAHOO_CALLBACK(ext_yahoo_got_buddyicon_checksum)(yd->client_id,to,from,checksum);
1633
static void yahoo_process_picture(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
1635
struct yahoo_data *yd = yid->yd;
1643
for(l = pkt->hash; l; l = l->next)
1645
struct yahoo_pair *pair = l->data;
1650
case 4: /* sender */
1656
case 13: /* request / sending */
1657
status = atoi( pair->value );
1662
case 192: /*checksum */
1663
checksum = atoi( pair->value );
1670
case 1: /* this is a request, ignore for now */
1671
YAHOO_CALLBACK(ext_yahoo_got_buddyicon_request)(yd->client_id, to, from);
1673
case 2: /* this is cool - we get a picture :) */
1674
YAHOO_CALLBACK(ext_yahoo_got_buddyicon)(yd->client_id,to, from, url, checksum);
1679
static void yahoo_process_picture_upload(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
1681
struct yahoo_data *yd = yid->yd;
1685
if ( pkt->status != 1 )
1686
return; /* something went wrong */
1688
for(l = pkt->hash; l; l = l->next)
1690
struct yahoo_pair *pair = l->data;
1699
case 27: /* local filename */
1706
YAHOO_CALLBACK(ext_yahoo_buddyicon_uploaded)(yd->client_id, url);
1526
1709
static void yahoo_process_auth_pre_0x0b(struct yahoo_input_data *yid,
1527
1710
const char *seed, const char *sn)
1886
2070
memset(&(pass_hash_xor2[cnt]), 0x5c, 64-cnt);
1891
2075
/* The first context gets the password hash XORed
1892
2076
* with 0x36 plus a magic value
1893
2077
* which we previously extrapolated from our
1894
2078
* challenge. */
1896
shaUpdate(&ctx1, pass_hash_xor1, 64);
2080
SHA1Update(&ctx1, pass_hash_xor1, 64);
1898
ctx1.sizeLo = 0x1ff;
1899
shaUpdate(&ctx1, magic_key_char, 4);
1900
shaFinal(&ctx1, digest1);
2082
ctx1.totalLength = 0x1ff;
2083
SHA1Update(&ctx1, magic_key_char, 4);
2084
SHA1Final(&ctx1, digest1);
1902
2086
/* The second context gets the password hash XORed
1903
2087
* with 0x5c plus the SHA-1 digest
1904
2088
* of the first context. */
1906
shaUpdate(&ctx2, pass_hash_xor2, 64);
1907
shaUpdate(&ctx2, digest1, 20);
1908
shaFinal(&ctx2, digest2);
2090
SHA1Update(&ctx2, pass_hash_xor2, 64);
2091
SHA1Update(&ctx2, digest1, 20);
2092
SHA1Final(&ctx2, digest2);
1910
2094
/* Now that we have digest2, use it to fetch
1911
2095
* characters from an alphabet to construct
1977
2161
memset(&(crypt_hash_xor2[cnt]), 0x5c, 64-cnt);
1982
2166
/* The first context gets the password hash XORed
1983
2167
* with 0x36 plus a magic value
1984
2168
* which we previously extrapolated from our
1985
2169
* challenge. */
1987
shaUpdate(&ctx1, crypt_hash_xor1, 64);
2171
SHA1Update(&ctx1, crypt_hash_xor1, 64);
1989
ctx1.sizeLo = 0x1ff;
1990
shaUpdate(&ctx1, magic_key_char, 4);
1991
shaFinal(&ctx1, digest1);
2173
ctx1.totalLength = 0x1ff;
2174
SHA1Update(&ctx1, magic_key_char, 4);
2175
SHA1Final(&ctx1, digest1);
1993
2177
/* The second context gets the password hash XORed
1994
2178
* with 0x5c plus the SHA-1 digest
1995
2179
* of the first context. */
1997
shaUpdate(&ctx2, crypt_hash_xor2, 64);
1998
shaUpdate(&ctx2, digest1, 20);
1999
shaFinal(&ctx2, digest2);
2181
SHA1Update(&ctx2, crypt_hash_xor2, 64);
2182
SHA1Update(&ctx2, digest1, 20);
2183
SHA1Final(&ctx2, digest2);
2001
2185
/* Now that we have digest2, use it to fetch
2002
2186
* characters from an alphabet to construct
2185
2371
online = strtol(pair->value, NULL, 10);
2186
2372
else if (pair->key == 47)
2187
2373
away = strtol(pair->value, NULL, 10);
2374
else if (pair->key == 137)
2375
idle = strtol(pair->value, NULL, 10);
2376
else if (pair->key == 60)
2377
mobile = strtol(pair->value, NULL, 10);
2191
2382
YAHOO_CALLBACK(ext_yahoo_contact_added)(yd->client_id, id, who, msg);
2193
YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, state, msg, away);
2384
YAHOO_CALLBACK(ext_yahoo_status_changed)(yd->client_id, name, state, msg, away, idle, mobile);
2194
2385
else if(pkt->status == 0x07)
2195
2386
YAHOO_CALLBACK(ext_yahoo_rejected)(yd->client_id, who, msg);
3581
3802
service = YAHOO_SERVICE_ISBACK;
3583
3804
service = YAHOO_SERVICE_ISAWAY;
3584
pkt = yahoo_packet_new(service, yd->current_status, yd->session_id);
3585
snprintf(s, sizeof(s), "%d", yd->current_status);
3586
yahoo_packet_hash(pkt, 10, s);
3587
if (yd->current_status == YAHOO_STATUS_CUSTOM) {
3588
yahoo_packet_hash(pkt, 19, msg);
3589
yahoo_packet_hash(pkt, 47, away?"1":"0");
3806
if ((away == 2) && (yd->current_status == YAHOO_STATUS_AVAILABLE)) {
3807
pkt = yahoo_packet_new(YAHOO_SERVICE_ISAWAY, YAHOO_STATUS_BRB, yd->session_id);
3808
yahoo_packet_hash(pkt, 10, "999");
3809
yahoo_packet_hash(pkt, 47, "2");
3811
pkt = yahoo_packet_new(service, YAHOO_STATUS_AVAILABLE, yd->session_id);
3812
snprintf(s, sizeof(s), "%d", yd->current_status);
3813
yahoo_packet_hash(pkt, 10, s);
3814
if (yd->current_status == YAHOO_STATUS_CUSTOM) {
3815
yahoo_packet_hash(pkt, 19, msg);
3816
yahoo_packet_hash(pkt, 47, (away == 2)? "2": (away) ?"1":"0");
3818
yahoo_packet_hash(pkt, 47, (away == 2)? "2": (away) ?"1":"0");
3592
3825
yahoo_send_packet(yid, pkt, 0);
3912
4144
yahoo_packet_free(pkt);
4147
void yahoo_stealth_buddy(int id, const char *who, int unstealth)
4149
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
4150
struct yahoo_data *yd;
4151
struct yahoo_packet *pkt;
4160
pkt = yahoo_packet_new(YAHOO_SERVICE_STEALTH, YAHOO_STATUS_AVAILABLE, yd->session_id);
4161
yahoo_packet_hash(pkt, 1, yd->user);
4162
yahoo_packet_hash(pkt, 7, who);
4163
yahoo_packet_hash(pkt, 31, unstealth?"2":"1");
4164
yahoo_packet_hash(pkt, 13, "2");
4165
yahoo_send_packet(yid, pkt, 0);
4166
yahoo_packet_free(pkt);
3915
4169
void yahoo_change_buddy_group(int id, const char *who, const char *old_group, const char *new_group)
3917
4171
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
4220
4474
yahoo_packet_free(pkt);
4477
void yahoo_buddyicon_request(int id, const char *who)
4479
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
4480
struct yahoo_data *yd;
4481
struct yahoo_packet *pkt;
4488
pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YAHOO_STATUS_AVAILABLE, 0);
4489
yahoo_packet_hash(pkt, 4, yd->user);
4490
yahoo_packet_hash(pkt, 5, who);
4491
yahoo_packet_hash(pkt, 13, "1");
4492
yahoo_send_packet(yid, pkt, 0);
4494
yahoo_packet_free(pkt);
4497
void yahoo_send_picture_info(int id, const char *who, const char *url, int checksum)
4499
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
4500
struct yahoo_data *yd;
4501
struct yahoo_packet *pkt;
4502
char checksum_str[10];
4509
snprintf(checksum_str, sizeof(checksum_str), "%d", checksum);
4511
pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YAHOO_STATUS_AVAILABLE, 0);
4512
yahoo_packet_hash(pkt, 1, yd->user);
4513
yahoo_packet_hash(pkt, 4, yd->user);
4514
yahoo_packet_hash(pkt, 5, who);
4515
yahoo_packet_hash(pkt, 13, "2");
4516
yahoo_packet_hash(pkt, 20, url);
4517
yahoo_packet_hash(pkt, 192, checksum_str);
4518
yahoo_send_packet(yid, pkt, 0);
4520
yahoo_packet_free(pkt);
4523
void yahoo_send_picture_update(int id, const char *who, int type)
4525
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
4526
struct yahoo_data *yd;
4527
struct yahoo_packet *pkt;
4535
snprintf(type_str, sizeof(type_str), "%d", type);
4537
pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_UPDATE, YAHOO_STATUS_AVAILABLE, 0);
4538
yahoo_packet_hash(pkt, 1, yd->user);
4539
yahoo_packet_hash(pkt, 5, who);
4540
yahoo_packet_hash(pkt, 206, type_str);
4541
yahoo_send_packet(yid, pkt, 0);
4543
yahoo_packet_free(pkt);
4546
void yahoo_send_picture_checksum(int id, const char *who, int checksum)
4548
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
4549
struct yahoo_data *yd;
4550
struct yahoo_packet *pkt;
4551
char checksum_str[10];
4558
snprintf(checksum_str, sizeof(checksum_str), "%d", checksum);
4560
pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_CHECKSUM, YAHOO_STATUS_AVAILABLE, 0);
4561
yahoo_packet_hash(pkt, 1, yd->user);
4563
yahoo_packet_hash(pkt, 5, who);
4564
yahoo_packet_hash(pkt, 192, checksum_str);
4565
yahoo_packet_hash(pkt, 212, "1");
4566
yahoo_send_packet(yid, pkt, 0);
4568
yahoo_packet_free(pkt);
4223
4571
void yahoo_webcam_close_feed(int id, const char *who)
4225
4573
struct yahoo_input_data *yid = find_input_by_id_and_webcam_user(id, who);
4423
4771
void *user_data;
4774
static void _yahoo_send_picture_connected(int id, int fd, int error, void *data)
4776
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_FT);
4777
struct send_file_data *sfd = data;
4778
struct yahoo_packet *pkt = sfd->pkt;
4779
unsigned char buff[1024];
4782
sfd->callback(id, fd, error, sfd->user_data);
4784
yahoo_packet_free(pkt);
4785
inputs = y_list_remove(inputs, yid);
4791
yahoo_send_packet(yid, pkt, 8);
4792
yahoo_packet_free(pkt);
4794
snprintf((char *)buff, sizeof(buff), "29");
4798
write(yid->fd, buff, 4);
4800
/* YAHOO_CALLBACK(ext_yahoo_add_handler)(nyd->fd, YAHOO_INPUT_READ); */
4802
sfd->callback(id, fd, error, sfd->user_data);
4804
inputs = y_list_remove(inputs, yid);
4806
while(yahoo_tcp_readline(buff, sizeof(buff), nyd->fd) > 0) {
4807
if(!strcmp(buff, ""))
4812
yahoo_input_close(yid);
4815
void yahoo_send_picture(int id, const char *name, unsigned long size,
4816
yahoo_get_fd_callback callback, void *data)
4818
struct yahoo_data *yd = find_conn_by_id(id);
4819
struct yahoo_input_data *yid;
4820
struct yahoo_server_settings *yss;
4821
struct yahoo_packet *pkt = NULL;
4823
char expire_str[10];
4824
long content_length=0;
4825
unsigned char buff[1024];
4827
struct send_file_data *sfd;
4832
yss = yd->server_settings;
4834
yid = y_new0(struct yahoo_input_data, 1);
4836
yid->type = YAHOO_CONNECTION_FT;
4838
pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_UPLOAD, YAHOO_STATUS_AVAILABLE, yd->session_id);
4840
snprintf(size_str, sizeof(size_str), "%ld", size);
4841
snprintf(expire_str, sizeof(expire_str), "%ld", (long)604800);
4843
yahoo_packet_hash(pkt, 0, yd->user);
4844
yahoo_packet_hash(pkt, 1, yd->user);
4845
yahoo_packet_hash(pkt, 14, "");
4846
yahoo_packet_hash(pkt, 27, name);
4847
yahoo_packet_hash(pkt, 28, size_str);
4848
yahoo_packet_hash(pkt, 38, expire_str);
4851
content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt);
4853
snprintf(url, sizeof(url), "http://%s:%d/notifyft",
4854
yss->filetransfer_host, yss->filetransfer_port);
4855
snprintf((char *)buff, sizeof(buff), "Y=%s; T=%s",
4856
yd->cookie_y, yd->cookie_t);
4857
inputs = y_list_prepend(inputs, yid);
4859
sfd = y_new0(struct send_file_data, 1);
4861
sfd->callback = callback;
4862
sfd->user_data = data;
4863
yahoo_http_post(yid->yd->client_id, url, (char *)buff, content_length+4+size,
4864
_yahoo_send_picture_connected, sfd);
4426
4867
static void _yahoo_send_file_connected(int id, int fd, int error, void *data)
4428
4869
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_FT);