xref: /illumos-gate/usr/src/lib/lib9p/common/rfuncs.h (revision aa693e996c2928c92cccd8a3efe91373e85a6967)
1*aa693e99SJason King /*
2*aa693e99SJason King  * Copyright 2016 Chris Torek <chris.torek@gmail.com>
3*aa693e99SJason King  * All rights reserved
4*aa693e99SJason King  *
5*aa693e99SJason King  * Redistribution and use in source and binary forms, with or without
6*aa693e99SJason King  * modification, are permitted providing that the following conditions
7*aa693e99SJason King  * are met:
8*aa693e99SJason King  * 1. Redistributions of source code must retain the above copyright
9*aa693e99SJason King  *    notice, this list of conditions and the following disclaimer.
10*aa693e99SJason King  * 2. Redistributions in binary form must reproduce the above copyright
11*aa693e99SJason King  *    notice, this list of conditions and the following disclaimer in the
12*aa693e99SJason King  *    documentation and/or other materials provided with the distribution.
13*aa693e99SJason King  *
14*aa693e99SJason King  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15*aa693e99SJason King  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16*aa693e99SJason King  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*aa693e99SJason King  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
18*aa693e99SJason King  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*aa693e99SJason King  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*aa693e99SJason King  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*aa693e99SJason King  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22*aa693e99SJason King  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
23*aa693e99SJason King  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24*aa693e99SJason King  * POSSIBILITY OF SUCH DAMAGE.
25*aa693e99SJason King  *
26*aa693e99SJason King  */
27*aa693e99SJason King 
28*aa693e99SJason King #ifndef LIB9P_RFUNCS_H
29*aa693e99SJason King #define LIB9P_RFUNCS_H
30*aa693e99SJason King 
31*aa693e99SJason King #if defined(__illumos__) && !defined(_POSIX_PTHREAD_SEMANTICS)
32*aa693e99SJason King #define	_POSIX_PTHREAD_SEMANTICS 1
33*aa693e99SJason King #endif
34*aa693e99SJason King 
35*aa693e99SJason King #include <grp.h>
36*aa693e99SJason King #include <pwd.h>
37*aa693e99SJason King #include <string.h>
38*aa693e99SJason King 
39*aa693e99SJason King #if defined(WITH_CASPER)
40*aa693e99SJason King #include <libcasper.h>
41*aa693e99SJason King #endif
42*aa693e99SJason King 
43*aa693e99SJason King /*
44*aa693e99SJason King  * Reentrant, optionally-malloc-ing versions of
45*aa693e99SJason King  * basename() and dirname().
46*aa693e99SJason King  */
47*aa693e99SJason King char	*r_basename(const char *, char *, size_t);
48*aa693e99SJason King char	*r_dirname(const char *, char *, size_t);
49*aa693e99SJason King 
50*aa693e99SJason King /*
51*aa693e99SJason King  * Yuck: getpwuid, getgrgid are not thread-safe, and the
52*aa693e99SJason King  * POSIX replacements (getpwuid_r, getgrgid_r) are horrible.
53*aa693e99SJason King  * This is to allow us to loop over the get.*_r calls with ever
54*aa693e99SJason King  * increasing buffers until they succeed or get unreasonable
55*aa693e99SJason King  * (same idea as the libc code for the non-reentrant versions,
56*aa693e99SJason King  * although prettier).
57*aa693e99SJason King  *
58*aa693e99SJason King  * The getpwuid/getgrgid functions auto-init one of these,
59*aa693e99SJason King  * but the caller must call r_pgfree() when done with the
60*aa693e99SJason King  * return values.
61*aa693e99SJason King  *
62*aa693e99SJason King  * If we need more later, we may have to expose the init function.
63*aa693e99SJason King  */
64*aa693e99SJason King struct r_pgdata {
65*aa693e99SJason King 	char	*r_pgbuf;
66*aa693e99SJason King 	size_t	r_pgbufsize;
67*aa693e99SJason King 	union {
68*aa693e99SJason King 		struct passwd un_pw;
69*aa693e99SJason King 		struct group un_gr;
70*aa693e99SJason King 	} r_pgun;
71*aa693e99SJason King };
72*aa693e99SJason King 
73*aa693e99SJason King /* void r_pginit(struct r_pgdata *); */
74*aa693e99SJason King void r_pgfree(struct r_pgdata *);
75*aa693e99SJason King struct passwd *r_getpwuid(uid_t, struct r_pgdata *);
76*aa693e99SJason King struct group *r_getgrgid(gid_t, struct r_pgdata *);
77*aa693e99SJason King 
78*aa693e99SJason King #if defined(WITH_CASPER)
79*aa693e99SJason King struct passwd *r_cap_getpwuid(cap_channel_t *, uid_t, struct r_pgdata *);
80*aa693e99SJason King struct group *r_cap_getgrgid(cap_channel_t *, gid_t, struct r_pgdata *);
81*aa693e99SJason King #endif
82*aa693e99SJason King 
83*aa693e99SJason King #endif	/* LIB9P_RFUNCS_H */
84