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#ifndef INHERIT_H
18251875Speter#define INHERIT_H
19251875Speter
20251875Speter#include "apr_inherit.h"
21251875Speter
22251875Speter#define APR_INHERIT (1 << 24)    /* Must not conflict with other bits */
23251875Speter
24251875Speter#define APR_IMPLEMENT_INHERIT_SET(name, flag, pool, cleanup)        \
25251875Speterapr_status_t apr_##name##_inherit_set(apr_##name##_t *the##name)    \
26251875Speter{                                                                   \
27251875Speter    if (the##name->flag & APR_FOPEN_NOCLEANUP)                      \
28251875Speter        return APR_EINVAL;                                          \
29251875Speter    if (!(the##name->flag & APR_INHERIT)) {                         \
30251875Speter        int flags = fcntl(the##name->name##des, F_GETFD);           \
31251875Speter        if (flags == -1)                                            \
32251875Speter            return errno;                                           \
33251875Speter        flags &= ~(FD_CLOEXEC);                                     \
34251875Speter        if (fcntl(the##name->name##des, F_SETFD, flags) == -1)      \
35251875Speter            return errno;                                           \
36251875Speter        the##name->flag |= APR_INHERIT;                             \
37251875Speter        apr_pool_child_cleanup_set(the##name->pool,                 \
38251875Speter                                   (void *)the##name,               \
39251875Speter                                   cleanup, apr_pool_cleanup_null); \
40251875Speter    }                                                               \
41251875Speter    return APR_SUCCESS;                                             \
42251875Speter}
43251875Speter
44251875Speter#define APR_IMPLEMENT_INHERIT_UNSET(name, flag, pool, cleanup)      \
45251875Speterapr_status_t apr_##name##_inherit_unset(apr_##name##_t *the##name)  \
46251875Speter{                                                                   \
47251875Speter    if (the##name->flag & APR_FOPEN_NOCLEANUP)                      \
48251875Speter        return APR_EINVAL;                                          \
49251875Speter    if (the##name->flag & APR_INHERIT) {                            \
50251875Speter        int flags;                                                  \
51251875Speter        if ((flags = fcntl(the##name->name##des, F_GETFD)) == -1)   \
52251875Speter            return errno;                                           \
53251875Speter        flags |= FD_CLOEXEC;                                        \
54251875Speter        if (fcntl(the##name->name##des, F_SETFD, flags) == -1)      \
55251875Speter            return errno;                                           \
56251875Speter        the##name->flag &= ~APR_INHERIT;                            \
57251875Speter        apr_pool_child_cleanup_set(the##name->pool,                 \
58251875Speter                                   (void *)the##name,               \
59251875Speter                                   cleanup, cleanup);               \
60251875Speter    }                                                               \
61251875Speter    return APR_SUCCESS;                                             \
62251875Speter}
63251875Speter
64251875Speter#endif	/* ! INHERIT_H */
65