Blame ext/posix/errno.c

Packit 437b5e
/*
Packit 437b5e
 * POSIX library for Lua 5.1, 5.2 & 5.3.
Packit 437b5e
 * (c) Gary V. Vaughan <gary@vaughan.pe>, 2013-2015
Packit 437b5e
 * (c) Reuben Thomas <rrt@sc3d.org> 2010-2013
Packit 437b5e
 * (c) Natanael Copa <natanael.copa@gmail.com> 2008-2010
Packit 437b5e
 * Clean up and bug fixes by Leo Razoumov <slonik.az@gmail.com> 2006-10-11
Packit 437b5e
 * Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br> 07 Apr 2006 23:17:49
Packit 437b5e
 * Based on original by Claudio Terra for Lua 3.x.
Packit 437b5e
 * With contributions by Roberto Ierusalimschy.
Packit 437b5e
 * With documentation from Steve Donovan 2012
Packit 437b5e
 */
Packit 437b5e
/***
Packit 437b5e
 System error codes and messages.
Packit 437b5e
Packit 437b5e
 Usually, you'll be able to work with the error messages returned as the
Packit 437b5e
 second value from failed calls directly, without having to manually save
Packit 437b5e
 and stringify the system messages as you would in C.  For completeness,
Packit 437b5e
 the functions are still available here.
Packit 437b5e
Packit 437b5e
@module posix.errno
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
#include <config.h>
Packit 437b5e
Packit 437b5e
#include <errno.h>
Packit 437b5e
#include <stdio.h>
Packit 437b5e
#include <string.h>
Packit 437b5e
Packit 437b5e
#include "_helpers.c"
Packit 437b5e
Packit 437b5e
#ifndef errno
Packit 437b5e
extern int errno;
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Describe an error code/and or read `errno`
Packit 437b5e
@function errno
Packit 437b5e
@int[opt=current errno] n optional error code
Packit 437b5e
@return description
Packit 437b5e
@return error code
Packit 437b5e
@see strerror(3)
Packit 437b5e
@see errno
Packit 437b5e
@usage
Packit 437b5e
local strerr, nerr = P.errno ()
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Perrno(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	int n = optint(L, 1, errno);
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
	lua_pushstring(L, strerror(n));
Packit 437b5e
	lua_pushinteger(L, n);
Packit 437b5e
	return 2;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Set errno.
Packit 437b5e
@function set_errno
Packit 437b5e
@int n error code
Packit 437b5e
@see errno(3)
Packit 437b5e
@usage
Packit 437b5e
P.errno (P.EBADF)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pset_errno(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	errno = checkint(L, 1);
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const luaL_Reg posix_errno_fns[] =
Packit 437b5e
{
Packit 437b5e
	LPOSIX_FUNC( Perrno		),
Packit 437b5e
	LPOSIX_FUNC( Pset_errno		),
Packit 437b5e
	{NULL, NULL}
Packit 437b5e
};
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Constants.
Packit 437b5e
@section constants
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Error constants.
Packit 437b5e
Any constants not available in the underlying system will be `nil` valued.
Packit 437b5e
Packit 437b5e
If you find one of the luaposix APIs returns an error code not listed here,
Packit 437b5e
please raise an issue [here](http://github.com/luaposix/luaposixissues), stating
Packit 437b5e
the symbolic name of the constant (from `/usr/include/errno.h` or equivalent).
Packit 437b5e
@table posix.errno
Packit 437b5e
@int E2BIG argument list too long
Packit 437b5e
@int EACCES permission denied
Packit 437b5e
@int EADDRINUSE address already in use
Packit 437b5e
@int EADDRNOTAVAIL can't assign requested address
Packit 437b5e
@int EAFNOSUPPORT address family not supported by protocol family
Packit 437b5e
@int EAGAIN resource temporarily unavailable
Packit 437b5e
@int EALREADY operation already in progress
Packit 437b5e
@int EBADF bad file descriptor
Packit 437b5e
@int EBADMSG bad message
Packit 437b5e
@int EBUSY resource busy
Packit 437b5e
@int ECANCELED operation canceled
Packit 437b5e
@int ECHILD no child processes
Packit 437b5e
@int ECONNABORTED software caused connection abort
Packit 437b5e
@int ECONNREFUSED connection refused
Packit 437b5e
@int ECONNRESET connection reset by peer
Packit 437b5e
@int EDEADLK resource deadlock avoided
Packit 437b5e
@int EDESTADDRREQ destination address required
Packit 437b5e
@int EDOM numerical argument out of domain
Packit 437b5e
@int EEXIST file exists
Packit 437b5e
@int EFAULT bad address
Packit 437b5e
@int EFBIG file too large
Packit 437b5e
@int EHOSTUNREACH no route to host
Packit 437b5e
@int EIDRM identifier removed
Packit 437b5e
@int EILSEQ illegal byte sequence
Packit 437b5e
@int EINPROGRESS operation now in progress
Packit 437b5e
@int EINTR interrupted system call
Packit 437b5e
@int EINVAL invalid argument
Packit 437b5e
@int EIO input/output error
Packit 437b5e
@int EISCONN socket is already connected
Packit 437b5e
@int EISDIR is a directory
Packit 437b5e
@int ELOOP too many levels of symbolic links
Packit 437b5e
@int EMFILE too many open files
Packit 437b5e
@int EMLINK too many links
Packit 437b5e
@int EMSGSIZE message too long
Packit 437b5e
@int ENAMETOOLONG file name too long
Packit 437b5e
@int ENETDOWN network is down
Packit 437b5e
@int ENETRESET network dropped connection on reset
Packit 437b5e
@int ENETUNREACH network is unreachable
Packit 437b5e
@int ENFILE too many open files in system
Packit 437b5e
@int ENOBUFS no buffer space available
Packit 437b5e
@int ENODEV operation not supported by device
Packit 437b5e
@int ENOENT no such file or directory
Packit 437b5e
@int ENOEXEC exec format error
Packit 437b5e
@int ENOLCK no locks available
Packit 437b5e
@int ENOMEM cannot allocate memory
Packit 437b5e
@int ENOMSG no message of desired type
Packit 437b5e
@int ENOPROTOOPT protocol not available
Packit 437b5e
@int ENOSPC no space left on device
Packit 437b5e
@int ENOSYS function not implemented
Packit 437b5e
@int ENOTCONN socket is not connected
Packit 437b5e
@int ENOTDIR not a directory
Packit 437b5e
@int ENOTEMPTY directory not empty
Packit 437b5e
@int ENOTSOCK socket operation on non-socket
Packit 437b5e
@int ENOTSUP operation not supported
Packit 437b5e
@int ENOTTY inappropriate ioctl for device
Packit 437b5e
@int ENXIO device not configured
Packit 437b5e
@int EOPNOTSUPP operation not supported on socket
Packit 437b5e
@int EOVERFLOW value too large to be stored in data type
Packit 437b5e
@int EPERM operation not permitted
Packit 437b5e
@int EPIPE broken pipe
Packit 437b5e
@int EPROTO protocol error
Packit 437b5e
@int EPROTONOSUPPORT protocol not supported
Packit 437b5e
@int EPROTOTYPE protocol wrong type for socket
Packit 437b5e
@int ERANGE result too large
Packit 437b5e
@int EROFS read-only file system
Packit 437b5e
@int ESPIPE illegal seek
Packit 437b5e
@int ESRCH no such process
Packit 437b5e
@int ETIMEDOUT operation timed out
Packit 437b5e
@int ETXTBSY text file busy
Packit 437b5e
@int EWOULDBLOCK operation would block
Packit 437b5e
@int EXDEV cross-device link
Packit 437b5e
@usage
Packit 437b5e
  -- Print errno constants supported on this host.
Packit 437b5e
  for name, value in pairs (require "posix.errno") do
Packit 437b5e
    if type (value) == "number" then
Packit 437b5e
      print (name, value)
Packit 437b5e
    end
Packit 437b5e
  end
Packit 437b5e
*/
Packit 437b5e
LUALIB_API int
Packit 437b5e
luaopen_posix_errno(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	luaL_register(L, "posix.errno", posix_errno_fns);
Packit 437b5e
	lua_pushliteral(L, "posix.errno for " LUA_VERSION " / " PACKAGE_STRING);
Packit 437b5e
	lua_setfield(L, -2, "version");
Packit 437b5e
Packit 437b5e
#ifdef E2BIG
Packit 437b5e
	LPOSIX_CONST( E2BIG		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EACCES
Packit 437b5e
	LPOSIX_CONST( EACCES		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EADDRINUSE
Packit 437b5e
	LPOSIX_CONST( EADDRINUSE	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EADDRNOTAVAIL
Packit 437b5e
	LPOSIX_CONST( EADDRNOTAVAIL	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EAFNOSUPPORT
Packit 437b5e
	LPOSIX_CONST( EAFNOSUPPORT	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EAGAIN
Packit 437b5e
	LPOSIX_CONST( EAGAIN		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EALREADY
Packit 437b5e
	LPOSIX_CONST( EALREADY		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EBADF
Packit 437b5e
	LPOSIX_CONST( EBADF		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EBADMSG
Packit 437b5e
	LPOSIX_CONST( EBADMSG		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EBUSY
Packit 437b5e
	LPOSIX_CONST( EBUSY		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ECANCELED
Packit 437b5e
	LPOSIX_CONST( ECANCELED		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ECHILD
Packit 437b5e
	LPOSIX_CONST( ECHILD		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ECONNABORTED
Packit 437b5e
	LPOSIX_CONST( ECONNABORTED	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ECONNREFUSED
Packit 437b5e
	LPOSIX_CONST( ECONNREFUSED	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ECONNRESET
Packit 437b5e
	LPOSIX_CONST( ECONNRESET	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EDEADLK
Packit 437b5e
	LPOSIX_CONST( EDEADLK		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EDESTADDRREQ
Packit 437b5e
	LPOSIX_CONST( EDESTADDRREQ	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EDOM
Packit 437b5e
	LPOSIX_CONST( EDOM		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EEXIST
Packit 437b5e
	LPOSIX_CONST( EEXIST		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EFAULT
Packit 437b5e
	LPOSIX_CONST( EFAULT		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EFBIG
Packit 437b5e
	LPOSIX_CONST( EFBIG		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EHOSTUNREACH
Packit 437b5e
	LPOSIX_CONST( EHOSTUNREACH	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EIDRM
Packit 437b5e
	LPOSIX_CONST( EIDRM		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EILSEQ
Packit 437b5e
	LPOSIX_CONST( EILSEQ		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EINPROGRESS
Packit 437b5e
	LPOSIX_CONST( EINPROGRESS	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EINTR
Packit 437b5e
	LPOSIX_CONST( EINTR		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EINVAL
Packit 437b5e
	LPOSIX_CONST( EINVAL		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EIO
Packit 437b5e
	LPOSIX_CONST( EIO		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EISCONN
Packit 437b5e
	LPOSIX_CONST( EISCONN		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EISDIR
Packit 437b5e
	LPOSIX_CONST( EISDIR		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ELOOP
Packit 437b5e
	LPOSIX_CONST( ELOOP		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EMFILE
Packit 437b5e
	LPOSIX_CONST( EMFILE		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EMLINK
Packit 437b5e
	LPOSIX_CONST( EMLINK		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EMSGSIZE
Packit 437b5e
	LPOSIX_CONST( EMSGSIZE		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENAMETOOLONG
Packit 437b5e
	LPOSIX_CONST( ENAMETOOLONG	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENETDOWN
Packit 437b5e
	LPOSIX_CONST( ENETDOWN		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENETRESET
Packit 437b5e
	LPOSIX_CONST( ENETRESET		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENETUNREACH
Packit 437b5e
	LPOSIX_CONST( ENETUNREACH	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENFILE
Packit 437b5e
	LPOSIX_CONST( ENFILE		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOBUFS
Packit 437b5e
	LPOSIX_CONST( ENOBUFS		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENODEV
Packit 437b5e
	LPOSIX_CONST( ENODEV		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOENT
Packit 437b5e
	LPOSIX_CONST( ENOENT		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOEXEC
Packit 437b5e
	LPOSIX_CONST( ENOEXEC		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOLCK
Packit 437b5e
	LPOSIX_CONST( ENOLCK		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOMEM
Packit 437b5e
	LPOSIX_CONST( ENOMEM		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOMSG
Packit 437b5e
	LPOSIX_CONST( ENOMSG		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOPROTOOPT
Packit 437b5e
	LPOSIX_CONST( ENOPROTOOPT	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOSPC
Packit 437b5e
	LPOSIX_CONST( ENOSPC		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOSYS
Packit 437b5e
	LPOSIX_CONST( ENOSYS		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOTCONN
Packit 437b5e
	LPOSIX_CONST( ENOTCONN		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOTDIR
Packit 437b5e
	LPOSIX_CONST( ENOTDIR		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOTEMPTY
Packit 437b5e
	LPOSIX_CONST( ENOTEMPTY		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOTSOCK
Packit 437b5e
	LPOSIX_CONST( ENOTSOCK		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOTSUP
Packit 437b5e
	LPOSIX_CONST( ENOTSUP		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENOTTY
Packit 437b5e
	LPOSIX_CONST( ENOTTY		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ENXIO
Packit 437b5e
	LPOSIX_CONST( ENXIO		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EOPNOTSUPP
Packit 437b5e
	LPOSIX_CONST( EOPNOTSUPP	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EOVERFLOW
Packit 437b5e
	LPOSIX_CONST( EOVERFLOW		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EPERM
Packit 437b5e
	LPOSIX_CONST( EPERM		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EPIPE
Packit 437b5e
	LPOSIX_CONST( EPIPE		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EPROTO
Packit 437b5e
	LPOSIX_CONST( EPROTO		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EPROTONOSUPPORT
Packit 437b5e
	LPOSIX_CONST( EPROTONOSUPPORT	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EPROTOTYPE
Packit 437b5e
	LPOSIX_CONST( EPROTOTYPE	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ERANGE
Packit 437b5e
	LPOSIX_CONST( ERANGE		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EROFS
Packit 437b5e
	LPOSIX_CONST( EROFS		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ESPIPE
Packit 437b5e
	LPOSIX_CONST( ESPIPE		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ESRCH
Packit 437b5e
	LPOSIX_CONST( ESRCH		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ETIMEDOUT
Packit 437b5e
	LPOSIX_CONST( ETIMEDOUT		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef ETXTBSY
Packit 437b5e
	LPOSIX_CONST( ETXTBSY		);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EWOULDBLOCK
Packit 437b5e
	LPOSIX_CONST( EWOULDBLOCK	);
Packit 437b5e
#endif
Packit 437b5e
#ifdef EXDEV
Packit 437b5e
	LPOSIX_CONST( EXDEV		);
Packit 437b5e
#endif
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}