1dnl @synopsis AC_raf_FUNC_WHICH_GETSERVBYNAME_R
2dnl
3dnl Provides a test to determine the correct way to call
4dnl getservbyname_r:
5dnl
6dnl  - defines HAVE_FUNC_GETSERVBYNAME_R_6 if it needs 6 arguments (e.g linux)
7dnl  - defines HAVE_FUNC_GETSERVBYNAME_R_5 if it needs 5 arguments (e.g. solaris)
8dnl  - defines HAVE_FUNC_GETSERVBYNAME_R_4 if it needs 4 arguments (e.g. osf/1)
9dnl
10dnl An example use can be found at
11dnl http://raf.org/autoconf/net_getservbyname.c
12dnl
13dnl Based on Caolan McNamara's gethostbyname_r macro. Based on David
14dnl Arnold's autoconf suggestion in the threads faq.
15dnl
16dnl @category Misc
17dnl @author raf <raf@raf.org>
18dnl @version 2001-08-20
19dnl @license GPLWithACException
20
21AC_DEFUN([AC_raf_FUNC_WHICH_GETSERVBYNAME_R],
22[
23AC_CACHE_CHECK(how many arguments getservbyname_r() takes,
24    ac_cv_func_which_getservbyname_r,
25    [
26        dnl we need to use C++ to detect missing prototypes
27        AC_LANG_PUSH(C++)
28
29        AC_TRY_COMPILE([#include <netdb.h>],
30            [
31                char *name;
32                char *proto;
33                struct servent *se, *res;
34                char buffer[2048];
35                int buflen = 2048;
36                (void) getservbyname_r(name, proto, se, buffer, buflen, &res)
37            ],
38            ac_cv_func_which_getservbyname_r=six,
39            [
40                AC_TRY_COMPILE([#include <netdb.h>],
41                    [
42                        char *name;
43                        char *proto;
44                        struct servent *se;
45                        char buffer[2048];
46                        int buflen = 2048;
47                        (void) getservbyname_r(name, proto, se, buffer, buflen)
48                    ],
49                    ac_cv_func_which_getservbyname_r=five,
50                    [
51                        AC_TRY_COMPILE([#include <netdb.h>],
52                            [
53                                char *name;
54                                char *proto;
55                                struct servent *se;
56                                struct servent_data data;
57                                (void) getservbyname_r(name, proto, se, &data);
58                            ],
59                            ac_cv_func_which_getservbyname_r=four,
60                            ac_cv_func_which_getservbyname_r=no
61                        )
62                    ]
63                )
64            ]
65        )
66        AC_LANG_POP()
67    ]
68)
69
70if test $ac_cv_func_which_getservbyname_r = six; then
71  AC_DEFINE(HAVE_FUNC_GETSERVBYNAME_R_6)
72elif test $ac_cv_func_which_getservbyname_r = five; then
73  AC_DEFINE(HAVE_FUNC_GETSERVBYNAME_R_5)
74elif test $ac_cv_func_which_getservbyname_r = four; then
75  AC_DEFINE(HAVE_FUNC_GETSERVBYNAME_R_4)
76fi
77
78])
79