/* Browser cache for synchronising browse lists. */
struct browse_cache_record {
ubi_dlNode node[1];
- fstring lmb_name;
- fstring work_group;
+ unstring lmb_name;
+ unstring work_group;
struct in_addr ip;
time_t sync_time;
time_t death_time; /* The time the record must be removed. */
enum logon_state log_state;
/* Work group info. */
- fstring work_group;
+ unstring work_group;
int token; /* Used when communicating with backup browsers. */
- fstring local_master_browser_name; /* Current local master browser. */
+ unstring local_master_browser_name; /* Current local master browser. */
/* Announce info. */
time_t lastannounce_time;
#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1)
#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1)
#define nstrcpy(d,s) safe_strcpy((d), (s),sizeof(nstring)-1)
+#define unstrcpy(d,s) safe_strcpy((d), (s),sizeof(unstring)-1)
/* the addition of the DEVELOPER checks in safe_strcpy means we must
* update a lot of code. To make this a little easier here are some
#include "smb_macros.h"
#define MAX_NETBIOSNAME_LEN 16
+/* DOS character, NetBIOS namestring. Type used on the wire. */
typedef char nstring[MAX_NETBIOSNAME_LEN];
+/* Unix character, NetBIOS namestring. Type used to manipulate name in nmbd. */
+typedef char unstring[MAX_NETBIOSNAME_LEN*4];
/* A netbios name structure. */
struct nmb_name {
static struct name_record *add_dns_result(struct nmb_name *question, struct in_addr addr)
{
int name_type = question->name_type;
- fstring qname;
+ unstring qname;
pull_ascii_nstring(qname, sizeof(qname), question->name);
static void asyncdns_process(void)
{
struct query_record r;
- fstring qname;
+ unstring qname;
DEBUGLEVEL = -1;
if (read_data(fd_in, (char *)&r, sizeof(r)) != sizeof(r))
break;
- fstrcpy(qname, r.name.name);
-
+ pull_ascii_nstring( qname, sizeof(qname), r.name.name);
r.result.s_addr = interpret_addr(qname);
if (write_data(fd_out, (char *)&r, sizeof(r)) != sizeof(r))
struct name_record **n)
{
struct in_addr dns_ip;
- nstring qname;
+ unstring qname;
pull_ascii_nstring(qname, question->name);
struct response_record *rrec,
struct nmb_name *fail_name)
{
- fstring failname;
+ unstring failname;
struct work_record *work;
struct server_record *servrec;
uint16 nb_flags,
int ttl, struct in_addr registered_ip)
{
- fstring regname;
+ unstring regname;
struct work_record *work;
struct server_record *servrec;
struct nmb_name *nmbname, struct in_addr ip,
struct res_rec *rrec)
{
- fstring name;
+ unstring name;
pull_ascii_nstring(name, sizeof(name), nmbname->name);
/* If the given ip is not ours, then we can't become a domain
struct response_record *rrec,
struct nmb_name *question_name, int fail_code)
{
- fstring name;
+ unstring name;
/* If the query was unicast, and the error is not NAM_ERR (name didn't exist),
then this is a failure. Otherwise, not finding the name is what we want. */
void insert_permanent_name_into_unicast( struct subnet_record *subrec,
struct nmb_name *nmbname, uint16 nb_type )
{
- fstring name;
+ unstring name;
struct name_record *namerec;
if((namerec = find_name_on_subnet(unicast_subnet, nmbname, FIND_SELF_NAME)) == NULL) {
struct in_addr released_ip)
{
BOOL force_new_election = False;
- fstring relname;
+ unstring relname;
memcpy((char *)&force_new_election, userdata->data, sizeof(BOOL));
struct name_record *namerec;
struct userdata_struct *userdata = rrec->userdata;
BOOL force_new_election = False;
- fstring failname;
+ unstring failname;
memcpy((char *)&force_new_election, userdata->data, sizeof(BOOL));
struct server_record *sl;
struct work_record *work;
struct server_record *servrec;
- fstring regname;
+ unstring regname;
pull_ascii_nstring(regname, sizeof(regname), registered_name->name);
work = find_workgroup_on_subnet( subrec, regname);
struct response_record *rrec,
struct nmb_name *fail_name)
{
- fstring failname;
+ unstring failname;
struct work_record *work;
DEBUG(0,("become_local_master_fail2: failed to register name %s on subnet %s. \
}
#endif
- fstrcpy(work->local_master_browser_name, newname);
+ unstrcpy(work->local_master_browser_name, newname);
}
/* Allow the new lmb to miss an announce period before we remove it. */
browc->death_time = now + ( (CHECK_TIME_MST_ANNOUNCE + 2) * 60 );
- fstrcpy( browc->lmb_name, browser_name);
- fstrcpy( browc->work_group, work_name);
+ unstrcpy( browc->lmb_name, browser_name);
+ unstrcpy( browc->work_group, work_name);
strupper_m( browc->lmb_name );
strupper_m( browc->work_group );
static void announce_local_master_browser_to_domain_master_browser( struct work_record *work)
{
pstring outbuf;
- fstring myname;
+ unstring myname;
char *p;
if(ismyip(work->dmb_addr)) {
SCVAL(p,0,ANN_MasterAnnouncement);
p++;
- fstrcpy(myname, global_myname());
+ unstrcpy(myname, global_myname());
strupper_m(myname);
myname[15]='\0';
/* The call below does CH_UNIX -> CH_DOS conversion. JRA */
static void sync_with_dmb(struct work_record *work)
{
- fstring dmb_name;
+ unstring dmb_name;
if( DEBUGLVL( 2 ) ) {
dbgtext( "sync_with_dmb:\n" );
dbgtext( "for workgroup %s\n", work->work_group );
}
- pull_ascii_nstring(dmb_name, sizeof(fstring), work->dmb_name.name);
+ pull_ascii_nstring(dmb_name, sizeof(dmb_name), work->dmb_name.name);
sync_browse_lists(work, dmb_name, work->dmb_name.name_type,
work->dmb_addr, False, True);
}
p += 1;
while (numnames--) {
- fstring qname;
+ unstring qname;
uint16 nb_flags;
int name_type;
struct nmb_name nmbname;
struct userdata_struct *userdata;
size_t size = sizeof(struct userdata_struct) + sizeof(fstring)+1;
- fstring qname;
+ unstring qname;
pull_ascii_nstring(qname, sizeof(qname), q_name->name);
if( !(work = find_workgroup_on_subnet(subrec, qname)) ) {
struct in_addr from_ip)
{
struct work_record *work;
- fstring server_name;
+ unstring server_name;
server_name[0] = 0;
p += 1;
while (numnames--) {
- fstring qname;
+ unstring qname;
uint16 nb_flags;
int name_type;
if(!(nb_flags & NB_GROUP) && (name_type == 0x00) &&
server_name[0] == 0) {
/* this is almost certainly the server netbios name */
- fstrcpy(server_name, qname);
+ unstrcpy(server_name, qname);
continue;
}
return;
/* remember who the master is */
- fstrcpy(work->local_master_browser_name, server_name);
+ unstrcpy(work->local_master_browser_name, server_name);
make_nmb_name(&nmbname, server_name, 0x20);
work->dmb_name = nmbname;
work->dmb_addr = from_ip;
/* sync with a probability of 1/count */
for (work=unicast_subnet->workgrouplist; work; work = work->next) {
if (strcmp(lp_workgroup(), work->work_group)) {
- fstring dmb_name;
+ unstring dmb_name;
if (((unsigned)sys_random()) % count != 0)
continue;
uint32 criterion, int timeup,const char *server_name)
{
pstring outbuf;
- fstring srv_name;
+ unstring srv_name;
char *p;
DEBUG(2,("send_election_dgram: Sending election packet for workgroup %s on subnet %s\n",
SIVAL(p,1,criterion);
SIVAL(p,5,timeup*1000); /* ms - Despite what the spec says. */
p += 13;
- fstrcpy(srv_name, server_name);
+ unstrcpy(srv_name, server_name);
strupper_m(srv_name);
/* The following call does UNIX -> DOS charset conversion. */
pstrcpy_base(p, srv_name, outbuf);
struct nmb_name *answer_name,
struct in_addr answer_ip, struct res_rec *rrec)
{
- fstring aname;
+ unstring aname;
pull_ascii_nstring(aname, sizeof(aname), answer_name->name);
DEBUG(3,("check_for_master_browser_success: Local master browser for workgroup %s exists at \
IP %s (just checking).\n", aname, inet_ntoa(answer_ip) ));
struct nmb_name *question_name,
int fail_code)
{
- fstring workgroup_name;
+ unstring workgroup_name;
struct work_record *work;
pull_ascii_nstring(workgroup_name,sizeof(workgroup_name),question_name->name);
int version = CVAL(buf,0);
uint32 criterion = IVAL(buf,1);
int timeup = IVAL(buf,5)/1000;
- fstring server_name;
+ unstring server_name;
struct work_record *work;
- fstring workgroup_name;
+ unstring workgroup_name;
pull_ascii_nstring(server_name, sizeof(server_name), buf+13);
pull_ascii_nstring(workgroup_name, sizeof(workgroup_name), dgram->dest_name.name);
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
- fstring announce_name;
+ unstring announce_name;
uint32 servertype = IVAL(buf,23);
fstring comment;
struct work_record *work;
struct server_record *servrec;
- fstring work_name;
- fstring source_name;
+ unstring work_name;
+ unstring source_name;
START_PROFILE(host_announce);
*/
if(strequal(work_name, global_myname()))
- fstrcpy(work_name,lp_workgroup());
+ unstrcpy(work_name,lp_workgroup());
/*
* We are being very agressive here in adding a workgroup
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
- fstring workgroup_announce_name;
- fstring master_name;
+ unstring workgroup_announce_name;
+ unstring master_name;
uint32 servertype = IVAL(buf,23);
struct work_record *work;
- fstring source_name;
- fstring dest_name;
+ unstring source_name;
+ unstring dest_name;
START_PROFILE(workgroup_announce);
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
- fstring server_name;
+ unstring server_name;
uint32 servertype = IVAL(buf,23);
fstring comment;
- fstring work_name;
+ unstring work_name;
struct work_record *work;
struct server_record *servrec;
- fstring source_name;
+ unstring source_name;
START_PROFILE(local_master_announce);
void process_master_browser_announce(struct subnet_record *subrec,
struct packet_struct *p,char *buf)
{
- fstring local_master_name;
+ unstring local_master_name;
struct work_record *work;
struct browse_cache_record *browrec;
int osmajor=CVAL(buf,5); /* major version of node software */
int osminor=CVAL(buf,6); /* minor version of node software */
int ttl = SVAL(buf,7);
- fstring announce_name;
+ unstring announce_name;
struct work_record *work;
struct server_record *servrec;
- fstring work_name;
- fstring source_name;
+ unstring work_name;
+ unstring source_name;
fstring comment;
char *s = buf+9;
*/
if(strequal(work_name, global_myname()))
- fstrcpy(work_name,lp_workgroup());
+ unstrcpy(work_name,lp_workgroup());
/*
* We are being very agressive here in adding a workgroup
char outbuf[1024];
char *p, *countptr;
unsigned int count = 0;
- fstring send_to_namestr;
+ unstring send_to_namestr;
#if 0
struct server_record *servrec;
#endif
- fstring myname;
+ unstring myname;
memset(outbuf,'\0',sizeof(outbuf));
/* We always return at least one name - our own. */
count = 1;
- fstrcpy(myname, global_myname());
+ unstrcpy(myname, global_myname());
strupper_m(myname);
myname[15]='\0';
push_pstring_base(p, myname, outbuf);
unsigned char max_number_requested = CVAL(buf,0);
uint32 token = IVAL(buf,1); /* Sender's key index for the workgroup. */
int name_type = dgram->dest_name.name_type;
- fstring workgroup_name;
+ unstring workgroup_name;
struct subnet_record *search_subrec = subrec;
START_PROFILE(get_backup_list);
{
struct dgram_packet *dgram = &p->packet.dgram;
struct work_record *work;
- fstring workgroup_name;
+ unstring workgroup_name;
START_PROFILE(announce_request);
void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf)
{
struct dgram_packet *dgram = &p->packet.dgram;
- fstring workgroup_name;
+ unstring workgroup_name;
START_PROFILE(lm_announce_request);
struct nmb_packet *nmb = &p->packet.nmb;
struct in_addr owner_ip;
struct nmb_name *question = &nmb->question.question_name;
- fstring qname;
+ unstring qname;
BOOL bcast = nmb->header.nm_flags.bcast;
uint16 nb_flags = get_nb_flags(nmb->additional->rdata);
BOOL group = (nb_flags & NB_GROUP) ? True : False;
static int status_compare(char *n1,char *n2)
{
- fstring name1, name2;
+ unstring name1, name2;
int l1,l2,l3;
memset(name1, '\0', sizeof(name1));
(l1!=l3 || strncmp(n1,global_myname(),l3) != 0))
return 1;
- return memcmp(n1,n2,sizeof(fstring));
+ return memcmp(n1,n2,sizeof(name1));
}
/****************************************************************************
void process_node_status_request(struct subnet_record *subrec, struct packet_struct *p)
{
struct nmb_packet *nmb = &p->packet.nmb;
- fstring qname;
+ unstring qname;
int ques_type = nmb->question.question_name.name_type;
char rdata[MAX_DGRAM_SIZE];
char *countptr, *buf, *bufend, *buf0;
while (buf < bufend) {
if( (namerec->data.source == SELF_NAME) || (namerec->data.source == PERMANENT_NAME) ) {
int name_type = namerec->name.name_type;
- fstring name;
+ unstring name;
pull_ascii_nstring(name, sizeof(name), namerec->name.name);
strupper_m(name);
struct response_record *rrec,
struct nmb_name *fail_name)
{
- fstring failname;
+ unstring failname;
struct work_record *work;
struct server_record *servrec;
uint16 nb_flags,
int ttl, struct in_addr registered_ip)
{
- fstring reg_name;
+ unstring reg_name;
struct work_record *work;
struct server_record *servrec;
}
if((namerec = find_name_on_subnet(unicast_subnet, nmbname, FIND_SELF_NAME)) == NULL) {
- fstring name;
+ unstring name;
pull_ascii_nstring(name, sizeof(name), nmbname->name);
/* The name needs to be created on the unicast subnet. */
(void)add_name_to_subnet( unicast_subnet, name,
static void upcase_name( struct nmb_name *target, struct nmb_name *source )
{
int i;
- fstring targ;
+ unstring targ;
fstring scope;
if( NULL != source )
namerec = find_name_on_subnet( subrec, nmbname, FIND_SELF_NAME );
if( NULL == namerec ) {
- fstring name;
+ unstring name;
pull_ascii_nstring(name, sizeof(name), nmbname->name);
add_name_to_subnet( subrec, name, nmbname->name_type,
nb_flags, ttl, SELF_NAME, 1, ®istered_ip );
*/
#if 1 /* OLD_SAMBA_SERVER_HACK */
- fstring ans_name;
+ unstring ans_name;
pull_ascii_nstring(ans_name, sizeof(ans_name), answer_name->name);
if((nmb->header.rcode == ACT_ERR) && strequal(lp_workgroup(), ans_name) &&
(answer_name->name_type == 0x1b)) {
struct subnet_record *subrec;
char **wins_tags;
struct in_addr *ip_list;
- fstring name;
+ unstring name;
for(subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec) )
num_ips++;
errno = 0;
push_ascii_nstring(nname, name);
if (errno == E2BIG) {
- fstring tname;
+ unstring tname;
pull_ascii_nstring(tname, sizeof(tname), nname);
DEBUG(0,("register_name: NetBIOS name %s is too long. Truncating to %s\n",
name, tname));
int command = CVAL(buf,0);
struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
char scope[64];
- fstring src_name;
+ unstring src_name;
/* Drop the packet if it's a different NetBIOS scope, or the source is from one of our names. */
pull_ascii(scope, dgram->dest_name.scope, 64, 64, STR_TERMINATE);
int command = SVAL(buf,0);
struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
char scope[64];
- fstring src_name;
+ unstring src_name;
/* Drop the packet if it's a different NetBIOS scope, or the source is from one of our names. */
{
fstring getdc_str;
- nstring source_name;
+ fstring source_name;
char *q = buf + 2;
fstring asccomp;
send_mailslot(True, getdc,
outbuf,PTR_DIFF(q,outbuf),
global_myname(), 0x0,
- dgram->source_name.name,
+ source_name,
dgram->source_name.name_type,
p->ip, *iface_ip(p->ip), p->port);
break;
struct work_record *work;
pstring outbuf;
char *p;
- fstring myname;
+ unstring myname;
if (last_time && (t < (last_time + REMOTE_ANNOUNCE_INTERVAL)))
return;
SCVAL(p,0,ANN_MasterAnnouncement);
p++;
- fstrcpy(myname, global_myname());
+ unstrcpy(myname, global_myname());
strupper_m(myname);
myname[15]='\0';
push_pstring_base(p, myname, outbuf);
struct sync_record {
struct sync_record *next, *prev;
- fstring workgroup;
- fstring server;
+ unstring workgroup;
+ unstring server;
pstring fname;
struct in_addr ip;
pid_t pid;
ZERO_STRUCTP(s);
- fstrcpy(s->workgroup, work->work_group);
- fstrcpy(s->server, name);
+ unstrcpy(s->workgroup, work->work_group);
+ unstrcpy(s->server, name);
s->ip = ip;
slprintf(s->fname, sizeof(pstring)-1,
sname, lp_max_ttl());
if (work) {
/* remember who the master is */
- fstrcpy(work->local_master_browser_name, comment);
+ unstrcpy(work->local_master_browser_name, comment);
}
}
return;
static void complete_sync(struct sync_record *s)
{
XFILE *f;
- fstring server, type_str;
+ unstring server, type_str;
unsigned type;
pstring comment;
pstring line;
struct userdata_struct *userdata,
struct nmb_name *nmbname, struct in_addr ip, struct res_rec *rrec)
{
- fstring name;
+ unstring name;
struct packet_struct *original_packet;
struct subnet_record *orig_broadcast_subnet;
struct name_record *namerec;
long *ud[(sizeof(struct userdata_struct) + sizeof(struct subrec *) +
sizeof(struct packet_struct *))/sizeof(long *) + 1];
struct userdata_struct *userdata = (struct userdata_struct *)ud;
- fstring qname;
+ unstring qname;
memset(ud, '\0', sizeof(ud));
void wins_process_name_registration_request(struct subnet_record *subrec,
struct packet_struct *p)
{
- fstring name;
+ unstring name;
struct nmb_packet *nmb = &p->packet.nmb;
struct nmb_name *question = &nmb->question.question_name;
BOOL bcast = nmb->header.nm_flags.bcast;
struct in_addr from_ip;
BOOL group = (nb_flags & NB_GROUP) ? True : False;
struct in_addr our_fake_ip = *interpret_addr2("0.0.0.0");
- fstring qname;
+ unstring qname;
putip((char *)&from_ip,&nmb->additional->rdata[2]);
struct nmb_packet *nmb = &p->packet.nmb;
struct nmb_name *question = &nmb->question.question_name;
struct name_record *namerec = NULL;
- fstring qname;
+ unstring qname;
DEBUG(3,("wins_process_name_query: name query for name %s from IP %s\n",
nmb_namestr(question), inet_ntoa(p->ip) ));
DEBUGADD(4,("%2x\n", namerec->data.nb_flags ));
if( namerec->data.source == REGISTER_NAME ) {
- fstring name;
+ unstring name;
pull_ascii_nstring(name, sizeof(name), namerec->name.name);
x_fprintf(fp, "\"%s#%02x\" %d ", name,namerec->name.name_type, /* Ignore scope. */
(int)namerec->data.death_time);
errno = 0;
push_ascii_nstring(nname, name);
if (errno == E2BIG) {
- fstring tname;
+ unstring tname;
pull_ascii_nstring(tname, sizeof(tname), nname);
- fstrcpy(work->work_group,tname);
+ unstrcpy(work->work_group,tname);
DEBUG(0,("create_workgroup: workgroup name %s is too long. Truncating to %s\n",
name, tname));
} else {
- fstrcpy(work->work_group,name);
+ unstrcpy(work->work_group,name);
}
work->serverlist = NULL;