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