Feature #4645

Pass existing buffer to getsockopt

Added by Brian Candler almost 3 years ago. Updated over 1 year ago.

[ruby-core:35999]
Status:Feedback
Priority:Normal
Assignee:-
Category:-
Target version:next minor

Description

There are cases when you need to pass a pre-initialized buffer to
getsockopt, but ruby currently doesn't support this.

For an example, see the API used by iptables to manipulate the firewall
rulesets (below). You have to set the table name in the buffer passed to
getsockopt; the call then modifies the remainder of the buffer.

So I propose that BasicSocket#getsockopt be enhanced to allow an optional
third parameter, which is an existing String buffer, used both to pass
data and receive the result.

Does this sound reasonable?

Regards, Brian.

-------- 8< ----------------------------------------------
/* extract from iptables-1.4.4/libiptc/libiptc.c */

struct xtchandle *
TC
INIT(const char *tablename)
{
STRUCTGETINFO info;
socklen
t s;
int sockfd;
...
s = sizeof(info);

    strcpy(info.name, tablename);
    if (getsockopt(sockfd, TC_IPPROTO, SO_GET_INFO, &info, &s) < 0) {
            close(sockfd);
            return NULL;
    }

    DEBUGP("valid_hooks=0x%08x, num_entries=%u, size=%u\n",
            info.valid_hooks, info.num_entries, info.size);

...

History

#1 Updated by Akira Tanaka almost 3 years ago

I think it is reasonable.

It also makes us possible to specify the buffer size.
Currently the buffer size for getsockopt is fixed. (256 bytes)

However I'd like to see actual good example for this feature.
It is great for the method document.

I searched Linux kernel for ".getsockopt" and "copyfromuser".
I guess SCTPSTATUS or IPMSFILTER can be a candidate.

Is there better example?

#2 Updated by Motohiro KOSAKI over 2 years ago

  • Status changed from Open to Feedback

#3 Updated by Yusuke Endoh over 1 year ago

  • Target version set to next minor

Also available in: Atom PDF