datagram
smb_browser_process_AnnouncementRequest(struct datagram *datagram,
(datagram->src.addr_list.sin.sin_addr.s_addr &
B_FALSE, &datagram->src.addr_list, NBT_MB);
struct datagram *datagram = (struct datagram *)arg;
smb_msgbuf_init(&mb, datagram->data, datagram->data_length, 0);
free(datagram);
data = &datagram->data[data_offset];
datalen = datagram->data_length - data_offset;
smb_netlogon_receive(datagram, mailbox, data, datalen);
free(datagram);
message_type = datagram->data[data_offset];
smb_browser_process_AnnouncementRequest(datagram, mailbox);
free(datagram);
struct datagram *forw;
struct datagram *back;
struct datagram *forw;
struct datagram *back;
void smb_netlogon_receive(struct datagram *, char *, unsigned char *, int);
struct datagram *entry;
struct datagram *next;
entry != (struct datagram *)((uintptr_t)&smb_datagram_queue);
struct datagram *entry;
(struct datagram *)((uintptr_t)&smb_datagram_queue)) {
smb_datagram_decode(struct datagram *datagram, int bytes)
if (datagram->rawbuf[0] == DATAGRAM_TYPE_ERROR_DATAGRAM)
smb_netbios_datagram_error(datagram->rawbuf);
ha_src = &datagram->rawbuf[DATAGRAM_HEADER_LENGTH];
bzero(&datagram->src, sizeof (struct name_entry));
bzero(&datagram->dest, sizeof (struct name_entry));
datagram->rawbytes = bytes;
datagram->packet_type = datagram->rawbuf[0];
datagram->flags = datagram->rawbuf[1];
datagram->datagram_id = BE_IN16(&datagram->rawbuf[2]);
datagram->src.addr_list.sinlen = sizeof (struct sockaddr_in);
(void) memcpy(&datagram->src.addr_list.sin.sin_addr.s_addr,
&datagram->rawbuf[4], sizeof (uint32_t));
(void) memcpy(&datagram->src.addr_list.sin.sin_port,
&datagram->rawbuf[8], sizeof (uint16_t));
datagram->src.addr_list.forw = datagram->src.addr_list.back =
&datagram->src.addr_list;
datagram->data = data;
datagram->data_length = BE_IN16(&datagram->rawbuf[10]);
datagram->offset = BE_IN16(&datagram->rawbuf[12]);
if (smb_first_level_name_decode(ha_src, &datagram->src) < 0) {
inet_ntoa(datagram->src.addr_list.sin.sin_addr));
datagram->dest.addr_list.forw = datagram->dest.addr_list.back =
&datagram->dest.addr_list;
if (smb_first_level_name_decode(ha_dest, &datagram->dest) < 0) {
inet_ntoa(datagram->src.addr_list.sin.sin_addr));
static struct datagram *
smb_netbios_datagram_getq(struct datagram *datagram)
struct datagram *prev = 0;
prev != (struct datagram *)((uintptr_t)&smb_datagram_queue);
datagram->src.addr_list.sin.sin_addr.s_addr) {
bcopy(datagram->data, &prev->data[prev->data_length],
datagram->data_length);
prev->data_length += datagram->data_length;
free(datagram);
smb_netbios_BPM_datagram(struct datagram *datagram)
struct datagram *qpacket = 0;
switch (datagram->packet_type) {
if ((datagram->flags & DATAGRAM_FLAGS_FIRST) != 0) {
if (datagram->flags & DATAGRAM_FLAGS_MORE) {
datagram->discard_timer = FRAGMENT_TIMEOUT;
QUEUE_INSERT_TAIL(&smb_datagram_queue, datagram)
qpacket = smb_netbios_datagram_getq(datagram);
datagram = qpacket;
if ((strcmp((char *)datagram->dest.name, "*") == 0) ||
smb_netbios_cache_lookup(&datagram->dest)) != 0)) {
(void *)datagram);
datagram->rawbuf[0] = DATAGRAM_TYPE_ERROR_DATAGRAM;
datagram->rawbuf[1] &= DATAGRAM_FLAGS_SRC_TYPE;
(void) memcpy(&datagram->rawbuf[4],
&datagram->src.addr_list.sin.sin_addr.s_addr,
BE_OUT16(&datagram->rawbuf[8], IPPORT_NETBIOS_DGM);
(void) sendto(datagram_sock, datagram->rawbuf,
datagram->rawbytes, 0,
(struct sockaddr *)&datagram->src.addr_list.sin,
datagram->src.addr_list.sinlen);
free(datagram);
struct datagram *datagram;
(struct datagram *)((uintptr_t)&smb_datagram_queue);
if ((datagram = malloc(sizeof (struct datagram))) == NULL) {
ignore: bzero(&datagram->inaddr, sizeof (addr_entry_t));
datagram->inaddr.sinlen = sizeof (datagram->inaddr.sin);
datagram->inaddr.forw = datagram->inaddr.back =
&datagram->inaddr;
if ((bytes = recvfrom(datagram_sock, datagram->rawbuf,
(struct sockaddr *)&datagram->inaddr.sin,
&datagram->inaddr.sinlen)) < 0) {
ipaddr.a_ipv4 = datagram->inaddr.sin.sin_addr.s_addr;
if (smb_datagram_decode(datagram, bytes) < 0)
smb_netbios_BPM_datagram(datagram);
smb_netlogon_receive(struct datagram *datagram,
src_ipaddr = datagram->src.addr_list.sin.sin_addr.s_addr;
(void) oemtoucs(unicode_src_name, (char *)datagram->src.name,
struct inetgram datagram;
bzero(&datagram, sizeof (struct inetgram));
datagram.igm_oflags |= MSG_DONTROUTE;
if (((datagram.igm_oflags & MSG_DONTROUTE) == 0) &&
datagram.igm_mp = pkt;
datagram.igm_level = MEDIA_LVL;
datagram.igm_router.s_addr = rip->s_addr;
datagram.igm_router.s_addr = 0;
return (mac_state.mac_output(sock_id, &datagram));