Page 1 of 1

Properly load lua c library (.dll)?

Posted: 13 Mar 2013 13:12
by snark.real
Hello there! I'm trying to make use of luasocket library in my lua script by loading windows dll's with require('socket')
Plugin code is following:

Code: Select all

function descriptor() return { title = "test", version = "0.1", capabilities = { "input-listener", "playing-listener" }, } end socket = require("socket") function activate() print("activated") end function deactivate() print("deactivated") end

Directory structure in lua/extensions:

Code: Select all

. |-- plugin.lua |-- modules | |-- lua | | |-- ltn12.lua | | |-- mime.lua | | |-- socket | | | |-- ftp.lua | | | |-- http.lua | | | |-- smtp.lua | | | |-- tp.lua | | | `-- url.lua | | `-- socket.lua | |-- lua5.1.dll | |-- lua5.1.exe | |-- mime | | `-- core.dll | `-- socket | `-- core.dll
And here is the output:

Code: Select all

[02097680] lua generic debug: Activating extension 'test' [02097680] lua generic warning: Error loading script C:\Program Files (x86)\Vide oLAN\VLC\lua\extensions\plugin.lua: ...Files (x86)\VideoLAN\VLC\lua\extensions \plugin.lua:43: module 'socket' not found: no field package.preload['socket'] no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\modules\socket.luac' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\modules\socket.lua' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\modules\socket.vle' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\extensions\modules\socket.luac' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\extensions\modules\socket.lua' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\extensions\modules\socket.vle' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\modules\socket.luac' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\modules\socket.lua' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\modules\socket.vle' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\extensions\modules\socket.luac' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\extensions\modules\socket.lua' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\extensions\modules\socket.vle' no file '.\socket.lua' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\socket.lua' no file 'C:\Program Files (x86)\VideoLAN\VLC\lua\socket\init.lua' no file 'C:\Program Files (x86)\VideoLAN\VLC\socket.lua' no file 'C:\Program Files (x86)\VideoLAN\VLC\socket\init.lua' no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.luac' no file '.\socket.dll' no file 'C:\Program Files (x86)\VideoLAN\VLC\socket.dll' no file 'C:\Program Files (x86)\VideoLAN\VLC\loadall.dll' [02097680] lua generic error: Could not activate extension! [02097680] lua generic debug: Deactivating 'test' [02097680] lua generic debug: Extension thread end: 'test'
Could you please explain module loading mechanism of VLC?
What am I doing wrong? Could there be some workaround?

Re: Properly load lua c library (.dll)?

Posted: 13 Mar 2013 14:09
by Jean-Baptiste Kempf
no file 'C:\Program Files (x86)\VideoLAN\VLC\socket.dll'

Re: Properly load lua c library (.dll)?

Posted: 13 Mar 2013 21:59
by snark.real
Oh, forgot to mention I've tried to:
* take modules/socket/core.dll
* rename it to socket.dll
* copy to 'C:\Program Files (x86)\VideoLAN\VLC\socket.dll'

Not sure if it's sane, thought :\ There is probably reason they have arranged luasocket library in such way.

And it gives me

Code: Select all

lua warning: Error loading script C:\Program Files (x86)\VideoLAN\VLC\lua\extensions\plugin.lua: error loading module 'socket' from file 'C:\Program Files (x86)\VideoLAN\VLC\socket.dll': The specified procedure could not be found.
Could you please explain, what does it mean? Which procedure it is searching for?

Library is taken from here, by the way http://files.luaforge.net/releases/luas ... 32-vc6.zip if it's important.
I've also tried the same procedure for vs8 build from the same place (http://files.luaforge.net/releases/luas ... cket-2.0.2), with no luck.

Re: Properly load lua c library (.dll)?

Posted: 14 Mar 2013 00:26
by snark.real
Woah! I've solved my problem by placing files in following order:

Code: Select all

VideoLAN\VLC |-- mime | |-- core.dll `-- socket `-- core.dll VideoLAN\VLC\lua\extensions\ |-- plugin.lua |-- modules | |-- ltn12.lua | |-- mime.lua | |-- socket | | |-- ftp.lua | | |-- http.lua | | |-- smtp.lua | | |-- tp.lua | | `-- url.lua | `-- socket.lua
So, for all of those who wanted udp server available in lua - this is one of the solutions. Have fun :)

Re: Properly load lua c library (.dll)?

Posted: 17 Mar 2013 07:45
by Jean-Baptiste Kempf
Btw, why not exporting VLC functions?

Re: Properly load lua c library (.dll)?

Posted: 17 Mar 2013 17:45
by snark.real
Btw, why not exporting VLC functions?
Honestly, I have tried using them, but with no luck.
Because I wanted simple "autodiscover in LAN" feature. And I got this feature done by using broadcast udp packets. As far as I know, vlc supports only tcp and tcp is only unicast.
There is only one problem to overcome left, but it's not very important anyway, and I hope to post code of my extension soon.

By the way, total size of luasocket distribution is 119.5 kB. 57.3 kB of which are dll libraries. If it's in your responsibility, please reconsider adding it to VLC distribution.
Well, if it's not possible, I can understand you.
Even if it will be some another implementation of udp in lua, something like vlc.net.listen_udp('addr', port) - that would be great too. Just remember about broadcast option ;)

Reasoning of the points above is because I think it's not nice to distribute binary libraries with lua extension. And quite plenty of people need udp.
AFAIK, if in windows, binaries in distribution is not ok, it's still acceptable.
But in linux it's not acceptable at all. If VLC is looking for libraries only in standart PATH's, you will need to 1)put them with escalated privilegies 2)possibly blow up existing system library.
And I'm not even aware of situation in MacOS.

So, that's the way the cookie crumbles :)

Re: Properly load lua c library (.dll)?

Posted: 26 Mar 2013 02:16
by snark.real
Hello again!

I've faced some strange problem in archlinux with lua51-socket-2.0.2-5 library package
When I run lua5.1 interpreter, it loads luasocket correctly:

Code: Select all

Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio > print(_VERSION) Lua 5.1 > socket = require("socket")
But when I put the same

Code: Select all

socket = require("socket")
in my plugin, VLC gives me

Code: Select all

[0x7f792c09e418] lua generic warning: Error loading script /home/snark/.local/share/vlc/lua/extensions/plugin.lua: error loading module 'socket.core' from file '/usr/lib/lua/5.1/socket/core.so': /usr/lib/lua/5.1/socket/core.so: undefined symbol: lua_gettop [0x7f792c09e418] lua generic error: Could not activate extension!
although I tested that VLC uses lua 5.1.
BTW, my VLC is version "2.0.5 Twoflower"

That's a mystery for me. Could you, pretty please explain and suggest workaround?

Re: Properly load lua c library (.dll)?

Posted: 17 Apr 2013 17:36
by RĂ©mi Denis-Courmont
It looks to me that your core.so is not linked properly. To get the lua_gettop() symbol, it should link explicitly against liblua5.1.