* Coding access to a C's pointer - pointer
@ 2020-06-06 16:23 Bob Goddard
2020-06-06 16:50 ` Luke A. Guest
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Bob Goddard @ 2020-06-06 16:23 UTC (permalink / raw)
I'm trying to shoehorn net-snmp into an Ada conversion and I've hit a roadblock.
snmp_synch_response requires a pointer to a pointer:
snmp_synch_response(netsnmp_session *, netsnmp_pdu *, netsnmp_pdu **)
Just how the heck do you code that? You can't just declare a System.Address.
Would I need to drop into C and handle it there?
B
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 16:23 Coding access to a C's pointer - pointer Bob Goddard
@ 2020-06-06 16:50 ` Luke A. Guest
2020-06-06 16:59 ` Niklas Holsti
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: Luke A. Guest @ 2020-06-06 16:50 UTC (permalink / raw)
On 06/06/2020 17:23, Bob Goddard wrote:
> I'm trying to shoehorn net-snmp into an Ada conversion and I've hit a roadblock.
>
> snmp_synch_response requires a pointer to a pointer:
> snmp_synch_response(netsnmp_session *, netsnmp_pdu *, netsnmp_pdu **)
>
> Just how the heck do you code that? You can't just declare a System.Address.
>
> Would I need to drop into C and handle it there?
Yup, C's pointer crap is horrible in Ada.
Essentially, you need to create your types netsnmp_session and netsnmp_pdu.
Let's assume your package name is SNMP.
type Session is null record with
Convention => C; -- You may has this as an actual full record for al I
know.
You can probably get away with * parameters as "in out" parameters in
the Ada function.
You can do ** by creating a C convention access type to PDU and then
another to that.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 16:23 Coding access to a C's pointer - pointer Bob Goddard
2020-06-06 16:50 ` Luke A. Guest
@ 2020-06-06 16:59 ` Niklas Holsti
2020-06-06 17:01 ` Dmitry A. Kazakov
2020-06-06 20:20 ` Jeffrey R. Carter
3 siblings, 0 replies; 10+ messages in thread
From: Niklas Holsti @ 2020-06-06 16:59 UTC (permalink / raw)
On 2020-06-06 19:23, Bob Goddard wrote:
> I'm trying to shoehorn net-snmp into an Ada conversion and I've hit a roadblock.
>
> snmp_synch_response requires a pointer to a pointer:
> snmp_synch_response(netsnmp_session *, netsnmp_pdu *, netsnmp_pdu **)
>
> Just how the heck do you code that? You can't just declare a System.Address.
Declare the parameter type as "access netsnmp_pdu" and its mode as
"access" or "in out" or "out", depending on what snmp_synch_response
actually does with the parameter. The mode gets you one C '*' and the
access type gets you the second '*'.
See RM B.3(68).
--
Niklas Holsti
niklas holsti tidorum fi
. @ .
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 16:23 Coding access to a C's pointer - pointer Bob Goddard
2020-06-06 16:50 ` Luke A. Guest
2020-06-06 16:59 ` Niklas Holsti
@ 2020-06-06 17:01 ` Dmitry A. Kazakov
2020-06-06 17:34 ` Bob Goddard
2020-06-06 20:20 ` Jeffrey R. Carter
3 siblings, 1 reply; 10+ messages in thread
From: Dmitry A. Kazakov @ 2020-06-06 17:01 UTC (permalink / raw)
On 06/06/2020 18:23, Bob Goddard wrote:
> I'm trying to shoehorn net-snmp into an Ada conversion and I've hit a roadblock.
>
> snmp_synch_response requires a pointer to a pointer:
> snmp_synch_response(netsnmp_session *, netsnmp_pdu *, netsnmp_pdu **)
> Just how the heck do you code that? You can't just declare a System.Address.
That depends on the semantics because in C you cannot tell in from out.
Assuming that snmp_synch_response returns a pointer to PDU and that
netsnmp_session and netsnmp_pdu are record types:
type netsnmp_pdu_Ptr is access all netsnmp_pdu;
paragma Convention (C, netsnmp_pdu_Ptr);
procedure snmp_synch_response
( Session : netsnmp_session;
Request : netsnmp_pdu;
Response : out netsnmp_pdu_Ptr -- Who manages the target?
);
You must carefully read the documentation and probably the sources to
determine who manages the returned object.
Some libraries return pointers to internally allocated and freed memory
others require the caller to deallocate the object at the returned
point. C is a mess.
> Would I need to drop into C and handle it there?
P.S. Why do not you implement SNMP instead of using alien library? SNMP
is not rocket science.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 17:01 ` Dmitry A. Kazakov
@ 2020-06-06 17:34 ` Bob Goddard
2020-06-06 18:48 ` Dmitry A. Kazakov
0 siblings, 1 reply; 10+ messages in thread
From: Bob Goddard @ 2020-06-06 17:34 UTC (permalink / raw)
On Saturday, 6 June 2020 18:01:41 UTC+1, Dmitry A. Kazakov wrote:
[...]
> > Would I need to drop into C and handle it there?
>
> P.S. Why do not you implement SNMP instead of using alien library? SNMP
> is not rocket science.
I think everyone feels my pain, and at the moment, life is too short to re-implement snmp. Net-snmp code can only be describe as how not to write an application and how not to write documentation.
Anyways... I had already done the following and created the pdu record:
function SNMP_Synch_Response (Session : access snmp_Session; PDU : access snmp_pdu; Response : System.Address) return Interfaces.C.int;
pragma Import (C, SNMP_Synch_Response, "snmp_synch_response");
I'll still look...
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 17:34 ` Bob Goddard
@ 2020-06-06 18:48 ` Dmitry A. Kazakov
0 siblings, 0 replies; 10+ messages in thread
From: Dmitry A. Kazakov @ 2020-06-06 18:48 UTC (permalink / raw)
On 06/06/2020 19:34, Bob Goddard wrote:
> On Saturday, 6 June 2020 18:01:41 UTC+1, Dmitry A. Kazakov wrote:
> [...]
>>> Would I need to drop into C and handle it there?
>>
>> P.S. Why do not you implement SNMP instead of using alien library? SNMP
>> is not rocket science.
>
> I think everyone feels my pain, and at the moment, life is too short to re-implement snmp. Net-snmp code can only be describe as how not to write an application and how not to write documentation.
And that is the reason to believe the rest of it is fine?
> Anyways... I had already done the following and created the pdu record:
> function SNMP_Synch_Response (Session : access snmp_Session; PDU : access snmp_pdu; Response : System.Address) return Interfaces.C.int;
> pragma Import (C, SNMP_Synch_Response, "snmp_synch_response");
No need in access, C records are always passed by reference. No need in
Address, use access to a named access:
Session : snmp_Session;
PDU : snmp_pdu;
Response : access snmp_pdu_Ptr
or (in Ada 2012 with function out parameters support)
Response : out snmp_pdu_Ptr
The rules of thumb when writing C bindings:
Type Mode Ada C
non-scalar any T *T
scalar in T T
scalar out T *T
scalar in out T *T
So, if you want **T, define a named access type with C convention:
type T_Ptr is access all T;
pragma Convention (C, T_Ptr);
This is a scalar type, so **T would be
Response : out T_Ptr
or
Response : access T_Ptr
or you can declare a yet another access type:
type T_Ptr_Ptr is access all T_Ptr;
pragma Convention (C, T_Ptr_Ptr);
and then use
Response : T_Ptr_Ptr
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 16:23 Coding access to a C's pointer - pointer Bob Goddard
` (2 preceding siblings ...)
2020-06-06 17:01 ` Dmitry A. Kazakov
@ 2020-06-06 20:20 ` Jeffrey R. Carter
2020-06-06 20:51 ` Björn Lundin
2020-06-06 20:55 ` Jeffrey R. Carter
3 siblings, 2 replies; 10+ messages in thread
From: Jeffrey R. Carter @ 2020-06-06 20:20 UTC (permalink / raw)
On 6/6/20 6:23 PM, Bob Goddard wrote:
> I'm trying to shoehorn net-snmp into an Ada conversion and I've hit a roadblock.
I'm pretty sure that AWS and maybe Kazakov's Simple Components have support for
SNMP. Why not look at them?
--
Jeff Carter
"I like it when the support group complains that they have
insufficient data on mean time to repair bugs in Ada software."
Robert I. Eachus
91
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 20:20 ` Jeffrey R. Carter
@ 2020-06-06 20:51 ` Björn Lundin
2020-06-06 20:55 ` Jeffrey R. Carter
1 sibling, 0 replies; 10+ messages in thread
From: Björn Lundin @ 2020-06-06 20:51 UTC (permalink / raw)
Den 2020-06-06 kl. 22:20, skrev Jeffrey R. Carter:
> On 6/6/20 6:23 PM, Bob Goddard wrote:
>> I'm trying to shoehorn net-snmp into an Ada conversion and I've hit a
>> roadblock.
>
> I'm pretty sure that AWS and maybe Kazakov's Simple Components have
> support for SNMP. Why not look at them?
>
I think AWS has SMTP - not SNMP
--
Björn
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 20:20 ` Jeffrey R. Carter
2020-06-06 20:51 ` Björn Lundin
@ 2020-06-06 20:55 ` Jeffrey R. Carter
2020-06-07 7:29 ` Dmitry A. Kazakov
1 sibling, 1 reply; 10+ messages in thread
From: Jeffrey R. Carter @ 2020-06-06 20:55 UTC (permalink / raw)
On 6/6/20 10:20 PM, Jeffrey R. Carter wrote:
>
> I'm pretty sure that AWS and maybe Kazakov's Simple Components have support for
> SNMP. Why not look at them?
Sorry, I realize I misread your post (even though I typed what you had and not
what I thought I'd read). Please ignore.
--
Jeff Carter
"I like it when the support group complains that they have
insufficient data on mean time to repair bugs in Ada software."
Robert I. Eachus
91
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Coding access to a C's pointer - pointer
2020-06-06 20:55 ` Jeffrey R. Carter
@ 2020-06-07 7:29 ` Dmitry A. Kazakov
0 siblings, 0 replies; 10+ messages in thread
From: Dmitry A. Kazakov @ 2020-06-07 7:29 UTC (permalink / raw)
On 06/06/2020 22:55, Jeffrey R. Carter wrote:
> On 6/6/20 10:20 PM, Jeffrey R. Carter wrote:
>>
>> I'm pretty sure that AWS and maybe Kazakov's Simple Components have
>> support for SNMP. Why not look at them?
>
> Sorry, I realize I misread your post (even though I typed what you had
> and not what I thought I'd read). Please ignore.
I do not have SNMP implemented. Though I have an implementation of OIDs.
SNMP v1/2 is basically a single read request. SNMP v3 adds some sort of
authentication with views to provide security I did not look at this.
P.S. SNMP represents a dilema. It is either primitive low level: read
garbage deal with that yourself, or a huge monstrosity if you wanted the
client to understand millions of predefined OIDs and map them onto
properly typed Ada variables.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2020-06-07 7:29 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-06 16:23 Coding access to a C's pointer - pointer Bob Goddard
2020-06-06 16:50 ` Luke A. Guest
2020-06-06 16:59 ` Niklas Holsti
2020-06-06 17:01 ` Dmitry A. Kazakov
2020-06-06 17:34 ` Bob Goddard
2020-06-06 18:48 ` Dmitry A. Kazakov
2020-06-06 20:20 ` Jeffrey R. Carter
2020-06-06 20:51 ` Björn Lundin
2020-06-06 20:55 ` Jeffrey R. Carter
2020-06-07 7:29 ` Dmitry A. Kazakov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox