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