1251875Speter/* Licensed to the Apache Software Foundation (ASF) under one or more 2251875Speter * contributor license agreements. See the NOTICE file distributed with 3251875Speter * this work for additional information regarding copyright ownership. 4251875Speter * The ASF licenses this file to You under the Apache License, Version 2.0 5251875Speter * (the "License"); you may not use this file except in compliance with 6251875Speter * the License. You may obtain a copy of the License at 7251875Speter * 8251875Speter * http://www.apache.org/licenses/LICENSE-2.0 9251875Speter * 10251875Speter * Unless required by applicable law or agreed to in writing, software 11251875Speter * distributed under the License is distributed on an "AS IS" BASIS, 12251875Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13251875Speter * See the License for the specific language governing permissions and 14251875Speter * limitations under the License. 15251875Speter */ 16251875Speter 17251875Speter#include "apr_strings.h" 18251875Speter#include "apr_portable.h" 19251875Speter#include "apr_user.h" 20251875Speter#include "apr_private.h" 21251875Speter#ifdef HAVE_GRP_H 22251875Speter#include <grp.h> 23251875Speter#endif 24251875Speter#if APR_HAVE_SYS_TYPES_H 25251875Speter#include <sys/types.h> 26251875Speter#endif 27251875Speter#if APR_HAVE_UNISTD_H 28251875Speter#include <unistd.h> /* for _POSIX_THREAD_SAFE_FUNCTIONS */ 29251875Speter#endif 30251875Speter 31251875Speter#define GRBUF_SIZE 8192 32251875Speter 33251875SpeterAPR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, apr_gid_t groupid, 34251875Speter apr_pool_t *p) 35251875Speter{ 36251875Speter struct group *gr; 37251875Speter 38251875Speter#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R) 39251875Speter struct group grp; 40251875Speter char grbuf[GRBUF_SIZE]; 41251875Speter apr_status_t rv; 42251875Speter 43251875Speter /* See comment in getpwnam_safe on error handling. */ 44251875Speter rv = getgrgid_r(groupid, &grp, grbuf, sizeof(grbuf), &gr); 45251875Speter if (rv) { 46251875Speter return rv; 47251875Speter } 48251875Speter if (gr == NULL) { 49251875Speter return APR_ENOENT; 50251875Speter } 51251875Speter#else 52251875Speter errno = 0; 53251875Speter if ((gr = getgrgid(groupid)) == NULL) { 54251875Speter return errno ? errno : APR_ENOENT; 55251875Speter } 56251875Speter#endif 57251875Speter *groupname = apr_pstrdup(p, gr->gr_name); 58251875Speter return APR_SUCCESS; 59251875Speter} 60251875Speter 61251875SpeterAPR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *groupid, 62251875Speter const char *groupname, apr_pool_t *p) 63251875Speter{ 64251875Speter struct group *gr; 65251875Speter 66251875Speter#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRNAM_R) 67251875Speter struct group grp; 68251875Speter char grbuf[GRBUF_SIZE]; 69251875Speter apr_status_t rv; 70251875Speter 71251875Speter /* See comment in getpwnam_safe on error handling. */ 72251875Speter rv = getgrnam_r(groupname, &grp, grbuf, sizeof(grbuf), &gr); 73251875Speter if (rv) { 74251875Speter return rv; 75251875Speter } 76251875Speter if (gr == NULL) { 77251875Speter return APR_ENOENT; 78251875Speter } 79251875Speter#else 80251875Speter errno = 0; 81251875Speter if ((gr = getgrnam(groupname)) == NULL) { 82251875Speter return errno ? errno : APR_ENOENT; 83251875Speter } 84251875Speter#endif 85251875Speter *groupid = gr->gr_gid; 86251875Speter return APR_SUCCESS; 87251875Speter} 88