xref: /freebsd/contrib/pkgconf/libpkgconf/bsdstubs.c (revision a3cefe7f2b4df0f70ff92d4570ce18e517af43ec)
1*a3cefe7fSPierre Pronchery /*	$OpenBSD: strlcpy.c,v 1.10 2005/08/08 08:05:37 espie Exp $	*/
2*a3cefe7fSPierre Pronchery /*	$OpenBSD: strlcat.c,v 1.12 2005/03/30 20:13:52 otto Exp $	*/
3*a3cefe7fSPierre Pronchery 
4*a3cefe7fSPierre Pronchery /*
5*a3cefe7fSPierre Pronchery  * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
6*a3cefe7fSPierre Pronchery  *
7*a3cefe7fSPierre Pronchery  * Permission to use, copy, modify, and distribute this software for any
8*a3cefe7fSPierre Pronchery  * purpose with or without fee is hereby granted, provided that the above
9*a3cefe7fSPierre Pronchery  * copyright notice and this permission notice appear in all copies.
10*a3cefe7fSPierre Pronchery  *
11*a3cefe7fSPierre Pronchery  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12*a3cefe7fSPierre Pronchery  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13*a3cefe7fSPierre Pronchery  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14*a3cefe7fSPierre Pronchery  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15*a3cefe7fSPierre Pronchery  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16*a3cefe7fSPierre Pronchery  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17*a3cefe7fSPierre Pronchery  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18*a3cefe7fSPierre Pronchery  */
19*a3cefe7fSPierre Pronchery 
20*a3cefe7fSPierre Pronchery #include <stdlib.h>
21*a3cefe7fSPierre Pronchery #include <sys/types.h>
22*a3cefe7fSPierre Pronchery #include <string.h>
23*a3cefe7fSPierre Pronchery #include <errno.h>
24*a3cefe7fSPierre Pronchery #ifndef _WIN32
25*a3cefe7fSPierre Pronchery #include <unistd.h>
26*a3cefe7fSPierre Pronchery #endif
27*a3cefe7fSPierre Pronchery 
28*a3cefe7fSPierre Pronchery #include <libpkgconf/bsdstubs.h>
29*a3cefe7fSPierre Pronchery #include <libpkgconf/config.h>
30*a3cefe7fSPierre Pronchery 
31*a3cefe7fSPierre Pronchery #if !HAVE_DECL_STRLCPY
32*a3cefe7fSPierre Pronchery /*
33*a3cefe7fSPierre Pronchery  * Copy src to string dst of size siz.  At most siz-1 characters
34*a3cefe7fSPierre Pronchery  * will be copied.  Always NUL terminates (unless siz == 0).
35*a3cefe7fSPierre Pronchery  * Returns strlen(src); if retval >= siz, truncation occurred.
36*a3cefe7fSPierre Pronchery  */
37*a3cefe7fSPierre Pronchery static inline size_t
strlcpy(char * dst,const char * src,size_t siz)38*a3cefe7fSPierre Pronchery strlcpy(char *dst, const char *src, size_t siz)
39*a3cefe7fSPierre Pronchery {
40*a3cefe7fSPierre Pronchery 	char *d = dst;
41*a3cefe7fSPierre Pronchery 	const char *s = src;
42*a3cefe7fSPierre Pronchery 	size_t n = siz;
43*a3cefe7fSPierre Pronchery 
44*a3cefe7fSPierre Pronchery 	/* Copy as many bytes as will fit */
45*a3cefe7fSPierre Pronchery 	if (n != 0) {
46*a3cefe7fSPierre Pronchery 		while (--n != 0) {
47*a3cefe7fSPierre Pronchery 			if ((*d++ = *s++) == '\0')
48*a3cefe7fSPierre Pronchery 				break;
49*a3cefe7fSPierre Pronchery 		}
50*a3cefe7fSPierre Pronchery 	}
51*a3cefe7fSPierre Pronchery 
52*a3cefe7fSPierre Pronchery 	/* Not enough room in dst, add NUL and traverse rest of src */
53*a3cefe7fSPierre Pronchery 	if (n == 0) {
54*a3cefe7fSPierre Pronchery 		if (siz != 0)
55*a3cefe7fSPierre Pronchery 			*d = '\0';		/* NUL-terminate dst */
56*a3cefe7fSPierre Pronchery 		while (*s++)
57*a3cefe7fSPierre Pronchery 			;
58*a3cefe7fSPierre Pronchery 	}
59*a3cefe7fSPierre Pronchery 
60*a3cefe7fSPierre Pronchery 	return(s - src - 1);	/* count does not include NUL */
61*a3cefe7fSPierre Pronchery }
62*a3cefe7fSPierre Pronchery #endif
63*a3cefe7fSPierre Pronchery 
64*a3cefe7fSPierre Pronchery #if !HAVE_DECL_STRLCAT
65*a3cefe7fSPierre Pronchery /*
66*a3cefe7fSPierre Pronchery  * Appends src to string dst of size siz (unlike strncat, siz is the
67*a3cefe7fSPierre Pronchery  * full size of dst, not space left).  At most siz-1 characters
68*a3cefe7fSPierre Pronchery  * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
69*a3cefe7fSPierre Pronchery  * Returns strlen(src) + MIN(siz, strlen(initial dst)).
70*a3cefe7fSPierre Pronchery  * If retval >= siz, truncation occurred.
71*a3cefe7fSPierre Pronchery  */
72*a3cefe7fSPierre Pronchery static inline size_t
strlcat(char * dst,const char * src,size_t siz)73*a3cefe7fSPierre Pronchery strlcat(char *dst, const char *src, size_t siz)
74*a3cefe7fSPierre Pronchery {
75*a3cefe7fSPierre Pronchery 	char *d = dst;
76*a3cefe7fSPierre Pronchery 	const char *s = src;
77*a3cefe7fSPierre Pronchery 	size_t n = siz;
78*a3cefe7fSPierre Pronchery 	size_t dlen;
79*a3cefe7fSPierre Pronchery 
80*a3cefe7fSPierre Pronchery 	/* Find the end of dst and adjust bytes left but don't go past end */
81*a3cefe7fSPierre Pronchery 	while (n-- != 0 && *d != '\0')
82*a3cefe7fSPierre Pronchery 		d++;
83*a3cefe7fSPierre Pronchery 	dlen = d - dst;
84*a3cefe7fSPierre Pronchery 	n = siz - dlen;
85*a3cefe7fSPierre Pronchery 
86*a3cefe7fSPierre Pronchery 	if (n == 0)
87*a3cefe7fSPierre Pronchery 		return(dlen + strlen(s));
88*a3cefe7fSPierre Pronchery 	while (*s != '\0') {
89*a3cefe7fSPierre Pronchery 		if (n != 1) {
90*a3cefe7fSPierre Pronchery 			*d++ = *s;
91*a3cefe7fSPierre Pronchery 			n--;
92*a3cefe7fSPierre Pronchery 		}
93*a3cefe7fSPierre Pronchery 		s++;
94*a3cefe7fSPierre Pronchery 	}
95*a3cefe7fSPierre Pronchery 	*d = '\0';
96*a3cefe7fSPierre Pronchery 
97*a3cefe7fSPierre Pronchery 	return(dlen + (s - src));	/* count does not include NUL */
98*a3cefe7fSPierre Pronchery }
99*a3cefe7fSPierre Pronchery #endif
100*a3cefe7fSPierre Pronchery 
101*a3cefe7fSPierre Pronchery /*
102*a3cefe7fSPierre Pronchery  * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>.
103*a3cefe7fSPierre Pronchery  *
104*a3cefe7fSPierre Pronchery  * Permission to use, copy, modify, and/or distribute this software for any
105*a3cefe7fSPierre Pronchery  * purpose with or without fee is hereby granted, provided that the above
106*a3cefe7fSPierre Pronchery  * copyright notice and this permission notice appear in all copies.
107*a3cefe7fSPierre Pronchery  *
108*a3cefe7fSPierre Pronchery  * This software is provided 'as is' and without any warranty, express or
109*a3cefe7fSPierre Pronchery  * implied.  In no event shall the authors be liable for any damages arising
110*a3cefe7fSPierre Pronchery  * from the use of this software.
111*a3cefe7fSPierre Pronchery  */
112*a3cefe7fSPierre Pronchery 
113*a3cefe7fSPierre Pronchery #if !HAVE_DECL_STRNDUP
114*a3cefe7fSPierre Pronchery /*
115*a3cefe7fSPierre Pronchery  * Creates a memory buffer and copies at most 'len' characters to it.
116*a3cefe7fSPierre Pronchery  * If 'len' is less than the length of the source string, truncation occured.
117*a3cefe7fSPierre Pronchery  */
118*a3cefe7fSPierre Pronchery static inline char *
strndup(const char * src,size_t len)119*a3cefe7fSPierre Pronchery strndup(const char *src, size_t len)
120*a3cefe7fSPierre Pronchery {
121*a3cefe7fSPierre Pronchery 	char *out = malloc(len + 1);
122*a3cefe7fSPierre Pronchery 	pkgconf_strlcpy(out, src, len + 1);
123*a3cefe7fSPierre Pronchery 	return out;
124*a3cefe7fSPierre Pronchery }
125*a3cefe7fSPierre Pronchery #endif
126*a3cefe7fSPierre Pronchery 
127*a3cefe7fSPierre Pronchery #if !HAVE_DECL_PLEDGE
128*a3cefe7fSPierre Pronchery static inline int
pledge(const char * promises,const char * execpromises)129*a3cefe7fSPierre Pronchery pledge(const char *promises, const char *execpromises)
130*a3cefe7fSPierre Pronchery {
131*a3cefe7fSPierre Pronchery 	(void) promises;
132*a3cefe7fSPierre Pronchery 	(void) execpromises;
133*a3cefe7fSPierre Pronchery 
134*a3cefe7fSPierre Pronchery 	return 0;
135*a3cefe7fSPierre Pronchery }
136*a3cefe7fSPierre Pronchery #endif
137*a3cefe7fSPierre Pronchery 
138*a3cefe7fSPierre Pronchery #if !HAVE_DECL_UNVEIL
139*a3cefe7fSPierre Pronchery static inline int
unveil(const char * path,const char * permissions)140*a3cefe7fSPierre Pronchery unveil(const char *path, const char *permissions)
141*a3cefe7fSPierre Pronchery {
142*a3cefe7fSPierre Pronchery 	(void) path;
143*a3cefe7fSPierre Pronchery 	(void) permissions;
144*a3cefe7fSPierre Pronchery 
145*a3cefe7fSPierre Pronchery 	return 0;
146*a3cefe7fSPierre Pronchery }
147*a3cefe7fSPierre Pronchery #endif
148*a3cefe7fSPierre Pronchery 
149*a3cefe7fSPierre Pronchery size_t
pkgconf_strlcpy(char * dst,const char * src,size_t siz)150*a3cefe7fSPierre Pronchery pkgconf_strlcpy(char *dst, const char *src, size_t siz)
151*a3cefe7fSPierre Pronchery {
152*a3cefe7fSPierre Pronchery 	return strlcpy(dst, src, siz);
153*a3cefe7fSPierre Pronchery }
154*a3cefe7fSPierre Pronchery 
155*a3cefe7fSPierre Pronchery size_t
pkgconf_strlcat(char * dst,const char * src,size_t siz)156*a3cefe7fSPierre Pronchery pkgconf_strlcat(char *dst, const char *src, size_t siz)
157*a3cefe7fSPierre Pronchery {
158*a3cefe7fSPierre Pronchery 	return strlcat(dst, src, siz);
159*a3cefe7fSPierre Pronchery }
160*a3cefe7fSPierre Pronchery 
161*a3cefe7fSPierre Pronchery char *
pkgconf_strndup(const char * src,size_t len)162*a3cefe7fSPierre Pronchery pkgconf_strndup(const char *src, size_t len)
163*a3cefe7fSPierre Pronchery {
164*a3cefe7fSPierre Pronchery 	return strndup(src, len);
165*a3cefe7fSPierre Pronchery }
166*a3cefe7fSPierre Pronchery 
167*a3cefe7fSPierre Pronchery #if !HAVE_DECL_REALLOCARRAY
168*a3cefe7fSPierre Pronchery void *
reallocarray(void * ptr,size_t m,size_t n)169*a3cefe7fSPierre Pronchery reallocarray(void *ptr, size_t m, size_t n)
170*a3cefe7fSPierre Pronchery {
171*a3cefe7fSPierre Pronchery 	if (n && m > -1 / n)
172*a3cefe7fSPierre Pronchery 	{
173*a3cefe7fSPierre Pronchery 		errno = ENOMEM;
174*a3cefe7fSPierre Pronchery 		return 0;
175*a3cefe7fSPierre Pronchery 	}
176*a3cefe7fSPierre Pronchery 
177*a3cefe7fSPierre Pronchery 	return realloc(ptr, m * n);
178*a3cefe7fSPierre Pronchery }
179*a3cefe7fSPierre Pronchery #endif
180*a3cefe7fSPierre Pronchery 
181*a3cefe7fSPierre Pronchery void *
pkgconf_reallocarray(void * ptr,size_t m,size_t n)182*a3cefe7fSPierre Pronchery pkgconf_reallocarray(void *ptr, size_t m, size_t n)
183*a3cefe7fSPierre Pronchery {
184*a3cefe7fSPierre Pronchery 	return reallocarray(ptr, m, n);
185*a3cefe7fSPierre Pronchery }
186*a3cefe7fSPierre Pronchery 
187*a3cefe7fSPierre Pronchery int
pkgconf_pledge(const char * promises,const char * execpromises)188*a3cefe7fSPierre Pronchery pkgconf_pledge(const char *promises, const char *execpromises)
189*a3cefe7fSPierre Pronchery {
190*a3cefe7fSPierre Pronchery 	return pledge(promises, execpromises);
191*a3cefe7fSPierre Pronchery }
192*a3cefe7fSPierre Pronchery 
193*a3cefe7fSPierre Pronchery int
pkgconf_unveil(const char * path,const char * permissions)194*a3cefe7fSPierre Pronchery pkgconf_unveil(const char *path, const char *permissions)
195*a3cefe7fSPierre Pronchery {
196*a3cefe7fSPierre Pronchery 	return unveil(path, permissions);
197*a3cefe7fSPierre Pronchery }
198