Ignore:
Timestamp:
Sep 19, 2024, 2:34:43 AM (10 months ago)
Author:
bird
Message:

src/sed: Merged in changes between 4.1.5 and 4.9 from the vendor branch. (svn merge /vendor/sed/4.1.5 /vendor/sed/current .)

Location:
trunk/src/sed
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sed

  • trunk/src/sed/lib/strerror.c

    r599 r3613  
    1 /* strerror -- return a string corresponding to an error number.
    2    This is a quickie version only intended as compatability glue
    3    for systems which predate the ANSI C definition of the function;
    4    the glibc version is recommended for more general use.
     1/* strerror.c --- POSIX compatible system error routine
    52
    6    Copyright (C) 1998 Free Software Foundation, Inc.
     3   Copyright (C) 2007-2022 Free Software Foundation, Inc.
    74
    8    This program is free software; you can redistribute it and/or modify it
    9    under the terms of the GNU General Public License as published by the
    10    Free Software Foundation; either version 2, or (at your option) any
    11    later version.
     5   This file is free software: you can redistribute it and/or modify
     6   it under the terms of the GNU Lesser General Public License as
     7   published by the Free Software Foundation; either version 2.1 of the
     8   License, or (at your option) any later version.
    129
    13    This program is distributed in the hope that it will be useful,
     10   This file is distributed in the hope that it will be useful,
    1411   but WITHOUT ANY WARRANTY; without even the implied warranty of
    1512   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    16    GNU General Public License for more details.
     13   GNU Lesser General Public License for more details.
    1714
    18    You should have received a copy of the GNU General Public License
    19    along with this program; if not, write to the Free Software
    20    Foundation, 51 Franklin Street, Fifth Floor,
    21    Boston, MA 02110-1301, USA.  */
     15   You should have received a copy of the GNU Lesser General Public License
     16   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
    2217
    23 #include "config.h"
     18#include <config.h>
    2419
    25 #ifndef HAVE_STRERROR
     20/* Specification.  */
     21#include <string.h>
    2622
    27 # ifndef BOOTSTRAP
    28 #  include <stdio.h>
    29 # endif
    30 # ifdef HAVE_STRING_H
    31 #  include <string.h>
    32 # endif
    33 # include <errno.h>
    34 # undef strerror
     23#include <errno.h>
     24#include <stdio.h>
     25#include <stdlib.h>
     26#include <string.h>
    3527
    36 extern int sys_nerr;
    37 extern char *sys_errlist[];
     28#include "intprops.h"
     29#include "strerror-override.h"
     30
     31/* Use the system functions, not the gnulib overrides in this file.  */
     32#undef sprintf
    3833
    3934char *
    40 strerror(e)
    41   int e;
     35strerror (int n)
     36#undef strerror
    4237{
    43   static char unknown_string[] =
    44     "Unknown error code #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
     38  static char buf[STACKBUF_LEN];
     39  size_t len;
    4540
    46   if (0<=e && e<sys_nerr)
    47     return sys_errlist[e];
    48   sprintf(unknown_string+20, "%d", e);
    49   return unknown_string;
     41  /* Cast away const, due to the historical signature of strerror;
     42     callers should not be modifying the string.  */
     43  const char *msg = strerror_override (n);
     44  if (msg)
     45    return (char *) msg;
     46
     47  msg = strerror (n);
     48
     49  /* Our strerror_r implementation might use the system's strerror
     50     buffer, so all other clients of strerror have to see the error
     51     copied into a buffer that we manage.  This is not thread-safe,
     52     even if the system strerror is, but portable programs shouldn't
     53     be using strerror if they care about thread-safety.  */
     54  if (!msg || !*msg)
     55    {
     56      static char const fmt[] = "Unknown error %d";
     57      static_assert (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n));
     58      sprintf (buf, fmt, n);
     59      errno = EINVAL;
     60      return buf;
     61    }
     62
     63  /* Fix STACKBUF_LEN if this ever aborts.  */
     64  len = strlen (msg);
     65  if (sizeof buf <= len)
     66    abort ();
     67
     68  memcpy (buf, msg, len + 1);
     69  return buf;
    5070}
    51 
    52 #endif /* !HAVE_STRERROR */
Note: See TracChangeset for help on using the changeset viewer.