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
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
+#include "../librpc/gen_ndr/svcctl.h"
+#include "nmbd/nmbd.h"
+#include "smbprofile.h"
-extern BOOL found_lm_clients;
+extern bool found_lm_clients;
#if 0
Process an incoming host announcement packet.
*******************************************************************/
-void process_host_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
+void process_host_announce(struct subnet_record *subrec, struct packet_struct *p, const char *buf)
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
* to be our primary workgroup name.
*/
- if(strequal(work_name, global_myname()))
+ if(strequal(work_name, lp_netbios_name()))
unstrcpy(work_name,lp_workgroup());
/*
/* Update the record. */
servrec->serv.type = servertype|SV_TYPE_LOCAL_LIST_ONLY;
update_server_ttl( servrec, ttl);
- fstrcpy(servrec->serv.comment,comment);
+ strlcpy(servrec->serv.comment,comment,sizeof(servrec->serv.comment));
}
} else {
/*
Process an incoming WORKGROUP announcement packet.
*******************************************************************/
-void process_workgroup_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
+void process_workgroup_announce(struct subnet_record *subrec, struct packet_struct *p, const char *buf)
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
Process an incoming local master browser announcement packet.
*******************************************************************/
-void process_local_master_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
+void process_local_master_announce(struct subnet_record *subrec, struct packet_struct *p, const char *buf)
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
uint32 servertype = IVAL(buf,23);
fstring comment;
unstring work_name;
- struct work_record *work;
+ struct work_record *work = NULL;
struct server_record *servrec;
unstring source_name;
/* Update the record. */
servrec->serv.type = servertype|SV_TYPE_LOCAL_LIST_ONLY;
update_server_ttl(servrec, ttl);
- fstrcpy(servrec->serv.comment,comment);
+ strlcpy(servrec->serv.comment,comment,sizeof(servrec->serv.comment));
}
set_workgroup_local_master_browser_name( work, server_name );
* This server is announcing it is going down. Remove it from the
* workgroup.
*/
- if(!is_myname(server_name) && (work != NULL) &&
+ if(!is_myname(server_name) &&
((servrec = find_server_in_workgroup( work, server_name))!=NULL)) {
remove_server_from_workgroup( work, servrec);
}
******************************************************************/
void process_master_browser_announce(struct subnet_record *subrec,
- struct packet_struct *p,char *buf)
+ struct packet_struct *p,const char *buf)
{
unstring local_master_name;
struct work_record *work;
Process an incoming LanMan host announcement packet.
*******************************************************************/
-void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf, int len)
+void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct *p, const char *buf, int len)
{
struct dgram_packet *dgram = &p->packet.dgram;
uint32 servertype = IVAL(buf,1);
unstring work_name;
unstring source_name;
fstring comment;
- char *s = get_safe_str_ptr(buf,len,buf,9);
+ char *s = get_safe_str_ptr(buf,len,discard_const_p(char, buf),9);
START_PROFILE(lm_host_announce);
if (!s) {
goto done;
}
- s = skip_string(buf,len,s,1);
+ s = skip_string(buf,len,s);
if (!s) {
goto done;
}
* not needed in the LanMan announce code, but it won't hurt.
*/
- if(strequal(work_name, global_myname()))
+ if(strequal(work_name, lp_netbios_name()))
unstrcpy(work_name,lp_workgroup());
/*
/* Update the record. */
servrec->serv.type = servertype|SV_TYPE_LOCAL_LIST_ONLY;
update_server_ttl( servrec, ttl);
- fstrcpy(servrec->serv.comment,comment);
+ strlcpy(servrec->serv.comment,comment,sizeof(servrec->serv.comment));
}
} else {
/*
Send a backup list response.
*****************************************************************************/
-static void send_backup_list_response(struct subnet_record *subrec,
+static void send_backup_list_response(struct subnet_record *subrec,
struct work_record *work,
struct nmb_name *send_to_name,
unsigned char max_number_requested,
uint32 token, struct in_addr sendto_ip,
int port)
-{
+{
char outbuf[1024];
char *p, *countptr;
unsigned int count = 0;
DEBUG(3,("send_backup_list_response: sending backup list for workgroup %s to %s IP %s\n",
work->work_group, nmb_namestr(send_to_name), inet_ntoa(sendto_ip)));
-
+
p = outbuf;
-
+
SCVAL(p,0,ANN_GetBackupListResp); /* Backup list response opcode. */
p++;
SIVAL(p,0,token); /* The sender's unique info. */
p += 4;
-
+
/* We always return at least one name - our own. */
count = 1;
- unstrcpy(myname, global_myname());
+ unstrcpy(myname, lp_netbios_name());
strupper_m(myname);
myname[15]='\0';
- push_pstring_base(p, myname, outbuf);
+ push_ascii(p, myname, sizeof(outbuf)-PTR_DIFF(p,outbuf)-1, STR_TERMINATE);
- p = skip_string(outbuf,sizeof(outbuf),p,1);
+ p = skip_string(outbuf,sizeof(outbuf),p);
/* Look for backup browsers in this workgroup. */
if(count >= (unsigned int)max_number_requested)
break;
- if(strnequal(servrec->serv.name, global_myname(),15))
+ if(strnequal(servrec->serv.name, lp_netbios_name(),15))
continue;
if(!(servrec->serv.type & SV_TYPE_BACKUP_BROWSER))
DEBUG(5,("send_backup_list_response: Adding server %s number %d\n",
p, count));
- p = skip_string(outbuf,sizeof(outbuf),p,1);
+ p = skip_string(outbuf,sizeof(outbuf),p);
}
#endif
send_mailslot(True, BROWSE_MAILSLOT,
outbuf,PTR_DIFF(p,outbuf),
- global_myname(), 0,
+ lp_netbios_name(), 0,
send_to_namestr,0,
sendto_ip, subrec->myip, port);
}
********************************************************************/
void process_get_backup_list_request(struct subnet_record *subrec,
- struct packet_struct *p,char *buf)
+ struct packet_struct *p,const char *buf)
{
struct dgram_packet *dgram = &p->packet.dgram;
struct work_record *work;
******************************************************************/
void process_reset_browser(struct subnet_record *subrec,
- struct packet_struct *p,char *buf)
+ struct packet_struct *p,const char *buf)
{
struct dgram_packet *dgram = &p->packet.dgram;
int state = CVAL(buf,0);
announcement is needed soon.
******************************************************************/
-void process_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf)
+void process_announce_request(struct subnet_record *subrec, struct packet_struct *p, const char *buf)
{
struct dgram_packet *dgram = &p->packet.dgram;
struct work_record *work;
through the "lm announce" parameter in smb.conf)
******************************************************************/
-void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf, int len)
+void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, const char *buf, int len)
{
struct dgram_packet *dgram = &p->packet.dgram;
unstring workgroup_name;