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