1/* Checking macros for stdlib functions. 2 Copyright (C) 2005, 2007 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, write to the Free 17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18 02111-1307 USA. */ 19 20#ifndef _STDLIB_H 21# error "Never include <bits/stdlib.h> directly; use <stdlib.h> instead." 22#endif 23 24extern char *__realpath_chk (__const char *__restrict __name, 25 char *__restrict __resolved, 26 size_t __resolvedlen) __THROW __wur; 27extern char *__REDIRECT_NTH (__realpath_alias, 28 (__const char *__restrict __name, 29 char *__restrict __resolved), realpath) __wur; 30extern char *__REDIRECT_NTH (__realpath_chk_warn, 31 (__const char *__restrict __name, 32 char *__restrict __resolved, 33 size_t __resolvedlen), __realpath_chk) __wur 34 __warnattr ("second argument of realpath must be either NULL or at " 35 "least PATH_MAX bytes long buffer"); 36 37__extern_always_inline __wur char * 38__NTH (realpath (__const char *__restrict __name, char *__restrict __resolved)) 39{ 40 if (__bos (__resolved) != (size_t) -1) 41 { 42#if defined _LIBC_LIMITS_H_ && defined PATH_MAX 43 if (__bos (__resolved) < PATH_MAX) 44 return __realpath_chk_warn (__name, __resolved, __bos (__resolved)); 45#endif 46 return __realpath_chk (__name, __resolved, __bos (__resolved)); 47 } 48 49 return __realpath_alias (__name, __resolved); 50} 51 52 53extern int __ptsname_r_chk (int __fd, char *__buf, size_t __buflen, 54 size_t __nreal) __THROW __nonnull ((2)); 55extern int __REDIRECT_NTH (__ptsname_r_alias, (int __fd, char *__buf, 56 size_t __buflen), ptsname_r) 57 __nonnull ((2)); 58extern int __REDIRECT_NTH (__ptsname_r_chk_warn, 59 (int __fd, char *__buf, size_t __buflen, 60 size_t __nreal), __ptsname_r_chk) 61 __nonnull ((2)) __warnattr ("ptsname_r called with buflen bigger than " 62 "size of buf"); 63 64__extern_always_inline int 65__NTH (ptsname_r (int __fd, char *__buf, size_t __buflen)) 66{ 67 if (__bos (__buf) != (size_t) -1) 68 { 69 if (!__builtin_constant_p (__buflen)) 70 return __ptsname_r_chk (__fd, __buf, __buflen, __bos (__buf)); 71 if (__buflen > __bos (__buf)) 72 return __ptsname_r_chk_warn (__fd, __buf, __buflen, __bos (__buf)); 73 } 74 return __ptsname_r_alias (__fd, __buf, __buflen); 75} 76 77 78extern int __wctomb_chk (char *__s, wchar_t __wchar, size_t __buflen) 79 __THROW __wur; 80extern int __REDIRECT_NTH (__wctomb_alias, (char *__s, wchar_t __wchar), 81 wctomb) __wur; 82 83__extern_always_inline __wur int 84__NTH (wctomb (char *__s, wchar_t __wchar)) 85{ 86 /* We would have to include <limits.h> to get a definition of MB_LEN_MAX. 87 But this would only disturb the namespace. So we define our own 88 version here. */ 89#define __STDLIB_MB_LEN_MAX 16 90#if defined MB_LEN_MAX && MB_LEN_MAX != __STDLIB_MB_LEN_MAX 91# error "Assumed value of MB_LEN_MAX wrong" 92#endif 93 if (__bos (__s) != (size_t) -1 && __STDLIB_MB_LEN_MAX > __bos (__s)) 94 return __wctomb_chk (__s, __wchar, __bos (__s)); 95 return __wctomb_alias (__s, __wchar); 96} 97 98 99extern size_t __mbstowcs_chk (wchar_t *__restrict __dst, 100 __const char *__restrict __src, 101 size_t __len, size_t __dstlen) __THROW; 102extern size_t __REDIRECT_NTH (__mbstowcs_alias, 103 (wchar_t *__restrict __dst, 104 __const char *__restrict __src, 105 size_t __len), mbstowcs); 106extern size_t __REDIRECT_NTH (__mbstowcs_chk_warn, 107 (wchar_t *__restrict __dst, 108 __const char *__restrict __src, 109 size_t __len, size_t __dstlen), __mbstowcs_chk) 110 __warnattr ("mbstowcs called with dst buffer smaller than len " 111 "* sizeof (wchar_t)"); 112 113__extern_always_inline size_t 114__NTH (mbstowcs (wchar_t *__restrict __dst, __const char *__restrict __src, 115 size_t __len)) 116{ 117 if (__bos (__dst) != (size_t) -1) 118 { 119 if (!__builtin_constant_p (__len)) 120 return __mbstowcs_chk (__dst, __src, __len, 121 __bos (__dst) / sizeof (wchar_t)); 122 123 if (__len > __bos (__dst) / sizeof (wchar_t)) 124 return __mbstowcs_chk_warn (__dst, __src, __len, 125 __bos (__dst) / sizeof (wchar_t)); 126 } 127 return __mbstowcs_alias (__dst, __src, __len); 128} 129 130 131extern size_t __wcstombs_chk (char *__restrict __dst, 132 __const wchar_t *__restrict __src, 133 size_t __len, size_t __dstlen) __THROW; 134extern size_t __REDIRECT_NTH (__wcstombs_alias, 135 (char *__restrict __dst, 136 __const wchar_t *__restrict __src, 137 size_t __len), wcstombs); 138extern size_t __REDIRECT_NTH (__wcstombs_chk_warn, 139 (char *__restrict __dst, 140 __const wchar_t *__restrict __src, 141 size_t __len, size_t __dstlen), __wcstombs_chk) 142 __warnattr ("wcstombs called with dst buffer smaller than len"); 143 144__extern_always_inline size_t 145__NTH (wcstombs (char *__restrict __dst, __const wchar_t *__restrict __src, 146 size_t __len)) 147{ 148 if (__bos (__dst) != (size_t) -1) 149 { 150 if (!__builtin_constant_p (__len)) 151 return __wcstombs_chk (__dst, __src, __len, __bos (__dst)); 152 if (__len > __bos (__dst)) 153 return __wcstombs_chk_warn (__dst, __src, __len, __bos (__dst)); 154 } 155 return __wcstombs_alias (__dst, __src, __len); 156} 157