diff options
Diffstat (limited to 'source3/smbwrapper')
-rw-r--r-- | source3/smbwrapper/smbw.c | 31 | ||||
-rw-r--r-- | source3/smbwrapper/smbw_dir.c | 27 |
2 files changed, 52 insertions, 6 deletions
diff --git a/source3/smbwrapper/smbw.c b/source3/smbwrapper/smbw.c index 054b694c41..650d0a08f5 100644 --- a/source3/smbwrapper/smbw.c +++ b/source3/smbwrapper/smbw.c @@ -207,7 +207,7 @@ char *smbw_parse_path(const char *fname, char *server, char *share, char *path) { static pstring s; char *p, *p2; - int len; + int len = strlen(SMBW_PREFIX)-1; *server = *share = *path = 0; @@ -221,9 +221,12 @@ char *smbw_parse_path(const char *fname, char *server, char *share, char *path) DEBUG(5,("cleaned %s (fname=%s cwd=%s)\n", s, fname, smb_cwd)); - if (strncmp(s,SMBW_PREFIX,strlen(SMBW_PREFIX))) return s; + if (strncmp(s,SMBW_PREFIX,len) || + (s[len] != '/' && s[len] != 0)) return s; + + p = s + len; + if (*p == '/') p++; - p = s + strlen(SMBW_PREFIX); p2 = strchr(p,'/'); if (p2) { @@ -239,6 +242,11 @@ char *smbw_parse_path(const char *fname, char *server, char *share, char *path) p = p2; if (!p) { + if (len == 0) { + char *workgroup = getenv("SMBW_WORKGROUP"); + if (!workgroup) workgroup = lp_workgroup(); + slprintf(server,sizeof(fstring)-1, "%s#1D", workgroup); + } fstrcpy(share,"IPC$"); pstrcpy(path,""); goto ok; @@ -336,6 +344,8 @@ struct smbw_server *smbw_server(char *server, char *share) char *password; char *workgroup; struct nmb_name called, calling; + char *p, *server_n = server; + fstring group; ZERO_STRUCT(c); @@ -364,8 +374,21 @@ struct smbw_server *smbw_server(char *server, char *share) make_nmb_name(&called , server, 0x20, ""); again: + if ((p=strchr(server_n,'#'))) { + struct in_addr ip; + fstrcpy(group, server_n); + p = strchr(group,'#'); + *p = 0; + if (!find_master(group, &ip)) { + errno = ENOENT; + return NULL; + } + fstrcpy(group, inet_ntoa(ip)); + server_n = group; + } + /* have to open a new connection */ - if (!cli_initialise(&c) || !cli_connect(&c, server, NULL)) { + if (!cli_initialise(&c) || !cli_connect(&c, server_n, NULL)) { errno = ENOENT; return NULL; } diff --git a/source3/smbwrapper/smbw_dir.c b/source3/smbwrapper/smbw_dir.c index 3fdaebec5a..d794944b1a 100644 --- a/source3/smbwrapper/smbw_dir.c +++ b/source3/smbwrapper/smbw_dir.c @@ -113,6 +113,23 @@ static void smbw_share_add(const char *share, uint32 type, const char *comment) /***************************************************** +add a server to a directory listing +*******************************************************/ +static void smbw_server_add(const char *name, uint32 type, + const char *comment) +{ + struct file_info finfo; + + ZERO_STRUCT(finfo); + + pstrcpy(finfo.name, name); + finfo.mode = aRONLY | aDIR; + + smbw_dir_add(&finfo); +} + + +/***************************************************** add a entry to a directory listing *******************************************************/ static void smbw_printjob_add(struct print_job_info *job) @@ -145,7 +162,7 @@ int smbw_dir_open(const char *fname) struct smbw_dir *dir=NULL; pstring mask; int fd; - char *s; + char *s, *p; DEBUG(4,("%s\n", __FUNCTION__)); @@ -181,7 +198,13 @@ int smbw_dir_open(const char *fname) slprintf(mask, sizeof(mask)-1, "%s\\*", path); string_sub(mask,"\\\\","\\"); - if (strcmp(srv->cli.dev,"IPC") == 0) { + if ((p=strstr(srv->server_name,"#1D"))) { + DEBUG(4,("doing NetServerEnum\n")); + *p = 0; + cli_NetServerEnum(&srv->cli, srv->server_name, SV_TYPE_ALL, + smbw_server_add); + *p = '#'; + } else if (strcmp(srv->cli.dev,"IPC") == 0) { DEBUG(4,("doing NetShareEnum\n")); if (cli_RNetShareEnum(&srv->cli, smbw_share_add) < 0) { errno = smbw_errno(&srv->cli); |