mirror of https://github.com/postgres/postgres
parent
02d847fe9f
commit
62b532b736
@ -0,0 +1,85 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* threads.c |
||||
* |
||||
* Prototypes and macros around system calls, used to help make |
||||
* threaded libraries reentrant and safe to use from threaded applications. |
||||
* |
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group |
||||
* |
||||
* $Id: threads.c,v 1.1 2003/06/14 14:35:42 momjian Exp $ |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
|
||||
#include "postgres.h" |
||||
|
||||
/*
|
||||
* Wrapper around strerror and strerror_r to use the former if it is |
||||
* available and also return a more useful value (the error string). |
||||
*/ |
||||
char * |
||||
pqStrerror(int errnum, char *strerrbuf, size_t buflen) |
||||
{ |
||||
#if defined(USE_THREADS) && defined(HAVE_STRERROR_R) |
||||
/* reentrant strerror_r is available */ |
||||
/* some early standards had strerror_r returning char * */ |
||||
strerror_r(errnum, strerrbuf, buflen); |
||||
return (strerrbuf); |
||||
#else |
||||
/* no strerror_r() available, just use strerror */ |
||||
return strerror(errnum); |
||||
#endif |
||||
} |
||||
|
||||
/*
|
||||
* Wrapper around getpwuid() or getpwuid_r() to mimic POSIX getpwuid_r() |
||||
* behaviour, if it is not available. |
||||
*/ |
||||
int |
||||
pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer, |
||||
size_t buflen, struct passwd ** result) |
||||
{ |
||||
#if defined(USE_THREADS) && defined(HAVE_GETPWUID_R) |
||||
/*
|
||||
* broken (well early POSIX draft) getpwuid_r() which returns 'struct |
||||
* passwd *' |
||||
*/ |
||||
*result = getpwuid_r(uid, resultbuf, buffer, buflen); |
||||
#else |
||||
/* no getpwuid_r() available, just use getpwuid() */ |
||||
*result = getpwuid(uid); |
||||
#endif |
||||
return (*result == NULL) ? -1 : 0; |
||||
} |
||||
|
||||
/*
|
||||
* Wrapper around gethostbyname() or gethostbyname_r() to mimic |
||||
* POSIX gethostbyname_r() behaviour, if it is not available. |
||||
*/ |
||||
int |
||||
pqGethostbyname(const char *name, |
||||
struct hostent * resbuf, |
||||
char *buf, size_t buflen, |
||||
struct hostent ** result, |
||||
int *herrno) |
||||
{ |
||||
#if defined(USE_THREADS) && defined(HAVE_GETHOSTBYNAME_R) |
||||
/*
|
||||
* broken (well early POSIX draft) gethostbyname_r() which returns |
||||
* 'struct hostent *' |
||||
*/ |
||||
*result = gethostbyname_r(name, resbuf, buf, buflen, herrno); |
||||
return (*result == NULL) ? -1 : 0; |
||||
#else |
||||
/* no gethostbyname_r(), just use gethostbyname() */ |
||||
*result = gethostbyname(name); |
||||
if (*result != NULL) |
||||
return 0; |
||||
else |
||||
{ |
||||
*herrno = h_errno; |
||||
return -1; |
||||
} |
||||
#endif |
||||
} |
Loading…
Reference in new issue