1217309Snwhitehorn#include "pwf.h" 2255852Sdteske#include <pthread.h> 3220749Snwhitehorn 4255852Sdteske#define FIX(x) (gr->gr_##x = gr->gr_##x-line+buf) 5217309Snwhitehorn 6220749Snwhitehornstatic int getgr_r(const char *name, gid_t gid, struct group *gr, char *buf, size_t size, struct group **res) 7220749Snwhitehorn{ 8220749Snwhitehorn char *line = 0; 9220749Snwhitehorn size_t len = 0; 10220749Snwhitehorn char **mem = 0; 11220749Snwhitehorn size_t nmem = 0; 12220749Snwhitehorn int rv = 0; 13220749Snwhitehorn size_t i; 14220749Snwhitehorn int cs; 15220749Snwhitehorn 16220749Snwhitehorn pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); 17220749Snwhitehorn 18220749Snwhitehorn rv = __getgr_a(name, gid, gr, &line, &len, &mem, &nmem, res); 19220749Snwhitehorn if (*res && size < len + (nmem+1)*sizeof(char *) + 32) { 20220749Snwhitehorn *res = 0; 21220749Snwhitehorn rv = ERANGE; 22220749Snwhitehorn } 23220749Snwhitehorn if (*res) { 24220749Snwhitehorn buf += (16-(uintptr_t)buf)%16; 25220749Snwhitehorn gr->gr_mem = (void *)buf; 26220749Snwhitehorn buf += (nmem+1)*sizeof(char *); 27220749Snwhitehorn memcpy(buf, line, len); 28220749Snwhitehorn FIX(name); 29220749Snwhitehorn FIX(passwd); 30217309Snwhitehorn for (i=0; mem[i]; i++) 31217309Snwhitehorn gr->gr_mem[i] = mem[i]-line+buf; 32217309Snwhitehorn gr->gr_mem[i] = 0; 33217309Snwhitehorn } 34251843Sbapt free(mem); 35217309Snwhitehorn free(line); 36217309Snwhitehorn pthread_setcancelstate(cs, 0); 37217309Snwhitehorn return rv; 38217309Snwhitehorn} 39217309Snwhitehorn 40217309Snwhitehornint getgrnam_r(const char *name, struct group *gr, char *buf, size_t size, struct group **res) 41217309Snwhitehorn{ 42217309Snwhitehorn return getgr_r(name, 0, gr, buf, size, res); 43217309Snwhitehorn} 44217309Snwhitehorn 45217309Snwhitehornint getgrgid_r(gid_t gid, struct group *gr, char *buf, size_t size, struct group **res) 46217309Snwhitehorn{ 47217309Snwhitehorn return getgr_r(0, gid, gr, buf, size, res); 48251843Sbapt} 49217309Snwhitehorn