On Fri, Jan 7, 2011 at 10:50 PM, Mike Frysinger <[email protected]> wrote:
> On Saturday, January 08, 2011 00:57:14 Garrett Cooper wrote:
>> On Jan 7, 2011, at 11:08 AM, Garrett Cooper wrote:
>> > On Jan 7, 2011, at 6:36 AM, Cyril Hrubis wrote:
>> >> Hi!
>> >>
>> >>>   Ok -- good to note for next time I guess. I fixed all of the
>> >>>   compilation errors so now people can report runtime issues. There are
>> >>>   a handful of them.
>> >>
>> >> I still could not compile the latest git. I've got a bunch of:
>> >>
>> >> pipe declared with warn_unused_result
>> >> write declared with warn_unused_result
>> >> read declared with warn_unused_result
>> >
>> > Now you know why I used void casts in a few spots :). Some are of value,
>> > some are fud.
>>
>>       This has me thinking. Given that the patterns are basically the same, 
>> I'm
>> planning on writing some macros to add to include (say, safe_calls.h? I'm
>> not sold on the name, but if you have a better one I'm all ears :)..),
>> like the following:
>>
>> #define SAFE_WRITE(fildes, buf, nbyte, cleanup_fn) ({   \
>>         int __rval = write((fildes), (buf), (nbyte));   \
>>         if (__rval == -1)                               \
>>                 tst_brkm(TBROK|TERRNO, (cleanup_fn), "write failed at
>> %s:%d", __FILE__, __LINE__); \ __rval; \
>> })
>
> safe_write() is an OK name and ive seen people use it before.
>
> note that write() actually returns a ssize_t, and you should compare it to the
> requested write length.

    Yeah, good point. Silly me for using an int :).

> #define SAFE_WRITE(fd, buf, cnt, cleanup) \
> ({ \
>        ssize_t __cnt = (cnt); \
>        ssize_t __ret = write((fd), (buf), __cnt); \
>        if (__ret != __cnt) \
>                tst_brkm(TBROK|TERRNO, (cleanup_fn), "%s:%s:%i write failed", \
>                        __FILE__, __func__, __LINE__); \
>        __ret; \
> })
>
>> wish I could get the non-gcc inline extension to work (do-while(0)), but
>> that seems to be failing me right now :(..:
>
> the only way to return a value via a macro like this is with the gcc extension
> ({ ... }).  if you want to support other compilers, then your only realistic
> option is to do a proper external function.
>
> although perhaps that isnt a bad idea ... it'd reinforce the libltp
> requirement and avoid tripping up people who dont get all the nuances of
> writing safe macros.

    Ok -- sounds good. I was just looking for a means to properly
track line numbers and files, because that will get munged with
functions (static or otherwise). Perhaps create functions safe_write
that are instead called as SAFE_WRITE(...) safe_write(__FILE__,
__LINE__, __VAR_ARGS__) ? A trivial test seems to work at least.
Thanks,
-Garrett

$ cat test_macro.c
#include <stdio.h>
static void safe_write(char *a, int b, char* c) {
        printf("%s:%d - %s\n", a, b, c);
}

#define SAFE_WRITE(...) safe_write(__FILE__, __LINE__, __VA_ARGS__);

int
main(void)
{
        SAFE_WRITE("foo");
        return 0;
}
$ ./test_macro
test_macro.c:12 - foo

------------------------------------------------------------------------------
Gaining the trust of online customers is vital for the success of any company
that requires sensitive data to be transmitted over the Web.   Learn how to 
best implement a security strategy that keeps consumers' information secure 
and instills the confidence they need to proceed with transactions.
http://p.sf.net/sfu/oracle-sfdevnl 
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to