mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Morten Welinder <mwelinder@gmail.com>
To: musl@lists.openwall.com
Subject: Re: [PATCH] stdio: implement fopencookie(3)
Date: Tue, 10 Oct 2017 18:58:30 -0400	[thread overview]
Message-ID: <CANv4PNm0owrMKgCETkyBXQ=ZkNhjyir+k5WJMX=uFTspRCcE_A@mail.gmail.com> (raw)
In-Reply-To: <20171010205654.GJ1627@brightrain.aerifal.cx>

> Also note that while standard functions in POSIX can additionally be
> defined as function-like macros, they can't be object-like macros, so
> (*read), etc. are safe due to the parentheses.

I'm not sure that's true.  Solaris defines (or used to, at least),
say, "open" to "open64" under the right conditions.  With that, actual
field names in the structure ends up being dependent on #include
order.  Quite a mess and worse for "stat" since "struct stat" gets
renamed in addition to the function.

"#define open my_table.my_open" would be fun too.  I haven't seen that
in the wild, though.

M.






On Tue, Oct 10, 2017 at 4:56 PM, Rich Felker <dalias@libc.org> wrote:
> On Tue, Oct 10, 2017 at 08:51:17PM +0200, Jens Gustedt wrote:
>> Hello William,
>>
>> On Tue, 10 Oct 2017 18:03:56 +0000 William Pitcock
>> <nenolod@dereferenced.org> wrote:
>>
>> > The fopencookie(3) function allows the programmer to create a custom
>> > stdio implementation, using four hook functions which operate on a
>> > "cookie" data type.
>>
>> I know it is not your fault, but the naming conventions in this new
>> interface are realy bad design.
>>
>> > +typedef struct {
>> > +   ssize_t (*read)(void *cookie, char *buf, size_t size);
>> > +   ssize_t (*write)(void *cookie, const char *buf, size_t size);
>> > +   int (*seek)(void *cookie, off_t *offset, int whence);
>> > +   int (*close)(void *cookie);
>> > +} cookie_io_functions_t;
>>
>> > +FILE *fopencookie(void *cookie, const char *mode, cookie_io_functions_t io_funcs);
>>
>> The members may clash with macro names. E.g an implementation would be
>> allowed to overload "close" with a macro. This is not possible if the
>> implementation would want to use this interface here at the same time.
>>
>> User code could legitimately want to use a macro "seek" for its own
>> purpose.
>>
>> Could you at least avoid to use user-space names as function
>> parameters? Here you should just omit cookie, buf, size, offset,
>> whence, mode and io_funcs. I think in musl parameters in prototypes
>> usually don't have names. If you think that we should have them (they
>> sort of document the interface) you should put them into a reserved
>> namespace with leading underscore or so, or at least prefix them with
>> cookie_
>
> I agree with most of the principles here (esp. how bad the public
> interface of this function is), but there's not a whole lot that can
> be done. Your one request is reasonable and in fact mandatory for musl
> header policy: we do not use parameter named at all in prototypes. So
> it should read just:
>
> FILE *fopencookie(void *, const char *, cookie_io_functions_t);
>
> Also note that while standard functions in POSIX can additionally be
> defined as function-like macros, they can't be object-like macros, so
> (*read), etc. are safe due to the parentheses.
>
> Rich


  parent reply	other threads:[~2017-10-10 22:58 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-10 18:03 William Pitcock
2017-10-10 18:51 ` Jens Gustedt
2017-10-10 20:56   ` Rich Felker
2017-10-10 21:40     ` Jens Gustedt
2017-10-11  2:08       ` Rich Felker
2017-10-11  5:51         ` Jens Gustedt
2017-10-10 22:58     ` Morten Welinder [this message]
2017-10-11  2:09       ` Rich Felker
  -- strict thread matches above, loose matches on Subject: below --
2017-10-10 23:27 William Pitcock
2017-10-05  6:48 William Pitcock
2017-10-05 10:10 ` Szabolcs Nagy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CANv4PNm0owrMKgCETkyBXQ=ZkNhjyir+k5WJMX=uFTspRCcE_A@mail.gmail.com' \
    --to=mwelinder@gmail.com \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).