groupinfo.c revision 285830
1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "apr_strings.h" 18#include "apr_portable.h" 19#include "apr_user.h" 20#include "apr_private.h" 21#ifdef HAVE_GRP_H 22#include <grp.h> 23#endif 24#if APR_HAVE_SYS_TYPES_H 25#include <sys/types.h> 26#endif 27#if APR_HAVE_UNISTD_H 28#include <unistd.h> /* for _POSIX_THREAD_SAFE_FUNCTIONS */ 29#endif 30 31#define GRBUF_SIZE 8192 32 33APR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, apr_gid_t groupid, 34 apr_pool_t *p) 35{ 36 struct group *gr; 37 38#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R) 39 struct group grp; 40 char grbuf[GRBUF_SIZE]; 41 apr_status_t rv; 42 43 /* See comment in getpwnam_safe on error handling. */ 44 rv = getgrgid_r(groupid, &grp, grbuf, sizeof(grbuf), &gr); 45 if (rv) { 46 return rv; 47 } 48 if (gr == NULL) { 49 return APR_ENOENT; 50 } 51#else 52 errno = 0; 53 if ((gr = getgrgid(groupid)) == NULL) { 54 return errno ? errno : APR_ENOENT; 55 } 56#endif 57 *groupname = apr_pstrdup(p, gr->gr_name); 58 return APR_SUCCESS; 59} 60 61APR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *groupid, 62 const char *groupname, apr_pool_t *p) 63{ 64 struct group *gr; 65 66#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRNAM_R) 67 struct group grp; 68 char grbuf[GRBUF_SIZE]; 69 apr_status_t rv; 70 71 /* See comment in getpwnam_safe on error handling. */ 72 rv = getgrnam_r(groupname, &grp, grbuf, sizeof(grbuf), &gr); 73 if (rv) { 74 return rv; 75 } 76 if (gr == NULL) { 77 return APR_ENOENT; 78 } 79#else 80 errno = 0; 81 if ((gr = getgrnam(groupname)) == NULL) { 82 return errno ? errno : APR_ENOENT; 83 } 84#endif 85 *groupid = gr->gr_gid; 86 return APR_SUCCESS; 87} 88