summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/client.h1
-rw-r--r--source3/libsmb/clilist.c18
-rw-r--r--source3/libsmb/clistr.c7
-rw-r--r--source3/utils/masktest.c13
4 files changed, 24 insertions, 15 deletions
diff --git a/source3/include/client.h b/source3/include/client.h
index 1296b03370..ddfc65db32 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -35,6 +35,7 @@
#define CLISTR_CONVERT 2
#define CLISTR_UPPER 4
#define CLISTR_ASCII 8
+#define CLISTR_UNICODE 16
/*
* These definitions depend on smb.h
diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c
index eccf3c553a..175673d4fe 100644
--- a/source3/libsmb/clilist.c
+++ b/source3/libsmb/clilist.c
@@ -133,10 +133,14 @@ static int interpret_long_filename(struct cli_state *cli,
p += 4; /* EA size */
slen = SVAL(p, 0);
p += 2;
- clistr_pull(cli, finfo->short_name, p,
- sizeof(finfo->short_name),
- 24,
- CLISTR_CONVERT);
+ {
+ /* stupid NT bugs. grr */
+ int flags = CLISTR_CONVERT;
+ if (p[1] == 0 && namelen > 1) flags |= CLISTR_UNICODE;
+ clistr_pull(cli, finfo->short_name, p,
+ sizeof(finfo->short_name),
+ 24, flags);
+ }
p += 24; /* short name? */
clistr_pull(cli, finfo->name, p,
sizeof(finfo->name),
@@ -159,8 +163,7 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute,
void (*fn)(file_info *, const char *, void *), void *state)
{
int max_matches = 512;
- /* NT uses 260, OS/2 uses 2. Both accept 1. */
- int info_level = cli->protocol<PROTOCOL_NT1?1:260;
+ int info_level;
char *p, *p2;
pstring mask;
file_info finfo;
@@ -179,6 +182,9 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute,
uint16 setup;
pstring param;
+ /* NT uses 260, OS/2 uses 2. Both accept 1. */
+ info_level = (cli->capabilities&CAP_NT_SMBS)?260:1;
+
pstrcpy(mask,Mask);
while (ff_eos == 0) {
diff --git a/source3/libsmb/clistr.c b/source3/libsmb/clistr.c
index 52137d9f78..1835e15971 100644
--- a/source3/libsmb/clistr.c
+++ b/source3/libsmb/clistr.c
@@ -103,6 +103,7 @@ cli->capabilities) to a char* destination
flags can have:
CLISTR_CONVERT means convert from dos to unix codepage
CLISTR_TERMINATE means the string in src is null terminated
+ CLISTR_UNICODE means to force as unicode
if CLISTR_TERMINATE is set then src_len is ignored
src_len is the length of the source area in bytes
return the number of bytes occupied by the string in src
@@ -115,12 +116,12 @@ int clistr_pull(struct cli_state *cli, char *dest, const void *src, int dest_len
dest_len = sizeof(pstring);
}
- if (clistr_align(cli, PTR_DIFF(cli->inbuf, src))) {
+ if (clistr_align(cli, PTR_DIFF(src, cli->inbuf))) {
src++;
if (src_len > 0) src_len--;
}
- if (!(cli->capabilities & CAP_UNICODE)) {
+ if (!(flags & CLISTR_UNICODE) && !(cli->capabilities & CAP_UNICODE)) {
/* the server doesn't want unicode */
if (flags & CLISTR_TERMINATE) {
safe_strcpy(dest, src, dest_len);
@@ -159,7 +160,7 @@ if src_len is -1 then assume the source is null terminated
****************************************************************************/
int clistr_pull_size(struct cli_state *cli, const void *src, int src_len)
{
- if (clistr_align(cli, PTR_DIFF(cli->inbuf, src))) {
+ if (clistr_align(cli, PTR_DIFF(src, cli->inbuf))) {
src++;
if (src_len > 0) src_len--;
}
diff --git a/source3/utils/masktest.c b/source3/utils/masktest.c
index 9a4d7156b4..c1e27c564c 100644
--- a/source3/utils/masktest.c
+++ b/source3/utils/masktest.c
@@ -39,13 +39,12 @@ int ms_fnmatch_lanman_core(char *pattern, char *string)
char *p = pattern, *n = string;
char c;
- // printf("ms_fnmatch_lanman_core(%s, %s)\n", pattern, string);
+ // printf("ms_fnmatch_lanman_core(%s, %s)\n", pattern, string);
while ((c = *p++)) {
switch (c) {
case '?':
- if (*n == 0 && ms_fnmatch_lanman_core(p, n) == 0) return 0;
- if (! *n && !*p) return 0;
+ if (! *n) return ms_fnmatch_lanman_core(p, n);
n++;
break;
@@ -124,13 +123,13 @@ static BOOL reg_match_one(char *pattern, char *file)
/* oh what a weird world this is */
if (old_list && strcmp(pattern, "*.*") == 0) return True;
+ if (strcmp(file,"..") == 0) file = ".";
+ if (strcmp(pattern,".") == 0) return False;
+
if (max_protocol <= PROTOCOL_LANMAN2) {
return ms_fnmatch_lanman(pattern, file)==0;
}
- if (strcmp(file,"..") == 0) file = ".";
- if (strcmp(pattern,".") == 0) return False;
-
return ms_fnmatch(pattern, file)==0;
}
@@ -263,6 +262,8 @@ void listfn(file_info *f, const char *s, void *state)
static void get_real_name(struct cli_state *cli,
pstring long_name, fstring short_name)
{
+ /* nasty hack to force level 260 listings - tridge */
+ cli->capabilities |= CAP_NT_SMBS;
if (max_protocol <= PROTOCOL_LANMAN1) {
cli_list_new(cli, "\\masktest\\*.*", aHIDDEN | aDIR, listfn, NULL);
} else {