/*
 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
 * Copyright (c) 2016-2017 The strace developers.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "tests.h"
#include <errno.h>

#define CASE(x) case x: return #x

const char *
errno2name(void)
{
	switch (errno) {
	/* names taken from linux/errnoent.h */
#ifdef E2BIG
	CASE(E2BIG);
#endif
#ifdef EACCES
	CASE(EACCES);
#endif
#ifdef EADDRINUSE
	CASE(EADDRINUSE);
#endif
#ifdef EADDRNOTAVAIL
	CASE(EADDRNOTAVAIL);
#endif
#ifdef EADV
	CASE(EADV);
#endif
#ifdef EAFNOSUPPORT
	CASE(EAFNOSUPPORT);
#endif
#ifdef EAGAIN
	CASE(EAGAIN);
#endif
#ifdef EALREADY
	CASE(EALREADY);
#endif
#ifdef EBADCOOKIE
	CASE(EBADCOOKIE);
#endif
#ifdef EBADE
	CASE(EBADE);
#endif
#ifdef EBADF
	CASE(EBADF);
#endif
#ifdef EBADFD
	CASE(EBADFD);
#endif
#ifdef EBADHANDLE
	CASE(EBADHANDLE);
#endif
#ifdef EBADMSG
	CASE(EBADMSG);
#endif
#ifdef EBADR
	CASE(EBADR);
#endif
#ifdef EBADRQC
	CASE(EBADRQC);
#endif
#ifdef EBADSLT
	CASE(EBADSLT);
#endif
#ifdef EBADTYPE
	CASE(EBADTYPE);
#endif
#ifdef EBFONT
	CASE(EBFONT);
#endif
#ifdef EBUSY
	CASE(EBUSY);
#endif
#ifdef ECANCELED
	CASE(ECANCELED);
#endif
#ifdef ECHILD
	CASE(ECHILD);
#endif
#ifdef ECHRNG
	CASE(ECHRNG);
#endif
#ifdef ECOMM
	CASE(ECOMM);
#endif
#ifdef ECONNABORTED
	CASE(ECONNABORTED);
#endif
#ifdef ECONNREFUSED
	CASE(ECONNREFUSED);
#endif
#ifdef ECONNRESET
	CASE(ECONNRESET);
#endif
#ifdef EDEADLK
	CASE(EDEADLK);
#endif
#ifdef EDESTADDRREQ
	CASE(EDESTADDRREQ);
#endif
#ifdef EDOM
	CASE(EDOM);
#endif
#ifdef EDOTDOT
	CASE(EDOTDOT);
#endif
#ifdef EDQUOT
	CASE(EDQUOT);
#endif
#ifdef EEXIST
	CASE(EEXIST);
#endif
#ifdef EFAULT
	CASE(EFAULT);
#endif
#ifdef EFBIG
	CASE(EFBIG);
#endif
#ifdef EHOSTDOWN
	CASE(EHOSTDOWN);
#endif
#ifdef EHOSTUNREACH
	CASE(EHOSTUNREACH);
#endif
#ifdef EHWPOISON
	CASE(EHWPOISON);
#endif
#ifdef EIDRM
	CASE(EIDRM);
#endif
#ifdef EILSEQ
	CASE(EILSEQ);
#endif
#ifdef EINPROGRESS
	CASE(EINPROGRESS);
#endif
#ifdef EINTR
	CASE(EINTR);
#endif
#ifdef EINVAL
	CASE(EINVAL);
#endif
#ifdef EIO
	CASE(EIO);
#endif
#ifdef EIOCBQUEUED
	CASE(EIOCBQUEUED);
#endif
#ifdef EISCONN
	CASE(EISCONN);
#endif
#ifdef EISDIR
	CASE(EISDIR);
#endif
#ifdef EISNAM
	CASE(EISNAM);
#endif
#ifdef EJUKEBOX
	CASE(EJUKEBOX);
