On Fri, Jul 12, 2019 at 03:35:54PM -0400, Allan Streib wrote:

> Probably an elementary question stemming from my lack of C expertise.
> 
> I am trying to complile some C code that includes its own "bcrypt"
> function. This is conflicting with the declaration in pwd.h.
> 
>     error: conflicting types for 'bcrypt'
>     int bcrypt(char *, const char *, const char *);
>         ^
>     /usr/include/pwd.h:112:8: note: previous declaration is here
>     char            *bcrypt(const char *, const char *);
> 
> In pwd.h I see that the bcrypt declaration is wrapped in a #if block:
> 
>     #if __BSD_VISIBLE
>     int              setpassent(int);
>     int              uid_from_user(const char *, uid_t *);
>     const char      *user_from_uid(uid_t, int);
>     char            *bcrypt_gensalt(u_int8_t);
>     char            *bcrypt(const char *, const char *);
>     int             bcrypt_newhash(const char *, int, char *, size_t);
>     int             bcrypt_checkpass(const char *, const char *);
>     struct passwd   *pw_dup(const struct passwd *);
>     #endif
> 
> So I'm trying to work out why __BSD_VISIBLE is 1 when I'm compiling.
> 
> sys/cdefs.h says:
> 
>     /*
>      * Finally deal with BSD-specific interfaces that are not covered
>      * by any standards.  We expose these when none of the POSIX or XPG
>      * macros is defined or if the user explicitly asks for them.
>      */
>     #if !defined(_BSD_SOURCE) && \
>        (defined(_ANSI_SOURCE) || defined(__XPG_VISIBLE) || 
> defined(__POSIX_VISIBLE))
>     # define __BSD_VISIBLE          0
>     #endif
> 
> __POSIX_VISIBLE is defined as 200809, so __BSD_VISIBLE should be 0 and
> the pwd.h declaration for bcrypt should be skipped?
> 
> Allan

Likely __POSIX_VISIBLE isn't defined until after that statements in
the bottom part of cdefs.h

You need to define _POSIX_C_SOURCE yourself before including cdefs.h

        -Otto

Reply via email to