| | 687 | } |
|---|
| | 688 | |
|---|
| | 689 | |
|---|
| | 690 | |
|---|
| | 691 | int hl_cmd_msg(void) { |
|---|
| | 692 | struct hl_client *client = (struct hl_client *) pthread_getspecific(hl_client_key); |
|---|
| | 693 | struct hl_parameters parameters; |
|---|
| | 694 | struct hl_field field; |
|---|
| | 695 | unsigned char msg[8192]; |
|---|
| | 696 | unsigned int uid = 0; |
|---|
| | 697 | int i; |
|---|
| | 698 | |
|---|
| | 699 | /* read parameter count */ |
|---|
| | 700 | if(hl_read_parameters(¶meters) < 0) |
|---|
| | 701 | return -1; |
|---|
| | 702 | |
|---|
| | 703 | /* read parameters */ |
|---|
| | 704 | for(i = 0; i < parameters.count; i++) { |
|---|
| | 705 | if(hl_read_field(&field) < 0) |
|---|
| | 706 | return -1; |
|---|
| | 707 | |
|---|
| | 708 | if(hl_read_buffer(client->buffer, field.size) < 0) |
|---|
| | 709 | return -1; |
|---|
| | 710 | |
|---|
| | 711 | switch(field.id) { |
|---|
| | 712 | case 101: |
|---|
| | 713 | strlcpy(msg, client->buffer, sizeof(msg)); |
|---|
| | 714 | break; |
|---|
| | 715 | |
|---|
| | 716 | case 103: |
|---|
| | 717 | if(field.size == 4) |
|---|
| | 718 | uid = htonl(hl_get_long(client->buffer)); |
|---|
| | 719 | else if(field.size == 2) |
|---|
| | 720 | uid = htons(hl_get_short(client->buffer)); |
|---|
| | 721 | break; |
|---|
| | 722 | } |
|---|
| | 723 | } |
|---|
| | 724 | |
|---|
| | 725 | hl_wd_relay_msg(client, uid, msg); |
|---|
| | 1425 | void hl_wd_relay_msg(struct hl_client *peer, unsigned int uid, char *buffer) { |
|---|
| | 1426 | struct wd_client *wd_client; |
|---|
| | 1427 | struct hl_client *hl_client; |
|---|
| | 1428 | unsigned char data[2]; |
|---|
| | 1429 | unsigned int length, nicklength; |
|---|
| | 1430 | |
|---|
| | 1431 | /* get lengths */ |
|---|
| | 1432 | length = strlen(buffer); |
|---|
| | 1433 | nicklength = strlen(peer->nick); |
|---|
| | 1434 | |
|---|
| | 1435 | /* get clients */ |
|---|
| | 1436 | hl_client = hl_get_client(uid); |
|---|
| | 1437 | wd_client = wd_get_client(uid, 1); |
|---|
| | 1438 | |
|---|
| | 1439 | if(hl_client) { |
|---|
| | 1440 | /* send message header */ |
|---|
| | 1441 | hl_send_transaction(hl_client->sd, 0, 104, 1, 0, 16 + nicklength + length); |
|---|
| | 1442 | hl_send_parameters(hl_client->sd, 3); |
|---|
| | 1443 | |
|---|
| | 1444 | /* send uid */ |
|---|
| | 1445 | hl_send_field(hl_client->sd, 103, 2); |
|---|
| | 1446 | hl_set_short(data, peer->uid); |
|---|
| | 1447 | hl_send_buffer(hl_client->sd, data, sizeof(data)); |
|---|
| | 1448 | |
|---|
| | 1449 | /* send nick */ |
|---|
| | 1450 | hl_send_field(hl_client->sd, 102, nicklength); |
|---|
| | 1451 | hl_send_buffer(hl_client->sd, peer->nick, nicklength); |
|---|
| | 1452 | |
|---|
| | 1453 | /* send buffer */ |
|---|
| | 1454 | hl_send_field(hl_client->sd, 101, length); |
|---|
| | 1455 | hl_send_buffer(hl_client->sd, buffer, length); |
|---|
| | 1456 | } |
|---|
| | 1457 | else if(wd_client) { |
|---|
| | 1458 | /* convert msg */ |
|---|
| | 1459 | hl_convert_buffer(hl_conv_to, buffer, length); |
|---|
| | 1460 | |
|---|
| | 1461 | /* send message */ |
|---|
| | 1462 | pthread_mutex_lock(&(wd_client->ssl_mutex)); |
|---|
| | 1463 | wd_sreply(wd_client->ssl, 305, "%lu%s%s", |
|---|
| | 1464 | peer->uid, |
|---|
| | 1465 | WD_FIELD_SEPARATOR, |
|---|
| | 1466 | buffer); |
|---|
| | 1467 | pthread_mutex_unlock(&(wd_client->ssl_mutex)); |
|---|
| | 1468 | } |
|---|
| | 1469 | } |
|---|
| | 1470 | |
|---|
| | 1471 | |
|---|
| | 1472 | |
|---|
| | 1473 | void wd_hl_relay_msg(unsigned int fromuid, unsigned touid, char *nick, char *msg) { |
|---|
| | 1474 | struct hl_client *hl_client; |
|---|
| | 1475 | unsigned char data[2]; |
|---|
| | 1476 | unsigned int length, nicklength; |
|---|
| | 1477 | |
|---|
| | 1478 | /* convert */ |
|---|
| | 1479 | hl_convert_buffer(hl_conv_from, nick, nicklength); |
|---|
| | 1480 | hl_convert_buffer(hl_conv_from, msg, length); |
|---|
| | 1481 | |
|---|
| | 1482 | /* get lengths */ |
|---|
| | 1483 | length = strlen(msg); |
|---|
| | 1484 | nicklength = strlen(nick); |
|---|
| | 1485 | |
|---|
| | 1486 | /* get client */ |
|---|
| | 1487 | hl_client = hl_get_client(touid); |
|---|
| | 1488 | |
|---|
| | 1489 | if(hl_client) { |
|---|
| | 1490 | /* send message header */ |
|---|
| | 1491 | hl_send_transaction(hl_client->sd, 0, 104, 1, 0, 16 + nicklength + length); |
|---|
| | 1492 | hl_send_parameters(hl_client->sd, 3); |
|---|
| | 1493 | |
|---|
| | 1494 | /* send uid */ |
|---|
| | 1495 | hl_send_field(hl_client->sd, 103, 2); |
|---|
| | 1496 | hl_set_short(data, fromuid); |
|---|
| | 1497 | hl_send_buffer(hl_client->sd, data, sizeof(data)); |
|---|
| | 1498 | |
|---|
| | 1499 | /* send nick */ |
|---|
| | 1500 | hl_send_field(hl_client->sd, 102, nicklength); |
|---|
| | 1501 | hl_send_buffer(hl_client->sd, nick, nicklength); |
|---|
| | 1502 | |
|---|
| | 1503 | /* send buffer */ |
|---|
| | 1504 | hl_send_field(hl_client->sd, 101, length); |
|---|
| | 1505 | hl_send_buffer(hl_client->sd, msg, length); |
|---|
| | 1506 | } |
|---|
| | 1507 | } |
|---|
| | 1508 | |
|---|
| | 1509 | |
|---|
| | 1510 | |
|---|