1132718Skan/* Licensed to the Apache Software Foundation (ASF) under one or more
2169689Skan * contributor license agreements.  See the NOTICE file distributed with
3117395Skan * this work for additional information regarding copyright ownership.
4117395Skan * The ASF licenses this file to You under the Apache License, Version 2.0
5117395Skan * (the "License"); you may not use this file except in compliance with
6117395Skan * the License.  You may obtain a copy of the License at
7117395Skan *
8117395Skan *     http://www.apache.org/licenses/LICENSE-2.0
9117395Skan *
10117395Skan * Unless required by applicable law or agreed to in writing, software
11117395Skan * distributed under the License is distributed on an "AS IS" BASIS,
12117395Skan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13117395Skan * See the License for the specific language governing permissions and
14117395Skan * limitations under the License.
15117395Skan */
16169689Skan
17117395Skan#ifndef INHERIT_H
18132718Skan#define INHERIT_H
19117395Skan
20117395Skan#include "apr_inherit.h"
21132718Skan
22132718Skan#define APR_INHERIT (1 << 24)    /* Must not conflict with other bits */
23132718Skan
24117395Skan#define APR_IMPLEMENT_INHERIT_SET(name, flag, pool, cleanup)        \
25117395Skanapr_status_t apr_##name##_inherit_set(apr_##name##_t *the##name)    \
26132718Skan{                                                                   \
27117395Skan    if (the##name->flag & APR_FOPEN_NOCLEANUP)                      \
28117395Skan        return APR_EINVAL;                                          \
29117395Skan    if (!(the##name->flag & APR_INHERIT)) {                         \
30117395Skan        int flags = fcntl(the##name->name##des, F_GETFD);           \
31117395Skan        if (flags == -1)                                            \
32117395Skan            return errno;                                           \
33132718Skan        flags &= ~(FD_CLOEXEC);                                     \
34117395Skan        if (fcntl(the##name->name##des, F_SETFD, flags) == -1)      \
35132718Skan            return errno;                                           \
36117395Skan        the##name->flag |= APR_INHERIT;                             \
37117395Skan        apr_pool_child_cleanup_set(the##name->pool,                 \
38117395Skan                                   (void *)the##name,               \
39117395Skan                                   cleanup, apr_pool_cleanup_null); \
40117395Skan    }                                                               \
41132718Skan    return APR_SUCCESS;                                             \
42117395Skan}
43132718Skan
44132718Skan#define APR_IMPLEMENT_INHERIT_UNSET(name, flag, pool, cleanup)      \
45117395Skanapr_status_t apr_##name##_inherit_unset(apr_##name##_t *the##name)  \
46117395Skan{                                                                   \
47117395Skan    if (the##name->flag & APR_FOPEN_NOCLEANUP)                      \
48117395Skan        return APR_EINVAL;                                          \
49117395Skan    if (the##name->flag & APR_INHERIT) {                            \
50117395Skan        int flags;                                                  \
51117395Skan        if ((flags = fcntl(the##name->name##des, F_GETFD)) == -1)   \
52117395Skan            return errno;                                           \
53117395Skan        flags |= FD_CLOEXEC;                                        \
54117395Skan        if (fcntl(the##name->name##des, F_SETFD, flags) == -1)      \
55117395Skan            return errno;                                           \
56117395Skan        the##name->flag &= ~APR_INHERIT;                            \
57117395Skan        apr_pool_child_cleanup_set(the##name->pool,                 \
58132718Skan                                   (void *)the##name,               \
59132718Skan                                   cleanup, cleanup);               \
60132718Skan    }                                                               \
61132718Skan    return APR_SUCCESS;                                             \
62117395Skan}
63132718Skan
64117395Skan#endif	/* ! INHERIT_H */
65132718Skan