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