[Glass] FFI and C subsystems
bruno buzzi brassesco
smalltalk at adinet.com.uy
Thu Nov 26 10:01:31 PST 2020
Martin/James,
Thank for your answers.
We are implementing a SSH Server (with SFTP also). The sftp.h header
implement all related stuff to SFTP but if you load:
CHeader path: '/usr/include/libssh/sftp.h'.
Then you have the SFTP stuff but not the server capabilities. And if you
load server.h header:
CHeader path: '/usr/include/libssh/server.h'.
Then you have the Server stuff but not the SFTP.
And there is almost no documentation for the server part.
(the SSH and SFTP client are working ok)
So i did this kind of workaround to have both in the same GS wrapper.
I did this because i was not sure if i can combine calls of two
different wrapper in GS.
For example if i generate a sshSession (aCPointer) from
LibsshServerWrapper (server.h) then Can i use it (aCPointer) as argument
to call a function in LibsshSftpWrapper?
regards,
bruno
On 26/11/2020 14:42, Martin McClure wrote:
> Hi Bruno, James,
>
> libssh.so is one of the libraries that defines many functions, and the
> prototypes for those functions are spread over multiple header files.
>
> When I personally deal with such libraries in GemStone I tend to make
> one class per header file, since that seems a bit cleaner to me. The
> documentation for each function says which header to include, and that
> tells me which one of my classes to use.
>
> However, this is a matter of taste. Certainly it should work to
> include libssh.h and sftp.h into the same class, since the functions
> defined in both are for the same shared library. I don't know about
> server.h -- in my system the only headers with that name are unrelated
> to libssh.so.
>
> Regards,
> -Martin
>
> On 11/26/20 9:13 AM, James Foster via Glass wrote:
>> Bruno,
>>
>> Header files describe what is in a library. The “libssh.h” header
>> describes what is in the “libssh” library and the “sftp.h” header
>> describes what is in the “sftp” library. While you can create a new
>> header file that (wrongly) claims that function A is in library B,
>> that doesn’t mean that when we go to look for A in B that it will be
>> found.
>>
>> Just because I put down Casa Rosada as your address on my contact
>> list doesn’t make it so. I might mail a letter, but you won’t get it.
>> Just because you pretend that a function is in a library (making up a
>> new header) doesn’t make it so. You may be able to create the
>> Smalltalk wrapper, but when you call it the function won’t be found
>> because it isn’t in the library.
>>
>> The header file is simply a text file that describes what is in a
>> binary file. Changing the text file doesn’t change the binary file.
>>
>> James
>>
>>
>>> On Nov 26, 2020, at 9:01 AM, bruno buzzi brassesco
>>> <smalltalk at adinet.com.uy <mailto:smalltalk at adinet.com.uy>> wrote:
>>>
>>> James,
>>>
>>> The new header files does not have any function declaration only
>>> "#includes" sentences.
>>>
>>> Actually the entire new header files is:
>>> #include "libssh.h"
>>> #include "server.h"
>>> #include "sftp.h"
>>>
>>> So i do not see how a lookup will fail. But again maybe I'm missing
>>> something :)
>>>
>>> regards,
>>> bruno
>>>
>>> On 26/11/2020 13:21, Smalltalk at JGFoster.net wrote:
>>>> Bruno,
>>>>
>>>> If it works, then it may be fine, but I’ll be somewhat surprised if
>>>> that happens. My vague idea of the way a program interacts with a
>>>> shared library is as follows: (1) you ask the OS to load a library
>>>> (such as '/usr/lib64/libssh.so.4.4.0’ and the OS give you back a
>>>> ‘handle’ to that library; (2) you ask the OS to look up a function
>>>> in the library (you pass a string with the function name and you
>>>> pass in the previously returned handle) and the OS give you back a
>>>> pointer to a function in that library; (3) you use the pointer to
>>>> call the function. These are the steps that GemStone handles; you
>>>> will have previously created an object that encapsulates the
>>>> function name, parameter types, and return types.
>>>>
>>>> If you use the wrong header to generate a list of expected entry
>>>> points in a library, then the Smalltalk code will still be
>>>> generated and you can still load the library (step 1), but when you
>>>> attempt to lookup a function from library A in library B, the OS
>>>> will fail at step 2 since the function does not exist. I think that
>>>> if you want to call functions in two libraries, then you need to
>>>> load both libraries (step 1) and do the name lookup in the proper
>>>> library (step 2).
>>>>
>>>> But my expertise in this area is several years old and was on the
>>>> Smalltalk side not on the VM side.
>>>>
>>>> James
>>>>
>>>>> On Nov 26, 2020, at 4:42 AM, bruno buzzi brassesco via Glass
>>>>> <glass at lists.gemtalksystems.com
>>>>> <mailto:glass at lists.gemtalksystems.com>> wrote:
>>>>>
>>>>> James,
>>>>>
>>>>> It seems that is possible to create a new header file and includes
>>>>> 2 subsystems in the same GS Library.
>>>>>
>>>>> For example sftp_server_all.h:
>>>>> #include "libssh.h"
>>>>> #include "server.h"
>>>>> #include "sftp.h"
>>>>>
>>>>> Then:
>>>>> | header wrapperClass wrapper |
>>>>> header := CHeader path: 'sftp_server_all.h'.
>>>>> wrapperClass := header wrapperForLibraryAt:
>>>>> '/usr/lib64/libssh.so.4.4.0'.
>>>>> wrapperClass initializeFunctions.
>>>>> UserGlobals at: wrapperClass name put: wrapperClass.
>>>>>
>>>>> Do you see any problem with this approach ?
>>>>>
>>>>> The new library generated all functions now i going to check if
>>>>> they work.
>>>>> It should work i think ... (but again not a C expert -dealing with
>>>>> C again after 15 years-)
>>>>>
>>>>>
>>>>>
>>>>> regards,
>>>>> Bruno
>>>>>
>>>>> On 9/10/2020 14:53, James Foster via Glass wrote:
>>>>>> Bruno,
>>>>>>
>>>>>> My understanding is that the header parser follows all the
>>>>>> #include directives, so will find everything that could be called
>>>>>> from C code, including abs() in libc. But the process of calling
>>>>>> a dynamic library at runtime involves doing a name lookup of
>>>>>> entry points *for that library,* not for anything visible *to*
>>>>>> the library, so libssh does not have an abs() entry point. For
>>>>>> that you would need a reference to libc.
>>>>>>
>>>>>> The wrapper generator does not know what is actually in the given
>>>>>> library, just what functions are defined by all included header
>>>>>> files. So you have to do some selection on your own. One wrapper
>>>>>> API has a filter as an argument, and so for a library like
>>>>>> GemStone C Interface where all the functions begin with ‘gci’ we
>>>>>> can filter to only generate wrappers for those functions (it is
>>>>>> unlikely that libc has gci*() functions!).
>>>>>>
>>>>>> So, yes, you need to have a different library object for each
>>>>>> library so the system can do name lookups properly.
>>>>>>
>>>>>> James
>>>>>>
>>>>>>> On Oct 9, 2020, at 5:40 AM, Bruno Buzzi Brassesco via Glass
>>>>>>> <glass at lists.gemtalksystems.com
>>>>>>> <mailto:glass at lists.gemtalksystems.com>> wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>> Maybe i'm wrong in some concepts here (not a C expert) but ...
>>>>>>>
>>>>>>> If a C library (libssh) has a subsystem (sftp) in order to
>>>>>>> create a GS wrapper i can do:
>>>>>>>
>>>>>>> | header wrapperClass wrapper |
>>>>>>> header := CHeader path: '/usr/include/libssh/sftp.h'.
>>>>>>> wrapperClass := header wrapperForLibraryAt:
>>>>>>> '/usr/lib64/libssh.so.4.4.0'.
>>>>>>> wrapperClass initializeFunctions.
>>>>>>> UserGlobals at: wrapperClass name put: wrapperClass.
>>>>>>>
>>>>>>>
>>>>>>> In this case I got all the functions of Libssh and also SFTP, so
>>>>>>> far so good.
>>>>>>>
>>>>>>> But what happens when there is more than one C subsystem?
>>>>>>>
>>>>>>> How can I generate only one GS wrapper for the original C
>>>>>>> library (libssh) and all its subsystems ?
>>>>>>> Or I will have to create one wrapper per subsystem ?
>>>>>>>
>>>>>>> regards,
>>>>>>> bruno
>>>>>>> _______________________________________________
>>>>>>> Glass mailing list
>>>>>>> Glass at lists.gemtalksystems.com
>>>>>>> <mailto:Glass at lists.gemtalksystems.com>
>>>>>>> https://lists.gemtalksystems.com/mailman/listinfo/glass
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Glass mailing list
>>>>>> Glass at lists.gemtalksystems.com
>>>>>> https://lists.gemtalksystems.com/mailman/listinfo/glass
>>>>> _______________________________________________
>>>>> Glass mailing list
>>>>> Glass at lists.gemtalksystems.com <mailto:Glass at lists.gemtalksystems.com>
>>>>> https://lists.gemtalksystems.com/mailman/listinfo/glass
>>>>
>>
>>
>> _______________________________________________
>> Glass mailing list
>> Glass at lists.gemtalksystems.com
>> https://lists.gemtalksystems.com/mailman/listinfo/glass
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.gemtalksystems.com/mailman/private/glass/attachments/20201126/f7cf97f1/attachment-0001.htm>
More information about the Glass
mailing list