/*
* UNFS3 error translation
* (C) 2004, Pascal Schmidt
* see file LICENSE for license details
*/
/*
* translations from Unix errno to NFS error numbers
*/
#include "config.h"
#include <rpc/rpc.h>
#include <errno.h>
#include "nfs.h"
#include "error.h"
static int is_stale(void)
{
if (errno == ENOTDIR || errno == ELOOP || errno == ENOENT ||
errno == ENAMETOOLONG)
return -1;
else
return 0;
}
nfsstat3 symlink_err(void)
{
if (errno == EACCES || errno == EPERM)
return NFS3ERR_ACCES;
else if (is_stale())
return NFS3ERR_STALE;
else if (errno == EROFS)
return NFS3ERR_ROFS;
else if (errno == EEXIST)
return NFS3ERR_EXIST;
else if (errno == ENOSPC)
return NFS3ERR_NOSPC;
else
return NFS3ERR_IO;
}
nfsstat3 mkdir_err(void)
{
return symlink_err();
}
nfsstat3 mknod_err(void)
{
return symlink_err();
}
nfsstat3 link_err(void)
{
if (errno == EXDEV)
return NFS3ERR_XDEV;
else if (errno == EMLINK)
return NFS3ERR_MLINK;
else
return symlink_err();
}
nfsstat3 lookup_err(void)
{
if (errno == ENOENT)
return NFS3ERR_NOENT;
#ifdef ENOMEDIUM
else if (errno == ENOMEDIUM)
return NFS3ERR_NOENT;
#endif
else if (errno == EACCES)
return NFS3ERR_ACCES;
else if (errno == ENOTDIR || errno == ELOOP || errno == ENAMETOOLONG)
return NFS3ERR_STALE;
else
return NFS3ERR_IO;
}
nfsstat3 readlink_err(void)
{
if (errno == EINVAL)
return NFS3ERR_INVAL;
else if (errno == EACCES)
return NFS3ERR_ACCES;
else if (is_stale())
return NFS3ERR_STALE;
else
return NFS3ERR_IO;
}
nfsstat3 read_err(void)
{
if (errno == EINVAL)
return NFS3ERR_INVAL;
else if (is_stale())
return NFS3ERR_STALE;
else if (errno == EACCES)
return NFS3ERR_ACCES;
else if (errno == ENXIO || errno == ENODEV)
return NFS3ERR_NXIO;
else
return NFS3ERR_IO;
}
nfsstat3 write_open_err(void)
{
if (errno == EACCES)
return NFS3ERR_ACCES;
else if (is_stale())
return NFS3ERR_STALE;
else if (errno == EROFS)
return NFS3ERR_ROFS;
else
return NFS3ERR_IO;
}
nfsstat3 write_write_err(void)
{
if (errno == EINVAL)
return NFS3ERR_INVAL;
else if (errno == EFBIG)
return NFS3ERR_FBIG;
else if (errno == ENOSPC)
return NFS3ERR_NOSPC;
else
return NFS3ERR_IO;
}
nfsstat3 create_err(void)
{
if (errno == EACCES)
return NFS3ERR_ACCES;
else if (is_stale())
return NFS3ERR_STALE;
else if (errno == EROFS)
return NFS3ERR_ROFS;
else if (errno == ENOSPC)
return NFS3ERR_NOSPC;
else if (errno == EEXIST)
return NFS3ERR_EXIST;
else
return NFS3ERR_IO;
}
nfsstat3 rename_err(void)
{
if (errno == EISDIR)
return NFS3ERR_ISDIR;
else if (errno == EXDEV)
return NFS3ERR_XDEV;
else if (errno == EEXIST)
return NFS3ERR_EXIST;
else if (errno == ENOTEMPTY)
return NFS3ERR_NOTEMPTY;
else if (errno == EINVAL)
return NFS3ERR_INVAL;
else if (errno == ENOTDIR)
return NFS3ERR_NOTDIR;
else if (errno == EACCES || errno == EPERM)
return NFS3ERR_ACCES;
else if (errno == ENOENT)
return NFS3ERR_NOENT;
else if (errno == ELOOP || errno == ENAMETOOLONG)
return NFS3ERR_STALE;
else if (errno == EROFS)
return NFS3ERR_ROFS;
else if (errno == ENOSPC)
return NFS3ERR_NOSPC;
else
return NFS3ERR_IO;
}
nfsstat3 remove_err(void)
{
if (errno == EACCES || errno == EPERM)
return NFS3ERR_ACCES;
else if (errno == ENOENT)
return ENOENT;
else if (errno == ENOTDIR || errno == ELOOP || errno == ENAMETOOLONG)
return NFS3ERR_STALE;
else if (errno == EROFS)
return NFS3ERR_ROFS;
else
return NFS3ERR_IO;
}
nfsstat3 rmdir_err(void)
{
if (errno == ENOTEMPTY)
return NFS3ERR_NOTEMPTY;
else
return remove_err();
}
nfsstat3 setattr_err(void)
{
if (errno == EPERM)
return NFS3ERR_PERM;
else if (errno == EROFS)
return NFS3ERR_ROFS;
else if (is_stale())
return NFS3ERR_STALE;
else if (errno == EACCES)
return NFS3ERR_ACCES;
else
return NFS3ERR_IO;
}
nfsstat3 readdir_err(void)
{
if (errno == EPERM)
return NFS3ERR_PERM;
else if (errno == EACCES)
return NFS3ERR_ACCES;
else if (errno == ENOTDIR)
return NFS3ERR_NOTDIR;
else if (is_stale())
return NFS3ERR_STALE;
else
return NFS3ERR_IO;
}
/*
* combine two error values
*/
nfsstat3 join(nfsstat3 x, nfsstat3 y)
{
return (x != NFS3_OK) ? x : y;
}
/*
* combine three error values
*/
nfsstat3 join3(nfsstat3 x, nfsstat3 y, nfsstat3 z)
{
return (x != NFS3_OK) ? x : join(y, z);
}
syntax highlighted by Code2HTML, v. 0.9.1