#endif
#ifdef EKEYEXPIRED
	CASE(EKEYEXPIRED);
#endif
#ifdef EKEYREJECTED
	CASE(EKEYREJECTED);
#endif
#ifdef EKEYREVOKED
	CASE(EKEYREVOKED);
#endif
#ifdef EL2HLT
	CASE(EL2HLT);
#endif
#ifdef EL2NSYNC
	CASE(EL2NSYNC);
#endif
#ifdef EL3HLT
	CASE(EL3HLT);
#endif
#ifdef EL3RST
	CASE(EL3RST);
#endif
#ifdef ELIBACC
	CASE(ELIBACC);
#endif
#ifdef ELIBBAD
	CASE(ELIBBAD);
#endif
#ifdef ELIBEXEC
	CASE(ELIBEXEC);
#endif
#ifdef ELIBMAX
	CASE(ELIBMAX);
#endif
#ifdef ELIBSCN
	CASE(ELIBSCN);
#endif
#ifdef ELNRNG
	CASE(ELNRNG);
#endif
#ifdef ELOOP
	CASE(ELOOP);
#endif
#ifdef EMEDIUMTYPE
	CASE(EMEDIUMTYPE);
#endif
#ifdef EMFILE
	CASE(EMFILE);
#endif
#ifdef EMLINK
	CASE(EMLINK);
#endif
#ifdef EMSGSIZE
	CASE(EMSGSIZE);
#endif
#ifdef EMULTIHOP
	CASE(EMULTIHOP);
#endif
#ifdef ENAMETOOLONG
	CASE(ENAMETOOLONG);
#endif
#ifdef ENAVAIL
	CASE(ENAVAIL);
#endif
#ifdef ENETDOWN
	CASE(ENETDOWN);
#endif
#ifdef ENETRESET
	CASE(ENETRESET);
#endif
#ifdef ENETUNREACH
	CASE(ENETUNREACH);
#endif
#ifdef ENFILE
	CASE(ENFILE);
#endif
#ifdef ENOANO
	CASE(ENOANO);
#endif
#ifdef ENOBUFS
	CASE(ENOBUFS);
#endif
#ifdef ENOCSI
	CASE(ENOCSI);
#endif
#ifdef ENODATA
	CASE(ENODATA);
#endif
#ifdef ENODEV
	CASE(ENODEV);
#endif
#ifdef ENOENT
	CASE(ENOENT);
#endif
#ifdef ENOEXEC
	CASE(ENOEXEC);
#endif
#ifdef ENOIOCTLCMD
	CASE(ENOIOCTLCMD);
#endif
#ifdef ENOKEY
	CASE(ENOKEY);
#endif
#ifdef ENOLCK
	CASE(ENOLCK);
#endif
#ifdef ENOLINK
	CASE(ENOLINK);
#endif
#ifdef ENOMEDIUM
	CASE(ENOMEDIUM);
#endif
#ifdef ENOMEM
	CASE(ENOMEM);
#endif
#ifdef ENOMSG
	CASE(ENOMSG);
#endif
#ifdef ENONET
	CASE(ENONET);
#endif
#ifdef ENOPKG
	CASE(ENOPKG);
#endif
#ifdef ENOPROTOOPT
	CASE(ENOPROTOOPT);
#endif
#ifdef ENOSPC
	CASE(ENOSPC);
#endif
#ifdef ENOSR
	CASE(ENOSR);
#endif
#ifdef ENOSTR
	CASE(ENOSTR);
#endif
#ifdef ENOSYS
	CASE(ENOSYS);
#endif
#ifdef ENOTBLK
	CASE(ENOTBLK);
#endif
#ifdef ENOTCONN
	CASE(ENOTCONN);
#endif
#ifdef ENOTDIR
	CASE(ENOTDIR);
#endif
#ifdef ENOTEMPTY
	CASE(ENOTEMPTY);
#endif
#ifdef ENOTNAM
	CASE(ENOTNAM);
