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 * Copyright 2020 Joyent, Inc. 33 */ 34 35 #ifndef _GRP_H 36 #define _GRP_H 37 38 #include <sys/feature_tests.h> 39 40 #include <sys/types.h> 41 42 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) 43 #include <stdio.h> 44 #endif 45 46 #ifdef __cplusplus 47 extern "C" { 48 #endif 49 50 struct group { /* see getgrent(3C) */ 51 char *gr_name; 52 char *gr_passwd; 53 gid_t gr_gid; 54 char **gr_mem; 55 }; 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 extern int getgrouplist(const char *, gid_t, gid_t *, int *); 68 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */ 69 70 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || defined(_XPG4_2) 71 extern void endgrent(void); 72 extern void setgrent(void); 73 extern struct group *getgrent(void); /* MT-unsafe */ 74 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)... */ 75 76 /* 77 * getgrgid_r() & getgrnam_r() prototypes are defined here. 78 */ 79 80 /* 81 * Previous releases of Solaris, starting at 2.3, provided definitions of 82 * various functions as specified in POSIX.1c, Draft 6. For some of these 83 * functions, the final POSIX 1003.1c standard had a different number of 84 * arguments and return values. 85 * 86 * The following segment of this header provides support for the standard 87 * interfaces while supporting applications written under earlier 88 * releases. The application defines appropriate values of the feature 89 * test macros _POSIX_C_SOURCE and _POSIX_PTHREAD_SEMANTICS to indicate 90 * whether it was written to expect the Draft 6 or standard versions of 91 * these interfaces, before including this header. This header then 92 * provides a mapping from the source version of the interface to an 93 * appropriate binary interface. Such mappings permit an application 94 * to be built from libraries and objects which have mixed expectations 95 * of the definitions of these functions. 96 * 97 * For applications using the Draft 6 definitions, the binary symbol is the 98 * same as the source symbol, and no explicit mapping is needed. For the 99 * standard interface, the function func() is mapped to the binary symbol 100 * _posix_func(). The preferred mechanism for the remapping is a compiler 101 * #pragma. If the compiler does not provide such a #pragma, the header file 102 * defines a static function func() which calls the _posix_func() version; 103 * this has to be done instead of #define since POSIX specifies that an 104 * application can #undef the symbol and still be bound to the correct 105 * implementation. Unfortunately, the statics confuse lint so we fallback to 106 * #define in that case. 107 * 108 * NOTE: Support for the Draft 6 definitions is provided for compatibility 109 * only. New applications/libraries should use the standard definitions. 110 */ 111 112 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \ 113 (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS) 114 115 #if (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS) 116 117 #ifdef __PRAGMA_REDEFINE_EXTNAME 118 #pragma redefine_extname getgrgid_r __posix_getgrgid_r 119 #pragma redefine_extname getgrnam_r __posix_getgrnam_r 120 extern int getgrgid_r(gid_t, struct group *, char *, 121 size_t, struct group **); 122 extern int getgrnam_r(const char *, struct group *, char *, 123 size_t, struct group **); 124 #else /* __PRAGMA_REDEFINE_EXTNAME */ 125 126 extern int __posix_getgrgid_r(gid_t, struct group *, char *, size_t, 127 struct group **); 128 extern int __posix_getgrnam_r(const char *, struct group *, char *, size_t, 129 struct group **); 130 131 static int 132 getgrgid_r(gid_t __gid, struct group *__grp, char *__buf, size_t __len, 133 struct group **__res) 134 { 135 return (__posix_getgrgid_r(__gid, __grp, __buf, __len, __res)); 136 } 137 static int 138 getgrnam_r(const char *__cb, struct group *__grp, char *__buf, size_t __len, 139 struct group **__res) 140 { 141 return (__posix_getgrnam_r(__cb, __grp, __buf, __len, __res)); 142 } 143 144 #endif /* __PRAGMA_REDEFINE_EXTNAME */ 145 146 #else /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */ 147 148 extern struct group *getgrgid_r(gid_t, struct group *, char *, int); 149 extern struct group *getgrnam_r(const char *, struct group *, char *, int); 150 151 #endif /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */ 152 153 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)... */ 154 155 #ifdef __cplusplus 156 } 157 #endif 158 159 #endif /* _GRP_H */ 160