Пример #1
0
static ssize_t    netbios_session_get_next_packet(netbios_session *s)
{
    ssize_t         res;
    size_t          total, sofar;

    assert(s != NULL && s->packet != NULL && s->socket >= 0 && s->state > 0);

    if(s != NULL && s->packet != NULL && s->socket >= 0 && s->state > 0){
        
        // Only get packet header and analyze it to get only needed number of bytes
        // needed for the packet. This will prevent losing a part of next packet
        total = sizeof(netbios_session_packet);
        sofar = 0;
        while (sofar < total)
        {
            res = recv(s->socket, (uint8_t *)(s->packet) + sofar, total - sofar, 0);
            if (res <= 0)
            {
                BDSM_perror("netbios_session_packet_recv: ");
                return -1;
            }
            sofar += res;
        }

        total  = ntohs(s->packet->length);
        total |= (s->packet->flags & 0x01) << 16;
        sofar  = 0;

        if (total + sizeof(netbios_session_packet) > s->packet_payload_size
         && !session_buffer_realloc(s, total + sizeof(netbios_session_packet)))
            return -1;

        //BDSM_dbg("Total = %ld, sofar = %ld\n", total, sofar);

        while (sofar < total)
        {
            res = recv(s->socket, (uint8_t *)(s->packet) + sizeof(netbios_session_packet)
                       + sofar, total - sofar, 0);
            //BDSM_dbg("Total = %ld, sofar = %ld, res = %ld\n", total, sofar, res);

            if (res <= 0)
            {
                BDSM_perror("netbios_session_packet_recv: ");
                return -1;
            }
            sofar += res;
        }

        if (sofar > total)
        {
            BDSM_dbg("netbios_session_packet_recv: Packet size mismatch (%ld/%ld)\n",
                     sofar, total);
            return -1;
        }

        return sofar;
        
    }
    return -1;
}
Пример #2
0
int               netbios_session_packet_append(netbios_session *s,
        const char *data, size_t size)
{
    char  *start;

    assert(s && s->packet);

    if (s->packet_payload_size - s->packet_cursor < size)
        if (!session_buffer_realloc(s, size + s->packet_cursor))
            return 0;

    start = ((char *)&s->packet->payload) + s->packet_cursor;
    memcpy(start, data, size);
    s->packet_cursor += size;

    return 1;
}