mirror of
https://github.com/samba-team/samba.git
synced 2025-01-27 14:04:05 +03:00
added SMBW_PREFIX environment variable (allowing you to specify root
of smb filesystem) fixed "cd /smb" bug updated README with full list of environment variables. (This used to be commit 71acf338d721b106af8d80e7b3a6f318ab75da8b)
This commit is contained in:
parent
3d21f03595
commit
ed75bab8e2
@ -2,6 +2,8 @@ This is a prelodable shared library that provides SMB client services
|
||||
for existing executables. Using this you can simulate a smb
|
||||
filesystem.
|
||||
|
||||
*** This is code under development. Some things don't work yet ***
|
||||
|
||||
Currently this code has only been tested on:
|
||||
|
||||
- Linux 2.0 with glibc2 (RH5.1)
|
||||
@ -28,9 +30,33 @@ happens. If you set SMBW_WORKGROUP to your workgroup or have workgroup
|
||||
set in yoru smb.conf then listing /smb/ should list all SMB servers in
|
||||
your workgroup.
|
||||
|
||||
For debugging you can set SMBW_DEBUG to an integer debug level.
|
||||
Environment variables
|
||||
---------------------
|
||||
|
||||
SMBW_USER
|
||||
This is usually set by smbsh but you can set it manually. It
|
||||
specifies the username you will connect to servers with.
|
||||
|
||||
SMBW_PASSWORD
|
||||
This is usually set by smbsh but you can set it manually. It
|
||||
specifies the password used to connect to smb servers.
|
||||
|
||||
SMBW_DEBUG
|
||||
This is an integer that controls the internal debug level of smbw. It
|
||||
defaults to 0, which means no debug info.
|
||||
|
||||
SMBW_LOGFILE
|
||||
The place where smbw debug logs are put. If this is not set then
|
||||
stderr is used.
|
||||
|
||||
SMBW_PREFIX
|
||||
The root of the SMB filesystem. This defaults to /smb/ but you can
|
||||
set it to any name you like.
|
||||
|
||||
SMBW_WORKGROUP
|
||||
This is the workgroup used for browsing (ie. listing machines in the
|
||||
/smb/ directory). It defaults to the one set in smb.conf.
|
||||
|
||||
This is code under development. Lots of things don't work yet.
|
||||
|
||||
Things that I have tried and do seem to work include:
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include "includes.h"
|
||||
#include "wrapper.h"
|
||||
|
||||
pstring smb_cwd;
|
||||
pstring smbw_cwd;
|
||||
|
||||
static struct smbw_file *smbw_files;
|
||||
static struct smbw_server *smbw_srvs;
|
||||
@ -31,6 +31,8 @@ struct bitmap *smbw_file_bmap;
|
||||
extern pstring global_myname;
|
||||
extern int DEBUGLEVEL;
|
||||
|
||||
fstring smbw_prefix = SMBW_PREFIX;
|
||||
|
||||
int smbw_busy=0;
|
||||
|
||||
/*****************************************************
|
||||
@ -77,12 +79,18 @@ void smbw_init(void)
|
||||
DEBUGLEVEL = atoi(p);
|
||||
}
|
||||
|
||||
if ((p=getenv("SMBW_PREFIX"))) {
|
||||
slprintf(smbw_prefix,sizeof(fstring)-1, "/%s/", p);
|
||||
string_sub(smbw_prefix,"//", "/");
|
||||
DEBUG(2,("SMBW_PREFIX is %s\n", smbw_prefix));
|
||||
}
|
||||
|
||||
if ((p=getenv(SMBW_PWD_ENV))) {
|
||||
pstrcpy(smb_cwd, p);
|
||||
DEBUG(4,("Initial cwd from smb_cwd is %s\n", smb_cwd));
|
||||
pstrcpy(smbw_cwd, p);
|
||||
DEBUG(4,("Initial cwd from smbw_cwd is %s\n", smbw_cwd));
|
||||
} else {
|
||||
sys_getwd(smb_cwd);
|
||||
DEBUG(4,("Initial cwd from getwd is %s\n", smb_cwd));
|
||||
sys_getwd(smbw_cwd);
|
||||
DEBUG(4,("Initial cwd from getwd is %s\n", smbw_cwd));
|
||||
}
|
||||
smbw_busy--;
|
||||
|
||||
@ -207,21 +215,21 @@ char *smbw_parse_path(const char *fname, char *server, char *share, char *path)
|
||||
{
|
||||
static pstring s;
|
||||
char *p, *p2;
|
||||
int len = strlen(SMBW_PREFIX)-1;
|
||||
int len = strlen(smbw_prefix)-1;
|
||||
|
||||
*server = *share = *path = 0;
|
||||
|
||||
if (fname[0] == '/') {
|
||||
pstrcpy(s, fname);
|
||||
} else {
|
||||
slprintf(s,sizeof(s)-1, "%s/%s", smb_cwd, fname);
|
||||
slprintf(s,sizeof(s)-1, "%s/%s", smbw_cwd, fname);
|
||||
}
|
||||
clean_fname(s);
|
||||
|
||||
DEBUG(5,("cleaned %s (fname=%s cwd=%s)\n",
|
||||
s, fname, smb_cwd));
|
||||
s, fname, smbw_cwd));
|
||||
|
||||
if (strncmp(s,SMBW_PREFIX,len) ||
|
||||
if (strncmp(s,smbw_prefix,len) ||
|
||||
(s[len] != '/' && s[len] != 0)) return s;
|
||||
|
||||
p = s + len;
|
||||
@ -278,7 +286,7 @@ char *smbw_parse_path(const char *fname, char *server, char *share, char *path)
|
||||
|
||||
ok:
|
||||
DEBUG(5,("parsed path name=%s cwd=%s [%s] [%s] [%s]\n",
|
||||
fname, smb_cwd,
|
||||
fname, smbw_cwd,
|
||||
server, share, path));
|
||||
|
||||
return s;
|
||||
@ -293,22 +301,24 @@ int smbw_path(const char *path)
|
||||
fstring server, share;
|
||||
pstring s;
|
||||
char *cwd;
|
||||
int l=strlen(SMBW_PREFIX)-1;
|
||||
int len;
|
||||
|
||||
if (path[0] == '/' && strncmp(path,SMBW_PREFIX,l)) {
|
||||
smbw_init();
|
||||
|
||||
len = strlen(smbw_prefix)-1;
|
||||
|
||||
if (path[0] == '/' && strncmp(path,smbw_prefix,len)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (smbw_busy) return 0;
|
||||
|
||||
smbw_init();
|
||||
|
||||
DEBUG(3,("smbw_path(%s)\n", path));
|
||||
|
||||
cwd = smbw_parse_path(path, server, share, s);
|
||||
|
||||
if (strncmp(cwd,SMBW_PREFIX,l) == 0 &&
|
||||
(cwd[l] == '/' || cwd[l] == 0)) {
|
||||
if (strncmp(cwd,smbw_prefix,len) == 0 &&
|
||||
(cwd[len] == '/' || cwd[len] == 0)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,8 @@
|
||||
#include "includes.h"
|
||||
#include "wrapper.h"
|
||||
|
||||
extern pstring smb_cwd;
|
||||
extern pstring smbw_cwd;
|
||||
extern fstring smbw_prefix;
|
||||
|
||||
static struct smbw_dir *smbw_dirs;
|
||||
|
||||
@ -350,9 +351,12 @@ int smbw_chdir(const char *name)
|
||||
pstring path;
|
||||
uint32 mode = aDIR;
|
||||
char *cwd;
|
||||
int len;
|
||||
|
||||
smbw_init();
|
||||
|
||||
len = strlen(smbw_prefix);
|
||||
|
||||
if (smbw_busy) return real_chdir(name);
|
||||
|
||||
smbw_busy++;
|
||||
@ -362,16 +366,19 @@ int smbw_chdir(const char *name)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
DEBUG(4,("smbw_chdir(%s)\n", name));
|
||||
|
||||
/* work out what server they are after */
|
||||
cwd = smbw_parse_path(name, server, share, path);
|
||||
|
||||
if (strncmp(cwd,SMBW_PREFIX,strlen(SMBW_PREFIX))) {
|
||||
if (real_chdir(cwd) == 0) {
|
||||
DEBUG(4,("set SMBW_CWD to %s\n", cwd));
|
||||
pstrcpy(smb_cwd, cwd);
|
||||
if (setenv(SMBW_PWD_ENV, smb_cwd, 1)) {
|
||||
DEBUG(4,("setenv failed\n"));
|
||||
/* a special case - accept cd to /smb */
|
||||
if (strncmp(cwd, smbw_prefix, len-1) == 0 &&
|
||||
cwd[len-1] == 0) {
|
||||
goto success;
|
||||
}
|
||||
|
||||
if (strncmp(cwd,smbw_prefix,strlen(smbw_prefix))) {
|
||||
if (real_chdir(cwd) == 0) {
|
||||
goto success;
|
||||
}
|
||||
errno = ENOENT;
|
||||
@ -398,16 +405,18 @@ int smbw_chdir(const char *name)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
DEBUG(4,("set SMBW_CWD2 to %s\n", cwd));
|
||||
pstrcpy(smb_cwd, cwd);
|
||||
if (setenv(SMBW_PWD_ENV, smb_cwd, 1)) {
|
||||
success:
|
||||
|
||||
DEBUG(4,("set SMBW_CWD to %s\n", cwd));
|
||||
|
||||
pstrcpy(smbw_cwd, cwd);
|
||||
if (setenv(SMBW_PWD_ENV, smbw_cwd, 1)) {
|
||||
DEBUG(4,("setenv failed\n"));
|
||||
}
|
||||
|
||||
/* we don't want the old directory to be busy */
|
||||
real_chdir("/");
|
||||
|
||||
success:
|
||||
smbw_busy--;
|
||||
return 0;
|
||||
|
||||
@ -549,7 +558,7 @@ char *smbw_getcwd(char *buf, size_t size)
|
||||
smbw_busy++;
|
||||
|
||||
if (!buf) {
|
||||
if (size <= 0) size = strlen(smb_cwd)+1;
|
||||
if (size <= 0) size = strlen(smbw_cwd)+1;
|
||||
buf = (char *)malloc(size);
|
||||
if (!buf) {
|
||||
errno = ENOMEM;
|
||||
@ -558,13 +567,13 @@ char *smbw_getcwd(char *buf, size_t size)
|
||||
}
|
||||
}
|
||||
|
||||
if (strlen(smb_cwd) > size-1) {
|
||||
if (strlen(smbw_cwd) > size-1) {
|
||||
errno = ERANGE;
|
||||
smbw_busy--;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
safe_strcpy(buf, smb_cwd, size);
|
||||
safe_strcpy(buf, smbw_cwd, size);
|
||||
|
||||
smbw_busy--;
|
||||
return buf;
|
||||
|
Loading…
x
Reference in New Issue
Block a user