#endif
#ifdef ENOTRECOVERABLE
	CASE(ENOTRECOVERABLE);
#endif
#ifdef ENOTSOCK
	CASE(ENOTSOCK);
#endif
#ifdef ENOTSUPP
	CASE(ENOTSUPP);
#endif
#ifdef ENOTSYNC
	CASE(ENOTSYNC);
#endif
#ifdef ENOTTY
	CASE(ENOTTY);
#endif
#ifdef ENOTUNIQ
	CASE(ENOTUNIQ);
#endif
#ifdef ENXIO
	CASE(ENXIO);
#endif
#ifdef EOPENSTALE
	CASE(EOPENSTALE);
#endif
#ifdef EOPNOTSUPP
	CASE(EOPNOTSUPP);
#endif
#ifdef EOVERFLOW
	CASE(EOVERFLOW);
#endif
#ifdef EOWNERDEAD
	CASE(EOWNERDEAD);
#endif
#ifdef EPERM
	CASE(EPERM);
#endif
#ifdef EPFNOSUPPORT
	CASE(EPFNOSUPPORT);
#endif
#ifdef EPIPE
	CASE(EPIPE);
#endif
#ifdef EPROBE_DEFER
	CASE(EPROBE_DEFER);
#endif
#ifdef EPROTO
	CASE(EPROTO);
#endif
#ifdef EPROTONOSUPPORT
	CASE(EPROTONOSUPPORT);
#endif
#ifdef EPROTOTYPE
	CASE(EPROTOTYPE);
#endif
#ifdef ERANGE
	CASE(ERANGE);
#endif
#ifdef EREMCHG
	CASE(EREMCHG);
#endif
#ifdef EREMOTE
	CASE(EREMOTE);
#endif
#ifdef EREMOTEIO
	CASE(EREMOTEIO);
#endif
#ifdef ERESTART
	CASE(ERESTART);
#endif
#ifdef ERESTARTNOHAND
	CASE(ERESTARTNOHAND);
#endif
#ifdef ERESTARTNOINTR
	CASE(ERESTARTNOINTR);
#endif
#ifdef ERESTARTSYS
	CASE(ERESTARTSYS);
#endif
#ifdef ERESTART_RESTARTBLOCK
	CASE(ERESTART_RESTARTBLOCK);
#endif
#ifdef ERFKILL
	CASE(ERFKILL);
#endif
#ifdef EROFS
	CASE(EROFS);
#endif
#ifdef ESERVERFAULT
	CASE(ESERVERFAULT);
#endif
#ifdef ESHUTDOWN
	CASE(ESHUTDOWN);
#endif
#ifdef ESOCKTNOSUPPORT
	CASE(ESOCKTNOSUPPORT);
#endif
#ifdef ESPIPE
	CASE(ESPIPE);
#endif
#ifdef ESRCH
	CASE(ESRCH);
#endif
#ifdef ESRMNT
	CASE(ESRMNT);
#endif
#ifdef ESTALE
	CASE(ESTALE);
#endif
#ifdef ESTRPIPE
	CASE(ESTRPIPE);
#endif
#ifdef ETIME
	CASE(ETIME);
#endif
#ifdef ETIMEDOUT
	CASE(ETIMEDOUT);
#endif
#ifdef ETOOMANYREFS
	CASE(ETOOMANYREFS);
#endif
#ifdef ETOOSMALL
	CASE(ETOOSMALL);
#endif
#ifdef ETXTBSY
	CASE(ETXTBSY);
#endif
#ifdef EUCLEAN
	CASE(EUCLEAN);
#endif
#ifdef EUNATCH
	CASE(EUNATCH);
#endif
#ifdef EUSERS
	CASE(EUSERS);
#endif
#ifdef EXDEV
	CASE(EXDEV);
#endif
#ifdef EXFULL
	CASE(EXFULL);
#endif
	default:
		perror_msg_and_fail("unknown errno %d", errno);
	}
}