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; }
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; }
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; }
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; }