Home | History | Annotate | Download | only in bits
      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 
     24 extern char *__realpath_chk (__const char *__restrict __name,
     25 			     char *__restrict __resolved,
     26 			     size_t __resolvedlen) __THROW __wur;
     27 extern char *__REDIRECT_NTH (__realpath_alias,
     28 			     (__const char *__restrict __name,
     29 			      char *__restrict __resolved), realpath) __wur;
     30 extern 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 
     53 extern int __ptsname_r_chk (int __fd, char *__buf, size_t __buflen,
     54 			    size_t __nreal) __THROW __nonnull ((2));
     55 extern int __REDIRECT_NTH (__ptsname_r_alias, (int __fd, char *__buf,
     56 					       size_t __buflen), ptsname_r)
     57      __nonnull ((2));
     58 extern 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 
     78 extern int __wctomb_chk (char *__s, wchar_t __wchar, size_t __buflen)
     79   __THROW __wur;
     80 extern 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 
     99 extern size_t __mbstowcs_chk (wchar_t *__restrict __dst,
    100 			      __const char *__restrict __src,
    101 			      size_t __len, size_t __dstlen) __THROW;
    102 extern size_t __REDIRECT_NTH (__mbstowcs_alias,
    103 			      (wchar_t *__restrict __dst,
    104 			       __const char *__restrict __src,
    105 			       size_t __len), mbstowcs);
    106 extern 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 
    131 extern size_t __wcstombs_chk (char *__restrict __dst,
    132 			      __const wchar_t *__restrict __src,
    133 			      size_t __len, size_t __dstlen) __THROW;
    134 extern size_t __REDIRECT_NTH (__wcstombs_alias,
    135 			      (char *__restrict __dst,
    136 			       __const wchar_t *__restrict __src,
    137 			       size_t __len), wcstombs);
    138 extern 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