groupinfo.c revision 302408
1132718Skan/* Licensed to the Apache Software Foundation (ASF) under one or more 2169689Skan * contributor license agreements. See the NOTICE file distributed with 3169689Skan * this work for additional information regarding copyright ownership. 452284Sobrien * The ASF licenses this file to You under the Apache License, Version 2.0 5132718Skan * (the "License"); you may not use this file except in compliance with 652284Sobrien * the License. You may obtain a copy of the License at 7132718Skan * 852284Sobrien * http://www.apache.org/licenses/LICENSE-2.0 952284Sobrien * 1052284Sobrien * Unless required by applicable law or agreed to in writing, software 1152284Sobrien * distributed under the License is distributed on an "AS IS" BASIS, 12132718Skan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1352284Sobrien * See the License for the specific language governing permissions and 1452284Sobrien * limitations under the License. 1552284Sobrien */ 1652284Sobrien 1752284Sobrien#include "apr_strings.h" 18132718Skan#include "apr_portable.h" 19169689Skan#include "apr_user.h" 20169689Skan#include "apr_private.h" 2152284Sobrien#ifdef HAVE_GRP_H 2252284Sobrien#include <grp.h> 2352284Sobrien#endif 2452284Sobrien#if APR_HAVE_SYS_TYPES_H 2590075Sobrien#include <sys/types.h> 2652284Sobrien#endif 2790075Sobrien#if APR_HAVE_UNISTD_H 2852284Sobrien#include <unistd.h> /* for _POSIX_THREAD_SAFE_FUNCTIONS */ 2952284Sobrien#endif 3052284Sobrien 3152284Sobrien#define GRBUF_SIZE 8192 3252284Sobrien 3390075SobrienAPR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, apr_gid_t groupid, 3490075Sobrien apr_pool_t *p) 3590075Sobrien{ 3690075Sobrien struct group *gr; 3790075Sobrien 3890075Sobrien#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R) 3990075Sobrien struct group grp; 4090075Sobrien char grbuf[GRBUF_SIZE]; 4190075Sobrien apr_status_t rv; 4290075Sobrien 4390075Sobrien /* See comment in getpwnam_safe on error handling. */ 4490075Sobrien rv = getgrgid_r(groupid, &grp, grbuf, sizeof(grbuf), &gr); 4590075Sobrien if (rv) { 4690075Sobrien return rv; 4790075Sobrien } 4890075Sobrien if (gr == NULL) { 4990075Sobrien return APR_ENOENT; 5090075Sobrien } 5190075Sobrien#else 5290075Sobrien errno = 0; 5390075Sobrien if ((gr = getgrgid(groupid)) == NULL) { 5490075Sobrien return errno ? errno : APR_ENOENT; 5590075Sobrien } 5690075Sobrien#endif 5790075Sobrien *groupname = apr_pstrdup(p, gr->gr_name); 5890075Sobrien return APR_SUCCESS; 5990075Sobrien} 6090075Sobrien 6190075SobrienAPR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *groupid, 6290075Sobrien const char *groupname, apr_pool_t *p) 6390075Sobrien{ 6490075Sobrien struct group *gr; 6590075Sobrien 6690075Sobrien#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRNAM_R) 6790075Sobrien struct group grp; 6890075Sobrien char grbuf[GRBUF_SIZE]; 6990075Sobrien apr_status_t rv; 7090075Sobrien 7190075Sobrien /* See comment in getpwnam_safe on error handling. */ 7290075Sobrien rv = getgrnam_r(groupname, &grp, grbuf, sizeof(grbuf), &gr); 7390075Sobrien if (rv) { 7490075Sobrien return rv; 7590075Sobrien } 7690075Sobrien if (gr == NULL) { 7790075Sobrien return APR_ENOENT; 7890075Sobrien } 7990075Sobrien#else 8090075Sobrien errno = 0; 8190075Sobrien if ((gr = getgrnam(groupname)) == NULL) { 8290075Sobrien return errno ? errno : APR_ENOENT; 8390075Sobrien } 8490075Sobrien#endif 8590075Sobrien *groupid = gr->gr_gid; 86 return APR_SUCCESS; 87} 88