I made my own which works so far :)
Just do
m_pURLEncode = new Replace( "%", "%25" );
fd = smbc_open( m_pURLEncode->Translate(ossSMBURL.str()).c_str(),
O_RDONLY, 0 );
So I just replace all % with %25 which is the code for % and you
should be ok.
Cheers,
henrik
10 maj 2007 kl. 16:06 skrev Mattieu Puel:
hi all,
I have a strange problem using the libsmbclient..
retrieving or stating files named with percents in is for some
of them impossible. Example: a file located at "smb://test/test/%
7C2.txt" cannot be retrieved
with my code, smbc_open fails with the code
NT_STATUS_OBJECT_NAME_INVALID. I have not found
on the web exemples of url encoding/decoding that would escape
strings with "percent" in..
At the same time under the same constraints, a file named 'whatever-
you-want-except-with-percent'
is correctly stated, opened, read.
I tested the code on several distributions (debian, gentoo..) with
the same results. I tried
with several CIFS servers too (Win Xp, linux...). Attached: the source
and the trace given by smbc_init with debug = 9.
Has anyone any idea ?
the code:
----------------------------------------------------------------------
----------------
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <libsmbclient.h>
static void
get_auth_data_fn(const char * pServer,
const char * pShare,
char * pWorkgroup,
int maxLenWorkgroup,
char * pUsername,
int maxLenUsername,
char * pPassword,
int maxLenPassword)
{
sprintf( pWorkgroup, "%s", "WG" );
sprintf( pUsername, "%s", "test" );
sprintf( pPassword, "%s", "test" );
}
int main(int argc, char * argv[])
{
int fd;
int ret;
int debug = 9;
int savedErrno;
char buffer[2048];
char * pSmbPath = NULL;
if (argc == 2)
{
pSmbPath = argv[1];
}
else
{
printf("usage: "
"%s [ smb://path/to/file ]\n",
argv[0]);
return 1;
}
smbc_init(get_auth_data_fn, debug);
printf("Open file %s\n", pSmbPath);
if ((fd = smbc_open(pSmbPath, O_RDONLY, 0)) < 0)
{
perror("smbc_open");
return 1;
}
do
{
ret = smbc_read(fd, buffer, sizeof(buffer));
savedErrno = errno;
if (ret > 0) fwrite(buffer, 1, ret, stdout);
} while (ret > 0);
smbc_close(fd);
if (ret < 0)
{
errno = savedErrno;
perror("read");
return 1;
}
return 0;
}
----------------------------------------------------------------------
--------
the tail of the trace:
Server connect ok: //regis/dossier: 0x8050508
write_socket(4,88)
write_socket(4,88) wrote 88
size=35
smb_com=0x2d
smb_rcls=51
smb_reh=0
smb_err=49152
smb_flg=136
smb_flg2=51201
smb_tid=2048
smb_pid=13079
smb_uid=2048
smb_mid=5
smt_wct=0
smb_bcc=0
smbc errno NT_STATUS_OBJECT_NAME_INVALID -> 22
smbc_open: Argument invalide
Open file smb://regis/dossier/a%7C2.txt
--
Mattieu PUEL
Recherche & développement
--
Intradot Labs SAS
+33 4 78 80 87 90 | www.intradot.com
--
Intradot a déménagé !
Notez bien notre nouvelle adresse :
97 rue Racine - 69100 Villeurbanne
<trace>
--
To unsubscribe from this list go to the following URL and read the
instructions: https://lists.samba.org/mailman/listinfo/samba
--
To unsubscribe from this list go to the following URL and read the
instructions: https://lists.samba.org/mailman/listinfo/samba