summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/client/clientutil.c9
-rw-r--r--source/include/proto.h9
-rw-r--r--source/libsmb/clientgen.c73
-rw-r--r--source/nmbsync.c228
4 files changed, 160 insertions, 159 deletions
diff --git a/source/client/clientutil.c b/source/client/clientutil.c
index 9919f0a2d34..47cb78f0ce6 100644
--- a/source/client/clientutil.c
+++ b/source/client/clientutil.c
@@ -683,12 +683,13 @@ BOOL cli_send_login(char *inbuf,char *outbuf,BOOL start_session,BOOL use_setup)
uid = SVAL(inbuf,smb_uid);
}
- if (SVAL(inbuf, smb_vwv2) & 1)
- DEBUG(1,("connected as guest "));
- if (sec_mode & 1)
+ if (sec_mode & 1) {
+ if (SVAL(inbuf, smb_vwv2) & 1)
+ DEBUG(1,("connected as guest "));
DEBUG(1,("security=user\n"));
- else
+ } else {
DEBUG(1,("security=share\n"));
+ }
/* now we've got a connection - send a tcon message */
bzero(outbuf,smb_size);
diff --git a/source/include/proto.h b/source/include/proto.h
index 037438f97d3..6489e875614 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -43,6 +43,8 @@ void cmd_help(void);
/*The following definitions come from clientgen.c */
BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation);
+BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype,
+ void (*fn)(char *, uint32, char *));
BOOL cli_session_setup(struct cli_state *cli,
char *user,
char *pass, int passlen,
@@ -632,9 +634,8 @@ int main(int argc,char *argv[]);
/*The following definitions come from nmbsync.c */
-char *getsmbpass(char *pass);
void sync_browse_lists(struct subnet_record *d, struct work_record *work,
- char *name, int nm_type, struct in_addr ip, BOOL local);
+ char *name, int nm_type, struct in_addr ip, BOOL local);
/*The following definitions come from ntclient.c */
@@ -928,12 +929,12 @@ void make_arc4_owf(ARC4_OWF *hash, char data[16]);
char* smb_io_arc4_owf(BOOL io, ARC4_OWF *hash, char *q, char *base, int align, int depth);
void make_id_info1(DOM_ID_INFO_1 *id, char *domain_name,
uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
- char *user_name, char *workgroup_name,
+ char *user_name, char *wksta_name,
char arc4_lm_owf[16], char arc4_nt_owf[16]);
char* smb_io_id_info1(BOOL io, DOM_ID_INFO_1 *id, char *q, char *base, int align, int depth);
void make_sam_info(DOM_SAM_INFO *sam,
char *logon_srv, char *comp_name, DOM_CRED *clnt_cred,
- DOM_CRED *rtn_cred, uint16 switch_value, uint16 logon_level,
+ DOM_CRED *rtn_cred, uint16 logon_level, uint16 switch_value,
DOM_ID_INFO_1 *id1);
char* smb_io_sam_info(BOOL io, DOM_SAM_INFO *sam, char *q, char *base, int align, int depth);
char* smb_io_gid(BOOL io, DOM_GID *gid, char *q, char *base, int align, int depth);
diff --git a/source/libsmb/clientgen.c b/source/libsmb/clientgen.c
index 7cd2ef69036..b6ad1611ace 100644
--- a/source/libsmb/clientgen.c
+++ b/source/libsmb/clientgen.c
@@ -313,6 +313,79 @@ BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation)
}
+/****************************************************************************
+call a NetServerEnum for the specified workgroup and servertype mask.
+This function then calls the specified callback function for each name returned.
+
+The callback function takes 3 arguments: the machine name, the server type and
+the comment.
+****************************************************************************/
+BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype,
+ void (*fn)(char *, uint32, char *))
+{
+ char *rparam = NULL;
+ char *rdata = NULL;
+ int rdrcnt,rprcnt;
+ char *p;
+ pstring param;
+ int uLevel = 1;
+ int count = -1;
+
+ /* send a SMBtrans command with api NetServerEnum */
+ p = param;
+ SSVAL(p,0,0x68); /* api number */
+ p += 2;
+ strcpy(p,"WrLehDz");
+ p = skip_string(p,1);
+
+ strcpy(p,"B16BBDz");
+
+ p = skip_string(p,1);
+ SSVAL(p,0,uLevel);
+ SSVAL(p,2,BUFFER_SIZE);
+ p += 4;
+ SIVAL(p,0,stype);
+ p += 4;
+
+ pstrcpy(p, workgroup);
+ p = skip_string(p,1);
+
+ if (cli_api(cli,
+ PTR_DIFF(p,param), /* param count */
+ 8, /*data count */
+ 0, /* mprcount */
+ BUFFER_SIZE, /* mdrcount */
+ &rprcnt,&rdrcnt,
+ param, NULL,
+ &rparam,&rdata)) {
+ int res = SVAL(rparam,0);
+ int converter=SVAL(rparam,2);
+ int i;
+
+ if (res == 0) {
+ count=SVAL(rparam,4);
+ p = rdata;
+
+ for (i = 0;i < count;i++, p += 26) {
+ char *sname = p;
+ int comment_offset = IVAL(p,22) & 0xFFFF;
+ char *cmnt = comment_offset?(rdata+comment_offset-converter):"";
+
+ stype = IVAL(p,18) & ~SV_TYPE_LOCAL_LIST_ONLY;
+
+ fn(sname, stype, cmnt);
+ }
+ }
+ }
+
+ if (rparam) free(rparam);
+ if (rdata) free(rdata);
+
+ return(count > 0);
+}
+
+
+
static struct {
int prot;
diff --git a/source/nmbsync.c b/source/nmbsync.c
index e0c36d59615..5fa41e127a5 100644
--- a/source/nmbsync.c
+++ b/source/nmbsync.c
@@ -20,117 +20,33 @@
*/
-/* We *must have REPLACE_GETPASS defined here before the includes. */
-#define REPLACE_GETPASS
#include "includes.h"
extern int DEBUGLEVEL;
-extern pstring myname;
-
-extern int name_type;
-extern int max_protocol;
-extern struct in_addr dest_ip;
-extern int pid;
-extern int gid;
-extern int uid;
-extern int mid;
-extern BOOL got_pass;
-extern BOOL have_ip;
-extern pstring workgroup;
-extern pstring service;
-extern pstring desthost;
-extern BOOL connect_as_ipc;
-
-/****************************************************************************
-fudge for getpass function
-****************************************************************************/
-char *getsmbpass(char *pass)
-{
- return "dummy"; /* return anything: it should be ignored anyway */
-}
+static struct work_record *call_w;
+static struct subnet_record *call_d;
-/****************************************************************************
-adds information retrieved from a NetServerEnum call
-****************************************************************************/
-static BOOL add_info(struct subnet_record *d, struct work_record *work, int servertype)
+/*******************************************************************
+ This is the NetServerEnum callback
+ ******************************************************************/
+static void callback(char *sname, uint32 stype, char *comment)
{
- char *rparam = NULL;
- char *rdata = NULL;
- int rdrcnt,rprcnt;
- char *p;
- pstring param;
- int uLevel = 1;
- int count = -1;
-
- /* now send a SMBtrans command with api ServerEnum? */
- p = param;
- SSVAL(p,0,0x68); /* api number */
- p += 2;
- strcpy(p,"WrLehDz");
- p = skip_string(p,1);
-
- strcpy(p,"B16BBDz");
-
- p = skip_string(p,1);
- SSVAL(p,0,uLevel);
- SSVAL(p,2,BUFFER_SIZE - SAFETY_MARGIN); /* buf length */
- p += 4;
- SIVAL(p,0,servertype);
- p += 4;
-
- pstrcpy(p, work->work_group);
- p = skip_string(p,1);
-
- if (cli_call_api(PIPE_LANMAN,
- PTR_DIFF(p,param), /* param count */
- 8, /*data count */
- 0, /* setup count */
- 0, /* mprcount - whatever that is */
- BUFFER_SIZE - SAFETY_MARGIN, /* mdrcount - whatever that is */
- &rprcnt,&rdrcnt,
- param,NULL, NULL,
- &rparam,&rdata))
- {
- int res = SVAL(rparam,0);
- int converter=SVAL(rparam,2);
- int i;
-
- if (res == 0)
- {
- count=SVAL(rparam,4);
- p = rdata;
-
- for (i = 0;i < count;i++, p += 26)
- {
- char *sname = p;
- uint32 stype = IVAL(p,18) & ~SV_TYPE_LOCAL_LIST_ONLY;
- int comment_offset = IVAL(p,22) & 0xFFFF;
- char *cmnt = comment_offset?(rdata+comment_offset-converter):"";
-
- struct work_record *w = work;
-
- DEBUG(4, ("\t%-16.16s %08x %s\n", sname, stype, cmnt));
-
- if (stype & SV_TYPE_DOMAIN_ENUM)
- {
- /* creates workgroup on remote subnet */
- if ((w = find_workgroupstruct(d,sname,True)))
- {
- announce_request(w, d->bcast_ip);
- }
+ struct work_record *w = call_w;
+
+ stype &= ~SV_TYPE_LOCAL_LIST_ONLY;
+
+ if (stype & SV_TYPE_DOMAIN_ENUM) {
+ /* creates workgroup on remote subnet */
+ if ((w = find_workgroupstruct(call_d,sname,True))) {
+ announce_request(w, call_d->bcast_ip);
}
+ }
- if (w)
- add_server_entry(d,w,sname,stype,lp_max_ttl(),cmnt,False);
- }
+ if (w) {
+ add_server_entry(call_d,w,sname,stype,
+ lp_max_ttl(),comment,False);
}
- }
-
- if (rparam) free(rparam);
- if (rdata) free(rdata);
-
- return(True);
}
@@ -141,54 +57,64 @@ static BOOL add_info(struct subnet_record *d, struct work_record *work, int serv
do a NetServerEnum and update our server and workgroup databases.
******************************************************************/
void sync_browse_lists(struct subnet_record *d, struct work_record *work,
- char *name, int nm_type, struct in_addr ip, BOOL local)
+ char *name, int nm_type, struct in_addr ip, BOOL local)
{
- uint32 local_type = local ? SV_TYPE_LOCAL_LIST_ONLY : 0;
-
- if (!d || !work ) return;
-
- if(d != wins_client_subnet) {
- DEBUG(0,
- ("sync_browse_lists: ERROR sync requested on non-WINS subnet.\n"));
- return;
- }
-
- pid = getpid();
- uid = getuid();
- gid = getgid();
- mid = pid + 100;
- name_type = nm_type;
-
- got_pass = True;
-
- DEBUG(0,("sync_browse_lists: Sync browse lists with %s for %s %s\n",
- name, work->work_group, inet_ntoa(ip)));
-
- strcpy(workgroup,work->work_group);
- fstrcpy(desthost,name);
- dest_ip = ip;
-
- if (zero_ip(dest_ip)) return;
- have_ip = True;
-
- connect_as_ipc = True;
-
- /* connect as server and get domains, then servers */
-
- sprintf(service,"\\\\%s\\IPC$", name);
- strupper(service);
-
- if (cli_open_sockets(SMB_PORT))
- {
- if (cli_send_login(NULL,NULL,True,True))
- {
- add_info(d, work, local_type|SV_TYPE_DOMAIN_ENUM);
- if(local)
- add_info(d, work, SV_TYPE_LOCAL_LIST_ONLY);
- else
- add_info(d, work, SV_TYPE_ALL);
- }
-
- close_sockets();
- }
+ extern fstring local_machine;
+ fstring share;
+ static struct cli_state cli;
+ uint32 local_type = local ? SV_TYPE_LOCAL_LIST_ONLY : 0;
+
+ if (!d || !work ) return;
+
+ if(d != wins_client_subnet) {
+ DEBUG(0,("sync_browse_lists: ERROR sync requested on non-WINS subnet.\n"));
+ return;
+ }
+
+ DEBUG(2,("sync_browse_lists: Sync browse lists with %s for %s %s\n",
+ name, work->work_group, inet_ntoa(ip)));
+
+ if (!cli_initialise(&cli) || !cli_connect(&cli, name, &ip)) {
+ DEBUG(1,("Failed to start browse sync with %s\n", name));
+ }
+
+ if (!cli_session_request(&cli, name, nm_type, local_machine)) {
+ DEBUG(1,("%s rejected the browse sync session\n",name));
+ cli_shutdown(&cli);
+ return;
+ }
+
+ if (!cli_negprot(&cli)) {
+ DEBUG(1,("%s rejected the negprot\n",name));
+ cli_shutdown(&cli);
+ return;
+ }
+
+ if (!cli_session_setup(&cli, "", "", 1, "", 0, work->work_group)) {
+ DEBUG(1,("%s rejected the browse sync sessionsetup\n",
+ name));
+ cli_shutdown(&cli);
+ return;
+ }
+
+ sprintf(share,"\\\\%s\\IPC$", name);
+
+ if (!cli_send_tconX(&cli, share, "IPC", "", 1)) {
+ DEBUG(1,("%s refused browse sync IPC$ connect\n", name));
+ cli_shutdown(&cli);
+ return;
+ }
+
+ call_w = work;
+ call_d = d;
+
+ cli_NetServerEnum(&cli, work->work_group,
+ local_type|SV_TYPE_DOMAIN_ENUM,
+ callback);
+
+ cli_NetServerEnum(&cli, work->work_group,
+ local?SV_TYPE_LOCAL_LIST_ONLY:SV_TYPE_ALL,
+ callback);
+
+ cli_shutdown(&cli);
}