Annotation of embedaddon/libiconv/srclib/strerror.c, revision 1.1.1.2

1.1       misho       1: /* strerror.c --- POSIX compatible system error routine
                      2: 
1.1.1.2 ! misho       3:    Copyright (C) 2007-2011 Free Software Foundation, Inc.
1.1       misho       4: 
                      5:    This program is free software: you can redistribute it and/or modify
                      6:    it under the terms of the GNU General Public License as published by
                      7:    the Free Software Foundation; either version 3 of the License, or
                      8:    (at your option) any later version.
                      9: 
                     10:    This program 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
                     13:    GNU General Public License for more details.
                     14: 
                     15:    You should have received a copy of the GNU General Public License
                     16:    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
                     17: 
                     18: #include <config.h>
                     19: 
1.1.1.2 ! misho      20: /* Specification.  */
1.1       misho      21: #include <string.h>
                     22: 
1.1.1.2 ! misho      23: #include <errno.h>
        !            24: #include <stdio.h>
        !            25: #include <stdlib.h>
        !            26: #include <string.h>
1.1       misho      27: 
1.1.1.2 ! misho      28: #include "intprops.h"
        !            29: #include "strerror-override.h"
        !            30: #include "verify.h"
1.1       misho      31: 
1.1.1.2 ! misho      32: /* Use the system functions, not the gnulib overrides in this file.  */
        !            33: #undef sprintf
1.1       misho      34: 
                     35: char *
1.1.1.2 ! misho      36: strerror (int n)
        !            37: #undef strerror
1.1       misho      38: {
1.1.1.2 ! misho      39:   static char buf[STACKBUF_LEN];
        !            40:   size_t len;
1.1       misho      41: 
1.1.1.2 ! misho      42:   /* Cast away const, due to the historical signature of strerror;
        !            43:      callers should not be modifying the string.  */
        !            44:   const char *msg = strerror_override (n);
1.1       misho      45:   if (msg)
                     46:     return (char *) msg;
                     47: 
1.1.1.2 ! misho      48:   msg = strerror (n);
1.1       misho      49: 
1.1.1.2 ! misho      50:   /* Our strerror_r implementation might use the system's strerror
        !            51:      buffer, so all other clients of strerror have to see the error
        !            52:      copied into a buffer that we manage.  This is not thread-safe,
        !            53:      even if the system strerror is, but portable programs shouldn't
        !            54:      be using strerror if they care about thread-safety.  */
        !            55:   if (!msg || !*msg)
        !            56:     {
        !            57:       static char const fmt[] = "Unknown error %d";
        !            58:       verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n));
        !            59:       sprintf (buf, fmt, n);
        !            60:       errno = EINVAL;
        !            61:       return buf;
        !            62:     }
1.1       misho      63: 
1.1.1.2 ! misho      64:   /* Fix STACKBUF_LEN if this ever aborts.  */
        !            65:   len = strlen (msg);
        !            66:   if (sizeof buf <= len)
        !            67:     abort ();
1.1       misho      68: 
1.1.1.2 ! misho      69:   return memcpy (buf, msg, len + 1);
        !            70: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>