mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
6ec2e0f5bd
These two modules are necessary because of the rework that will be done in the "change directory" logic on GDB/gdbserver in the next commits. First, we will get rid of the "gdb_dirbuf" global variable and instead rely on the fact that "getcwd (NULL, 0)", which is a GNU extension, returns a heap-allocated string with the necessary bytes to hold the full path. This is a good practice not only because globals are not ideal but also because there is no good way to know beforehand the size of the full pathname allowed in the filesystem ("PATH_MAX" is not portable and does not reflect all the possible filesystems out there). We will also have a way to "cd" to a directory also on gdbserver, but in order to do that uniformly, there must be a way to do tilde expansion on directories provided by the user. Currently, GDB uses "tilde_expand" from readline to do that, but gdbserver doesn't link against readline and therefore cannot use this function. The solution is to use "glob" instead, which can perform tilde expansion as a GNU extension. Therefore, we need gnulib's version of "glob". A special note is necessary for gdb/ser-tcp.c. It defines "close" as "closesocket" on Win32 targets. If we leave the code as is, this would conflict with gnulib's definition of "close". Therefore, in order to keep the same code path from before this import, I decided to "#undef close" first, and then let the original (re)definition of it take place. gdb/ChangeLog: 2017-09-22 Sergio Durigan Junior <sergiodj@redhat.com> * gnulib/aclocal.m4: Regenerate. * gnulib/config.in: Regenerate. * gnulib/configure: Regenerate. * gnulib/import/Makefile.am: Regenerate. * gnulib/import/Makefile.in: Regenerate. * gnulib/import/assure.h: New file. * gnulib/import/at-func.c: Likewise * gnulib/import/chdir-long.c: New file. * gnulib/import/chdir-long.h: New file. * gnulib/import/cloexec.c: New file. * gnulib/import/cloexec.h: New file. * gnulib/import/close.c: New file. * gnulib/import/closedir.c: New file. * gnulib/import/dirent-private.h: New file. * gnulib/import/dup-safer.c: New file. * gnulib/import/dup.c: New file. * gnulib/import/dup2.c: New file. * gnulib/import/error.c: New file. * gnulib/import/error.h: New file. * gnulib/import/exitfail.c: New file. * gnulib/import/exitfail.h: New file. * gnulib/import/fchdir.c: New file. * gnulib/import/fcntl.c: New file. * gnulib/import/fcntl.in.h: New file. * gnulib/import/fd-hook.c: New file. * gnulib/import/fd-hook.h: New file. * gnulib/import/fd-safer.c: New file. * gnulib/import/fdopendir.c: New file. * gnulib/import/filename.h: New file. * gnulib/import/filenamecat-lgpl.c: New file. * gnulib/import/filenamecat.h: New file. * gnulib/import/fstat.c: New file. * gnulib/import/fstatat.c: New file. * gnulib/import/getcwd-lgpl.c: New file. * gnulib/import/getcwd.c: New file. * gnulib/import/getdtablesize.c: New file. * gnulib/import/getlogin_r.c: New file. * gnulib/import/getprogname.c: New file. * gnulib/import/getprogname.h: New file. * gnulib/import/gettext.h: New file. * gnulib/import/glob-libc.h: New file. * gnulib/import/glob.c: New file. * gnulib/import/glob.in.h: New file. * gnulib/import/intprops.h: New file. * gnulib/import/m4/chdir-long.m4: New file. * gnulib/import/m4/close.m4: New file. * gnulib/import/m4/closedir.m4: New file. * gnulib/import/m4/d-ino.m4: New file. * gnulib/import/m4/d-type.m4: New file. * gnulib/import/m4/dup.m4: New file. * gnulib/import/m4/dup2.m4: New file. * gnulib/import/m4/error.m4: New file. * gnulib/import/m4/fchdir.m4: New file. * gnulib/import/m4/fcntl.m4: New file. * gnulib/import/m4/fcntl_h.m4: New file. * gnulib/import/m4/fdopendir.m4: New file. * gnulib/import/m4/filenamecat.m4: New file. * gnulib/import/m4/fstat.m4: New file. * gnulib/import/m4/fstatat.m4: New file. * gnulib/import/m4/getcwd-abort-bug.m4: New file. * gnulib/import/m4/getcwd-path-max.m4: New file. * gnulib/import/m4/getcwd.m4: New file. * gnulib/import/m4/getdtablesize.m4: New file. * gnulib/import/m4/getlogin_r.m4: New file. * gnulib/import/m4/getprogname.m4: New file. * gnulib/import/m4/glob.m4: New file. * gnulib/import/m4/gnulib-cache.m4: Regenerate. * gnulib/import/m4/gnulib-comp.m4: Regenerate. * gnulib/import/m4/mempcpy.m4: New file. * gnulib/import/m4/memrchr.m4: New file. * gnulib/import/m4/mode_t.m4: New file. * gnulib/import/m4/msvc-inval.m4: New file. * gnulib/import/m4/msvc-nothrow.m4: New file. * gnulib/import/m4/open.m4: New file. * gnulib/import/m4/openat.m4: New file. * gnulib/import/m4/opendir.m4: New file. * gnulib/import/m4/readdir.m4: New file. * gnulib/import/m4/realloc.m4: New file. * gnulib/import/m4/rewinddir.m4: New file. * gnulib/import/m4/save-cwd.m4: New file. * gnulib/import/m4/strdup.m4: New file. * gnulib/import/m4/strerror.m4: New file. * gnulib/import/m4/unistd-safer.m4: New file. * gnulib/import/mempcpy.c: New file. * gnulib/import/memrchr.c: New file. * gnulib/import/msvc-inval.c: New file. * gnulib/import/msvc-inval.h: New file. * gnulib/import/msvc-nothrow.c: New file. * gnulib/import/msvc-nothrow.h: New file. * gnulib/import/open.c: New file. * gnulib/import/openat-die.c: New file. * gnulib/import/openat-priv.h: New file. * gnulib/import/openat-proc.c: New file. * gnulib/import/openat.c: New file. * gnulib/import/openat.h: New file. * gnulib/import/opendir.c: New file. * gnulib/import/pipe-safer.c: New file. * gnulib/import/readdir.c: New file. * gnulib/import/realloc.c: New file. * gnulib/import/rewinddir.c: New file. * gnulib/import/save-cwd.c: New file. * gnulib/import/save-cwd.h: New file. * gnulib/import/strdup.c: New file. * gnulib/import/strerror-override.c: New file. * gnulib/import/strerror-override.h: New file. * gnulib/import/strerror.c: New file. * gnulib/import/unistd--.h: New file. * gnulib/import/unistd-safer.h: New file. * gnulib/update-gnulib.sh (IMPORTED_GNULIB_MODULES): Add "getcwd" and "glob". * ser-tcp.c: Undefine "close" before redefining it.
303 lines
8.8 KiB
C
303 lines
8.8 KiB
C
/* strerror-override.c --- POSIX compatible system error routine
|
|
|
|
Copyright (C) 2010-2016 Free Software Foundation, Inc.
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
|
|
|
|
#include <config.h>
|
|
|
|
#include "strerror-override.h"
|
|
|
|
#include <errno.h>
|
|
|
|
#if GNULIB_defined_EWINSOCK /* native Windows platforms */
|
|
# if HAVE_WINSOCK2_H
|
|
# include <winsock2.h>
|
|
# endif
|
|
#endif
|
|
|
|
/* If ERRNUM maps to an errno value defined by gnulib, return a string
|
|
describing the error. Otherwise return NULL. */
|
|
const char *
|
|
strerror_override (int errnum)
|
|
{
|
|
/* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */
|
|
switch (errnum)
|
|
{
|
|
#if REPLACE_STRERROR_0
|
|
case 0:
|
|
return "Success";
|
|
#endif
|
|
|
|
#if GNULIB_defined_ESOCK /* native Windows platforms with older <errno.h> */
|
|
case EINPROGRESS:
|
|
return "Operation now in progress";
|
|
case EALREADY:
|
|
return "Operation already in progress";
|
|
case ENOTSOCK:
|
|
return "Socket operation on non-socket";
|
|
case EDESTADDRREQ:
|
|
return "Destination address required";
|
|
case EMSGSIZE:
|
|
return "Message too long";
|
|
case EPROTOTYPE:
|
|
return "Protocol wrong type for socket";
|
|
case ENOPROTOOPT:
|
|
return "Protocol not available";
|
|
case EPROTONOSUPPORT:
|
|
return "Protocol not supported";
|
|
case EOPNOTSUPP:
|
|
return "Operation not supported";
|
|
case EAFNOSUPPORT:
|
|
return "Address family not supported by protocol";
|
|
case EADDRINUSE:
|
|
return "Address already in use";
|
|
case EADDRNOTAVAIL:
|
|
return "Cannot assign requested address";
|
|
case ENETDOWN:
|
|
return "Network is down";
|
|
case ENETUNREACH:
|
|
return "Network is unreachable";
|
|
case ECONNRESET:
|
|
return "Connection reset by peer";
|
|
case ENOBUFS:
|
|
return "No buffer space available";
|
|
case EISCONN:
|
|
return "Transport endpoint is already connected";
|
|
case ENOTCONN:
|
|
return "Transport endpoint is not connected";
|
|
case ETIMEDOUT:
|
|
return "Connection timed out";
|
|
case ECONNREFUSED:
|
|
return "Connection refused";
|
|
case ELOOP:
|
|
return "Too many levels of symbolic links";
|
|
case EHOSTUNREACH:
|
|
return "No route to host";
|
|
case EWOULDBLOCK:
|
|
return "Operation would block";
|
|
#endif
|
|
#if GNULIB_defined_ESTREAMS /* native Windows platforms with older <errno.h> */
|
|
case ETXTBSY:
|
|
return "Text file busy";
|
|
case ENODATA:
|
|
return "No data available";
|
|
case ENOSR:
|
|
return "Out of streams resources";
|
|
case ENOSTR:
|
|
return "Device not a stream";
|
|
case ETIME:
|
|
return "Timer expired";
|
|
case EOTHER:
|
|
return "Other error";
|
|
#endif
|
|
#if GNULIB_defined_EWINSOCK /* native Windows platforms */
|
|
case ESOCKTNOSUPPORT:
|
|
return "Socket type not supported";
|
|
case EPFNOSUPPORT:
|
|
return "Protocol family not supported";
|
|
case ESHUTDOWN:
|
|
return "Cannot send after transport endpoint shutdown";
|
|
case ETOOMANYREFS:
|
|
return "Too many references: cannot splice";
|
|
case EHOSTDOWN:
|
|
return "Host is down";
|
|
case EPROCLIM:
|
|
return "Too many processes";
|
|
case EUSERS:
|
|
return "Too many users";
|
|
case EDQUOT:
|
|
return "Disk quota exceeded";
|
|
case ESTALE:
|
|
return "Stale NFS file handle";
|
|
case EREMOTE:
|
|
return "Object is remote";
|
|
# if HAVE_WINSOCK2_H
|
|
/* WSA_INVALID_HANDLE maps to EBADF */
|
|
/* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */
|
|
/* WSA_INVALID_PARAMETER maps to EINVAL */
|
|
case WSA_OPERATION_ABORTED:
|
|
return "Overlapped operation aborted";
|
|
case WSA_IO_INCOMPLETE:
|
|
return "Overlapped I/O event object not in signaled state";
|
|
case WSA_IO_PENDING:
|
|
return "Overlapped operations will complete later";
|
|
/* WSAEINTR maps to EINTR */
|
|
/* WSAEBADF maps to EBADF */
|
|
/* WSAEACCES maps to EACCES */
|
|
/* WSAEFAULT maps to EFAULT */
|
|
/* WSAEINVAL maps to EINVAL */
|
|
/* WSAEMFILE maps to EMFILE */
|
|
/* WSAEWOULDBLOCK maps to EWOULDBLOCK */
|
|
/* WSAEINPROGRESS maps to EINPROGRESS */
|
|
/* WSAEALREADY maps to EALREADY */
|
|
/* WSAENOTSOCK maps to ENOTSOCK */
|
|
/* WSAEDESTADDRREQ maps to EDESTADDRREQ */
|
|
/* WSAEMSGSIZE maps to EMSGSIZE */
|
|
/* WSAEPROTOTYPE maps to EPROTOTYPE */
|
|
/* WSAENOPROTOOPT maps to ENOPROTOOPT */
|
|
/* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */
|
|
/* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */
|
|
/* WSAEOPNOTSUPP maps to EOPNOTSUPP */
|
|
/* WSAEPFNOSUPPORT is EPFNOSUPPORT */
|
|
/* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */
|
|
/* WSAEADDRINUSE maps to EADDRINUSE */
|
|
/* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */
|
|
/* WSAENETDOWN maps to ENETDOWN */
|
|
/* WSAENETUNREACH maps to ENETUNREACH */
|
|
/* WSAENETRESET maps to ENETRESET */
|
|
/* WSAECONNABORTED maps to ECONNABORTED */
|
|
/* WSAECONNRESET maps to ECONNRESET */
|
|
/* WSAENOBUFS maps to ENOBUFS */
|
|
/* WSAEISCONN maps to EISCONN */
|
|
/* WSAENOTCONN maps to ENOTCONN */
|
|
/* WSAESHUTDOWN is ESHUTDOWN */
|
|
/* WSAETOOMANYREFS is ETOOMANYREFS */
|
|
/* WSAETIMEDOUT maps to ETIMEDOUT */
|
|
/* WSAECONNREFUSED maps to ECONNREFUSED */
|
|
/* WSAELOOP maps to ELOOP */
|
|
/* WSAENAMETOOLONG maps to ENAMETOOLONG */
|
|
/* WSAEHOSTDOWN is EHOSTDOWN */
|
|
/* WSAEHOSTUNREACH maps to EHOSTUNREACH */
|
|
/* WSAENOTEMPTY maps to ENOTEMPTY */
|
|
/* WSAEPROCLIM is EPROCLIM */
|
|
/* WSAEUSERS is EUSERS */
|
|
/* WSAEDQUOT is EDQUOT */
|
|
/* WSAESTALE is ESTALE */
|
|
/* WSAEREMOTE is EREMOTE */
|
|
case WSASYSNOTREADY:
|
|
return "Network subsystem is unavailable";
|
|
case WSAVERNOTSUPPORTED:
|
|
return "Winsock.dll version out of range";
|
|
case WSANOTINITIALISED:
|
|
return "Successful WSAStartup not yet performed";
|
|
case WSAEDISCON:
|
|
return "Graceful shutdown in progress";
|
|
case WSAENOMORE: case WSA_E_NO_MORE:
|
|
return "No more results";
|
|
case WSAECANCELLED: case WSA_E_CANCELLED:
|
|
return "Call was canceled";
|
|
case WSAEINVALIDPROCTABLE:
|
|
return "Procedure call table is invalid";
|
|
case WSAEINVALIDPROVIDER:
|
|
return "Service provider is invalid";
|
|
case WSAEPROVIDERFAILEDINIT:
|
|
return "Service provider failed to initialize";
|
|
case WSASYSCALLFAILURE:
|
|
return "System call failure";
|
|
case WSASERVICE_NOT_FOUND:
|
|
return "Service not found";
|
|
case WSATYPE_NOT_FOUND:
|
|
return "Class type not found";
|
|
case WSAEREFUSED:
|
|
return "Database query was refused";
|
|
case WSAHOST_NOT_FOUND:
|
|
return "Host not found";
|
|
case WSATRY_AGAIN:
|
|
return "Nonauthoritative host not found";
|
|
case WSANO_RECOVERY:
|
|
return "Nonrecoverable error";
|
|
case WSANO_DATA:
|
|
return "Valid name, no data record of requested type";
|
|
/* WSA_QOS_* omitted */
|
|
# endif
|
|
#endif
|
|
|
|
#if GNULIB_defined_ENOMSG
|
|
case ENOMSG:
|
|
return "No message of desired type";
|
|
#endif
|
|
|
|
#if GNULIB_defined_EIDRM
|
|
case EIDRM:
|
|
return "Identifier removed";
|
|
#endif
|
|
|
|
#if GNULIB_defined_ENOLINK
|
|
case ENOLINK:
|
|
return "Link has been severed";
|
|
#endif
|
|
|
|
#if GNULIB_defined_EPROTO
|
|
case EPROTO:
|
|
return "Protocol error";
|
|
#endif
|
|
|
|
#if GNULIB_defined_EMULTIHOP
|
|
case EMULTIHOP:
|
|
return "Multihop attempted";
|
|
#endif
|
|
|
|
#if GNULIB_defined_EBADMSG
|
|
case EBADMSG:
|
|
return "Bad message";
|
|
#endif
|
|
|
|
#if GNULIB_defined_EOVERFLOW
|
|
case EOVERFLOW:
|
|
return "Value too large for defined data type";
|
|
#endif
|
|
|
|
#if GNULIB_defined_ENOTSUP
|
|
case ENOTSUP:
|
|
return "Not supported";
|
|
#endif
|
|
|
|
#if GNULIB_defined_ENETRESET
|
|
case ENETRESET:
|
|
return "Network dropped connection on reset";
|
|
#endif
|
|
|
|
#if GNULIB_defined_ECONNABORTED
|
|
case ECONNABORTED:
|
|
return "Software caused connection abort";
|
|
#endif
|
|
|
|
#if GNULIB_defined_ESTALE
|
|
case ESTALE:
|
|
return "Stale NFS file handle";
|
|
#endif
|
|
|
|
#if GNULIB_defined_EDQUOT
|
|
case EDQUOT:
|
|
return "Disk quota exceeded";
|
|
#endif
|
|
|
|
#if GNULIB_defined_ECANCELED
|
|
case ECANCELED:
|
|
return "Operation canceled";
|
|
#endif
|
|
|
|
#if GNULIB_defined_EOWNERDEAD
|
|
case EOWNERDEAD:
|
|
return "Owner died";
|
|
#endif
|
|
|
|
#if GNULIB_defined_ENOTRECOVERABLE
|
|
case ENOTRECOVERABLE:
|
|
return "State not recoverable";
|
|
#endif
|
|
|
|
#if GNULIB_defined_EILSEQ
|
|
case EILSEQ:
|
|
return "Invalid or incomplete multibyte or wide character";
|
|
#endif
|
|
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|