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 2004 Sun Microsystems, Inc.  All rights reserved.
  28  * Use is subject to license terms.
  29  */
  30 
  31 #ifndef _GRP_H
  32 #define _GRP_H
  33 
  34 #pragma ident   "%Z%%M% %I%     %E% SMI"        /* SVr4.0 1.3.3.1 */
  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 #if defined(__STDC__)
  56 
  57 extern struct group *getgrgid(gid_t);           /* MT-unsafe */
  58 extern struct group *getgrnam(const char *);    /* MT-unsafe */
  59 
  60 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
  61 extern struct group *getgrent_r(struct group *, char *, int);
  62 extern struct group *fgetgrent_r(FILE *, struct group *, char *, int);
  63 
  64 
  65 extern struct group *fgetgrent(FILE *);         /* MT-unsafe */
  66 extern int initgroups(const char *, gid_t);
  67 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
  68 
  69 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || defined(_XPG4_2)
  70 extern void endgrent(void);
  71 extern void setgrent(void);
  72 extern struct group *getgrent(void);            /* MT-unsafe */
  73 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)... */
  74 
  75 #else
  76 
  77 extern struct group *getgrgid();                /* MT-unsafe */
  78 extern struct group *getgrnam();                /* MT-unsafe */
  79 
  80 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
  81 extern struct group *getgrent_r();
  82 extern struct group *fgetgrent_r();
  83 
  84 extern struct group *fgetgrent();               /* MT-unsafe */
  85 extern int initgroups();
  86 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
  87 
  88 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || defined(_XPG4_2)
  89 extern void endgrent();
  90 extern void setgrent();
  91 extern struct group *getgrent();                /* MT-unsafe */
  92 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)... */
  93 
  94 #endif  /* __STDC__ */
  95 
  96 
  97 /*
  98  * getgrgid_r() & getgrnam_r() prototypes are defined here.
  99  */
 100 
 101 /*
 102  * Previous releases of Solaris, starting at 2.3, provided definitions of
 103  * various functions as specified in POSIX.1c, Draft 6.  For some of these
 104  * functions, the final POSIX 1003.1c standard had a different number of
 105  * arguments and return values.
 106  *
 107  * The following segment of this header provides support for the standard
 108  * interfaces while supporting applications written under earlier
 109  * releases.  The application defines appropriate values of the feature
 110  * test macros _POSIX_C_SOURCE and _POSIX_PTHREAD_SEMANTICS to indicate
 111  * whether it was written to expect the Draft 6 or standard versions of
 112  * these interfaces, before including this header.  This header then
 113  * provides a mapping from the source version of the interface to an
 114  * appropriate binary interface.  Such mappings permit an application
 115  * to be built from libraries and objects which have mixed expectations
 116  * of the definitions of these functions.
 117  *
 118  * For applications using the Draft 6 definitions, the binary symbol is the
 119  * same as the source symbol, and no explicit mapping is needed.  For the
 120  * standard interface, the function func() is mapped to the binary symbol
 121  * _posix_func().  The preferred mechanism for the remapping is a compiler
 122  * #pragma.  If the compiler does not provide such a #pragma, the header file
 123  * defines a static function func() which calls the _posix_func() version;
 124  * this has to be done instead of #define since POSIX specifies that an
 125  * application can #undef the symbol and still be bound to the correct
 126  * implementation.  Unfortunately, the statics confuse lint so we fallback to
 127  * #define in that case.
 128  *
 129  * NOTE: Support for the Draft 6 definitions is provided for compatibility
 130  * only.  New applications/libraries should use the standard definitions.
 131  */
 132 
 133 #if     defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
 134         (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
 135 
 136 #if     defined(__STDC__)
 137 
 138 #if     (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
 139 
 140 #ifdef __PRAGMA_REDEFINE_EXTNAME
 141 #pragma redefine_extname getgrgid_r __posix_getgrgid_r
 142 #pragma redefine_extname getgrnam_r __posix_getgrnam_r
 143 extern int getgrgid_r(gid_t, struct group *, char *, int, struct group **);
 144 extern int getgrnam_r(const char *, struct group *, char *, int,
 145                                                         struct group **);
 146 #else  /* __PRAGMA_REDEFINE_EXTNAME */
 147 
 148 extern int __posix_getgrgid_r(gid_t, struct group *, char *, size_t,
 149     struct group **);
 150 extern int __posix_getgrnam_r(const char *, struct group *, char *, size_t,
 151     struct group **);
 152 
 153 #ifdef __lint
 154 
 155 #define getgrgid_r __posix_getgrgid_r
 156 #define getgrnam_r __posix_getgrnam_r
 157 
 158 #else   /* !__lint */
 159 
 160 static int
 161 getgrgid_r(gid_t __gid, struct group *__grp, char *__buf, int __len,
 162     struct group **__res)
 163 {
 164         return (__posix_getgrgid_r(__gid, __grp, __buf, __len, __res));
 165 }
 166 static int
 167 getgrnam_r(const char *__cb, struct group *__grp, char *__buf, int __len,
 168     struct group **__res)
 169 {
 170         return (__posix_getgrnam_r(__cb, __grp, __buf, __len, __res));
 171 }
 172 
 173 #endif /* !__lint */
 174 #endif /* __PRAGMA_REDEFINE_EXTNAME */
 175 
 176 #else  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
 177 
 178 extern struct group *getgrgid_r(gid_t, struct group *, char *, int);
 179 extern struct group *getgrnam_r(const char *, struct group *, char *, int);
 180 
 181 #endif  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
 182 
 183 #else  /* __STDC__ */
 184 
 185 #if     (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
 186 
 187 #ifdef __PRAGMA_REDEFINE_EXTNAME
 188 #pragma redefine_extname getgrgid_r __posix_getgrgid_r
 189 #pragma redefine_extname getgrnam_r __posix_getgrnam_r
 190 extern int getgrgid_r();
 191 extern int getgrnam_r();
 192 #else  /* __PRAGMA_REDEFINE_EXTNAME */
 193 
 194 extern int __posix_getgrgid_r();
 195 extern int __posix_getgrnam_r();
 196 
 197 #ifdef  __lint
 198 
 199 #define getgrgid_r __posix_getgrgid_r
 200 #define getgrnam_r __posix_getgrnam_r
 201 
 202 #else   /* !__lint */
 203 
 204 static int
 205 getgrgid_r(__gid, __grp, __buf, __len, __res)
 206         gid_t __gid;
 207         struct group *__grp;
 208         char *__buf;
 209         int __len;
 210         struct group **__res;
 211 {
 212         return (__posix_getgrgid_r(__gid, __grp, __buf, __len, __res));
 213 }
 214 static int
 215 getgrnam_r(__cb, __grp, __buf, __len, __res)
 216         char *__cb;
 217         struct group *__grp;
 218         char *__buf;
 219         int __len;
 220         struct group **__res;
 221 {
 222         return (__posix_getgrnam_r(__cb, __grp, __buf, __len, __res));
 223 }
 224 
 225 #endif /* !__lint */
 226 #endif /* __PRAGMA_REDEFINE_EXTNAME */
 227 
 228 #else  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
 229 
 230 extern struct group *getgrgid_r();
 231 extern struct group *getgrnam_r();
 232 
 233 #endif /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
 234 
 235 #endif /* __STDC__ */
 236 
 237 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)... */
 238 
 239 #ifdef  __cplusplus
 240 }
 241 #endif
 242 
 243 #endif  /* _GRP_H */