mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
0e8fd33987
(This used to be commit 291551d807
)
185 lines
4.4 KiB
C
185 lines
4.4 KiB
C
/*
|
|
Unix SMB/Netbios implementation.
|
|
Version 1.9.
|
|
NBT netbios header - version 2
|
|
Copyright (C) Andrew Tridgell 1994-1995
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
#define MAX_DGRAM_SIZE 576
|
|
#define MIN_DGRAM_SIZE 12
|
|
|
|
#define NMB_PORT 137
|
|
#define DGRAM_PORT 138
|
|
#define SMB_PORT 139
|
|
|
|
enum name_source {LMHOSTS, REGISTER, SELF, DNS, DNSFAIL};
|
|
enum node_type {B_NODE=0, P_NODE=1, M_NODE=2, NBDD_NODE=3};
|
|
enum packet_type {NMB_PACKET, DGRAM_PACKET};
|
|
|
|
/* a netbios name structure */
|
|
struct nmb_name {
|
|
char name[17];
|
|
char scope[64];
|
|
int name_type;
|
|
};
|
|
|
|
/* this is the structure used for the local netbios name list */
|
|
struct name_record
|
|
{
|
|
struct name_record *next;
|
|
struct name_record *prev;
|
|
struct nmb_name name;
|
|
time_t death_time;
|
|
struct in_addr ip;
|
|
BOOL unique;
|
|
enum name_source source;
|
|
};
|
|
|
|
/* this is used by the list of domains */
|
|
struct domain_record
|
|
{
|
|
struct domain_record *next;
|
|
struct domain_record *prev;
|
|
fstring name;
|
|
time_t lastannounce_time;
|
|
int announce_interval;
|
|
struct in_addr bcast_ip;
|
|
};
|
|
|
|
/* this is used to hold the list of servers in my domain */
|
|
struct server_record
|
|
{
|
|
struct server_record *next;
|
|
struct server_record *prev;
|
|
fstring name;
|
|
fstring comment;
|
|
uint32 servertype;
|
|
time_t death_time;
|
|
};
|
|
|
|
/* a resource record */
|
|
struct res_rec {
|
|
struct nmb_name rr_name;
|
|
int rr_type;
|
|
int rr_class;
|
|
int ttl;
|
|
int rdlength;
|
|
char rdata[MAX_DGRAM_SIZE];
|
|
};
|
|
|
|
/* define a nmb packet. */
|
|
struct nmb_packet
|
|
{
|
|
struct {
|
|
int name_trn_id;
|
|
int opcode;
|
|
BOOL response;
|
|
struct {
|
|
BOOL bcast;
|
|
BOOL recursion_available;
|
|
BOOL recursion_desired;
|
|
BOOL trunc;
|
|
BOOL authoritative;
|
|
} nm_flags;
|
|
int rcode;
|
|
int qdcount;
|
|
int ancount;
|
|
int nscount;
|
|
int arcount;
|
|
} header;
|
|
|
|
struct {
|
|
struct nmb_name question_name;
|
|
int question_type;
|
|
int question_class;
|
|
} question;
|
|
|
|
struct res_rec *answers;
|
|
struct res_rec *nsrecs;
|
|
struct res_rec *additional;
|
|
};
|
|
|
|
|
|
/* a datagram - this normally contains SMB data in the data[] array */
|
|
struct dgram_packet {
|
|
struct {
|
|
int msg_type;
|
|
struct {
|
|
enum node_type node_type;
|
|
BOOL first;
|
|
BOOL more;
|
|
} flags;
|
|
int dgm_id;
|
|
struct in_addr source_ip;
|
|
int source_port;
|
|
int dgm_length;
|
|
int packet_offset;
|
|
} header;
|
|
struct nmb_name source_name;
|
|
struct nmb_name dest_name;
|
|
int datasize;
|
|
char data[MAX_DGRAM_SIZE];
|
|
};
|
|
|
|
/* define a structure used to queue packets. this will be a linked
|
|
list of nmb packets */
|
|
struct packet_struct
|
|
{
|
|
struct packet_struct *next;
|
|
struct packet_struct *prev;
|
|
struct in_addr ip;
|
|
int port;
|
|
int fd;
|
|
time_t timestamp;
|
|
enum packet_type packet_type;
|
|
union {
|
|
struct nmb_packet nmb;
|
|
struct dgram_packet dgram;
|
|
} packet;
|
|
};
|
|
|
|
|
|
/* this defines a list of network interfaces */
|
|
struct net_interface {
|
|
struct net_interface *next;
|
|
struct in_addr ip;
|
|
struct in_addr bcast;
|
|
struct in_addr netmask;
|
|
};
|
|
|
|
|
|
/* prototypes */
|
|
void free_nmb_packet(struct nmb_packet *nmb);
|
|
void free_packet(struct packet_struct *packet);
|
|
struct packet_struct *read_packet(int fd,enum packet_type packet_type);
|
|
BOOL send_packet(struct packet_struct *p);
|
|
struct packet_struct *receive_packet(int fd,enum packet_type type,int timeout);
|
|
void make_nmb_name(struct nmb_name *n,char *name,int type,char *this_scope);
|
|
BOOL name_query(int fd,char *name,int name_type,
|
|
BOOL bcast,BOOL recurse,
|
|
struct in_addr to_ip, struct in_addr *ip,void (*fn)());
|
|
BOOL name_status(int fd,char *name,int name_type,BOOL recurse,
|
|
struct in_addr to_ip,char *master,char *rname,
|
|
void (*fn)());
|
|
BOOL send_mailslot_reply(char *mailslot,int fd,char *buf,int len,
|
|
char *srcname,char *dstname,
|
|
int src_type,int dest_type,
|
|
struct in_addr dest_ip,
|
|
struct in_addr src_ip);
|
|
char *namestr(struct nmb_name *n);
|