[Mono-dev] P/Invoking libsmbclient from OSX
Alfred Hall
ahall at ahall.org
Tue Dec 6 14:57:04 EST 2011
I actually used that library as a reference. My code also works fine
on linux, it's just OSX that's not working.
Cheers,
Alfred
On Tue, Dec 6, 2011 at 7:55 PM, Slide <slide.o.mix at gmail.com> wrote:
>
>
> On Tue, Dec 6, 2011 at 12:53 PM, Alfred Hall <ahall at ahall.org> wrote:
>>
>> Good afternoon!
>>
>> I have been trying to P/Invoke into libsmbclient on OSX 10.6 running
>> 64 bit kernel. I compile the samba library myself (version 3.6.0) with
>> -m32 and managed to get a simple stub working in C/C++:
>>
>> static void
>> auth_fn(const char *server, const char *share,
>> char *workgroup, int wgmaxlen, char *username, int unmaxlen,
>> char *password, int pwmaxlen)
>> {
>> }
>>
>> smbc_init(auth_fn, 10);
>> smbc_opendir("smb://myuser:mypass@192.168.x.x/c$");
>>
>> This works fine, then I created the P/Invokes:
>>
>> public static void SmbInit()
>> {
>> smbc_init(CallBackAuth, 0);
>> }
>>
>>
>> public static void CallBackAuth(IntPtr server,
>> IntPtr share,
>> IntPtr workgroup,
>> int wgmaxlen,
>> IntPtr username,
>> int unmaxlen,
>> IntPtr password,
>> int pwmaxlen)
>> {
>> Console.WriteLine("MeeMa");
>> }
>>
>> public delegate void SmbCGetAuthDataFn(IntPtr server,
>> IntPtr share,
>> IntPtr workgroup,
>> int wgmaxlen,
>> IntPtr username,
>> int unmaxlen,
>> IntPtr password,
>> int pwmaxlen);
>>
>>
>> [DllImport("libsmbclient")] extern internal static int
>> smbc_init(SmbCGetAuthDataFn callBackAuth, int debug);
>> [DllImport("libsmbclient")] extern internal static int
>> smbc_opendir([In, MarshalAs(UnmanagedType.LPStr)]string durl);
>>
>>
>> Then simple calling into:
>> SambaWrapper.SmbInit();
>>
>> SambaWrapper.smbc_opendir(@"smb://username:password@somehostname/someshare");
>>
>> Then I got this beautiful stacktrace here:
>> http://paste.pocoo.org/show/517187/. I have made sure it's calling
>> into the libsmbclient library I compiled and not the one that comes
>> with OSX. I have also tried
>> it against the one that comes with OSX but that one just blows up with
>> a different trace.
>>
>> I was debugging this with Alan on IRC today and we thought it might be
>> the delete being free'd but we tried adding a new smbc_init function
>> into smb that
>> looks like this:
>>
>> void
>> myauth_fn(const char *server, const char *share,
>> char *workgroup, int wgmaxlen, char *username, int unmaxlen,
>> char *password, int pwmaxlen)
>> {
>> }
>>
>> int
>> smbc_init2(int debug)
>> {
>> smbc_init(myauth_fn, debug);
>> smbc_opendir("smb://user:pass@192.168.212.133/c$");
>> }
>>
>> And then tried to P/Invoke smbc_init2 only and P/Invoke:
>>
>> [DllImport("libsmbclient", CallingConvention =
>> CallingConvention.Cdecl)] extern internal static int smbc_init2(int
>> debug);
>>
>> When calling into smbc_init2() it blows up with exactly the same
>> stacktrace. I tried again a C++ program that calls into smbc2_init()
>> and it worked fine.
>>
>> Anyone here got any idea how to proceed further with this?
>>
>> Many thanks,
>> Alfred
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
> Check out this library and see if your p/invoke is setup the same way.
>
> http://code.google.com/p/cifsclient/
>
> Thanks,
>
> slide
>
> --
> slide-o-blog
> http://slide-o-blog.blogspot.com/
More information about the Mono-devel-list
mailing list