Rainer, On 10/3/12 1:30 PM, Rainer Jung wrote: > On 03.10.2012 18:02, Christopher Schultz wrote: >> Looking at the OpenSSL API (wow, I really miss javadoc), it doesn't >> appear that there's any function that can sniff the capabilities of the >> engine and check to see whether a particular option is supported. >> Instead, the technique of using #ifdefs to conditionally include code >> that will return TRUE seems to be the only alternative. > > Apache HTTP server uses this style as well.
That's a good sanity check: at least we're all doing it the "long" way ;) > I think though ugly it's the right approach. You could try to define a > macro, that takes over the > > if (op & SSL_OP_FOO) { > support |= (op & SSL_OP_FOO); > op ^= SSL_OP_FOO; // Clear FOO > } > > part and makes it a bit shorter. The ifdef unfortunately has to stay > outside of the macro, since you can't use if or ifdef inside a cpp macro. > > Totally untested, but maybe something along the lines of > > http://people.apache.org/~rjung/patches/hasOp-example.c I like the idea of using a macro to compact the code a bit, but in spite of tcnative's use of macros that don't contain "arguments" for all data that will be operated on, I prefer to be explicit about mentioning all data that will be used, like this: #define TCN_SSL_TEST_OP_SUPPORT(op, option, support) \ if (op & option) { \ support |= (op & option); \ } ... #ifdef SSL_OP_MICROSOFT_SESS_ID_BUG TCN_SSL_TEST_OP_SUPPORT(op, SSL_OP_MICROSOFT_SESS_ID_BUG, support) #endif Unfortunately, it does modify those "arguments" in call-by-reference style yet does not pass them by reference, but the use of ALL_UPPER_CASE should suggest that it's a preprocessor macro and not a method call and that - possibly - the arguments might be modified. Thanks, -chris
signature.asc
Description: OpenPGP digital signature