1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*      Copyright (c) 1988 AT&T     */
  23 /*        All Rights Reserved   */
  24 
  25 
  26 /*
  27  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
  28  *
  29  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  30  * Use is subject to license terms.
  31  */
  32 
  33 #ifndef _GRP_H
  34 #define _GRP_H
  35 
  36 #include <sys/feature_tests.h>
  37 
  38 #include <sys/types.h>
  39 
  40 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
  41 #include <stdio.h>
  42 #endif
  43 
  44 #ifdef  __cplusplus
  45 extern "C" {
  46 #endif
  47 
  48 struct  group { /* see getgrent(3C) */
  49         char    *gr_name;
  50         char    *gr_passwd;
  51         gid_t   gr_gid;
  52         char    **gr_mem;
  53 };
  54 
  55 extern struct group *getgrgid(gid_t);           /* MT-unsafe */
  56 extern struct group *getgrnam(const char *);    /* MT-unsafe */
  57 
  58 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
  59 extern struct group *getgrent_r(struct group *, char *, int);
  60 extern struct group *fgetgrent_r(FILE *, struct group *, char *, int);
  61 
  62 
  63 extern struct group *fgetgrent(FILE *);         /* MT-unsafe */
  64 extern int initgroups(const char *, gid_t);
  65 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
  66 
  67 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || defined(_XPG4_2)
  68 extern void endgrent(void);
  69 extern void setgrent(void);
  70 extern struct group *getgrent(void);            /* MT-unsafe */
  71 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)... */
  72 
  73 /*
  74  * getgrgid_r() & getgrnam_r() prototypes are defined here.
  75  */
  76 
  77 /*
  78  * Previous releases of Solaris, starting at 2.3, provided definitions of
  79  * various functions as specified in POSIX.1c, Draft 6.  For some of these
  80  * functions, the final POSIX 1003.1c standard had a different number of
  81  * arguments and return values.
  82  *
  83  * The following segment of this header provides support for the standard
  84  * interfaces while supporting applications written under earlier
  85  * releases.  The application defines appropriate values of the feature
  86  * test macros _POSIX_C_SOURCE and _POSIX_PTHREAD_SEMANTICS to indicate
  87  * whether it was written to expect the Draft 6 or standard versions of
  88  * these interfaces, before including this header.  This header then
  89  * provides a mapping from the source version of the interface to an
  90  * appropriate binary interface.  Such mappings permit an application
  91  * to be built from libraries and objects which have mixed expectations
  92  * of the definitions of these functions.
  93  *
  94  * For applications using the Draft 6 definitions, the binary symbol is the
  95  * same as the source symbol, and no explicit mapping is needed.  For the
  96  * standard interface, the function func() is mapped to the binary symbol
  97  * _posix_func().  The preferred mechanism for the remapping is a compiler
  98  * #pragma.  If the compiler does not provide such a #pragma, the header file
  99  * defines a static function func() which calls the _posix_func() version;
 100  * this has to be done instead of #define since POSIX specifies that an
 101  * application can #undef the symbol and still be bound to the correct
 102  * implementation.  Unfortunately, the statics confuse lint so we fallback to
 103  * #define in that case.
 104  *
 105  * NOTE: Support for the Draft 6 definitions is provided for compatibility
 106  * only.  New applications/libraries should use the standard definitions.
 107  */
 108 
 109 #if     defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
 110         (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
 111 
 112 #if     (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
 113 
 114 #ifdef __PRAGMA_REDEFINE_EXTNAME
 115 #pragma redefine_extname getgrgid_r __posix_getgrgid_r
 116 #pragma redefine_extname getgrnam_r __posix_getgrnam_r
 117 extern int getgrgid_r(gid_t, struct group *, char *, int, struct group **);
 118 extern int getgrnam_r(const char *, struct group *, char *, int,
 119                                                         struct group **);
 120 #else  /* __PRAGMA_REDEFINE_EXTNAME */
 121 
 122 extern int __posix_getgrgid_r(gid_t, struct group *, char *, size_t,
 123     struct group **);
 124 extern int __posix_getgrnam_r(const char *, struct group *, char *, size_t,
 125     struct group **);
 126 
 127 #ifdef __lint
 128 
 129 #define getgrgid_r __posix_getgrgid_r
 130 #define getgrnam_r __posix_getgrnam_r
 131 
 132 #else   /* !__lint */
 133 
 134 static int
 135 getgrgid_r(gid_t __gid, struct group *__grp, char *__buf, int __len,
 136     struct group **__res)
 137 {
 138         return (__posix_getgrgid_r(__gid, __grp, __buf, __len, __res));
 139 }
 140 static int
 141 getgrnam_r(const char *__cb, struct group *__grp, char *__buf, int __len,
 142     struct group **__res)
 143 {
 144         return (__posix_getgrnam_r(__cb, __grp, __buf, __len, __res));
 145 }
 146 
 147 #endif /* !__lint */
 148 #endif /* __PRAGMA_REDEFINE_EXTNAME */
 149 
 150 #else  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
 151 
 152 extern struct group *getgrgid_r(gid_t, struct group *, char *, int);
 153 extern struct group *getgrnam_r(const char *, struct group *, char *, int);
 154 
 155 #endif  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
 156 
 157 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)... */
 158 
 159 #ifdef  __cplusplus
 160 }
 161 #endif
 162 
 163 #endif  /* _GRP_H */