示例#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
static int        open_socket_and_connect(netbios_session *s)
{
    if ((s->socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        goto error;
    if (connect(s->socket, (struct sockaddr *)&s->remote_addr, sizeof(s->remote_addr)) <0)
        goto error;

    return 1;

error:
    BDSM_perror("netbios_session_new, open_socket: ");
    return 0;
}
示例#3
0
static int open_socket_and_connect(netbios_session *s)
{
    if ((s->socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        goto error;
    
    //int sock_opt = 1;
    //setsockopt(s->socket, SOL_SOCKET, SO_NOSIGPIPE, (void *)&sock_opt, sizeof(sock_opt));
    
    if (connect(s->socket, (struct sockaddr *)&s->remote_addr, sizeof(s->remote_addr)) <0)
        goto error;

    return DSM_SUCCESS;

error:
    BDSM_perror("netbios_session_new, open_socket: ");
    return DSM_ERROR_NETWORK;
}
示例#4
0
int               netbios_session_packet_send(netbios_session *s)
{
    ssize_t         to_send;
    ssize_t         sent;

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

    s->packet->length = htons(s->packet_cursor);
    to_send           = sizeof(netbios_session_packet) + s->packet_cursor;
    sent              = send(s->socket, (void *)s->packet, to_send, 0);

    if (sent != to_send)
    {
        BDSM_perror("netbios_session_packet_send: Unable to send (full?) packet");
        return 0;
    }

    return sent;
}