nfs-ganesha 1.4

nfs_convert.c

Go to the documentation of this file.
00001 /*
00002  * vim:expandtab:shiftwidth=8:tabstop=8:
00003  *
00004  * Copyright CEA/DAM/DIF  (2008)
00005  * contributeur : Philippe DENIEL   philippe.deniel@cea.fr
00006  *                Thomas LEIBOVICI  thomas.leibovici@cea.fr
00007  *
00008  *
00009  * This program is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU Lesser General Public
00011  * License as published by the Free Software Foundation; either
00012  * version 3 of the License, or (at your option) any later version.
00013  * 
00014  * This program is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017  * Lesser General Public License for more details.
00018  * 
00019  * You should have received a copy of the GNU Lesser General Public
00020  * License along with this library; if not, write to the Free Software
00021  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00022  * 
00023  * ---------------------------------------
00024  * \file    nfs_convert.c
00025  * \author  $Author: deniel $
00026  * \date    $Date: 2005/11/28 17:03:02 $
00027  * \version $Revision: 1.3 $
00028  * \brief   nfs conversion tools.
00029  *
00030  * $Log: nfs_convert.c,v $
00031  *
00032  * Revision 1.2  2005/10/12 08:28:00  deniel
00033  * Format of the errror message.
00034  *
00035  * Revision 1.1  2005/08/05 08:46:35  leibovic
00036  * Convertion tools.
00037  *
00038  *
00039  */
00040 #ifdef HAVE_CONFIG_H
00041 #include "config.h"
00042 #endif
00043 
00044 #ifdef _SOLARIS
00045 #include "solaris_port.h"
00046 #endif
00047 
00048 #include <string.h>
00049 #include "ganesha_rpc.h"
00050 #include "nfs_core.h"
00051 #include "nfs_tools.h"
00052 #include "mount.h"
00053 #include "nfs23.h"
00054 
00055 #ifdef HAVE_GSSAPI
00056 OM_uint32 Gss_release_buffer(OM_uint32 * minor_status, gss_buffer_t buffer);
00057 #endif
00058 
00059 char *nfsstat2_to_str(nfsstat2 code)
00060 {
00061   switch (code)
00062     {
00063       /* no nead for break statments,
00064        * because we "return".
00065        */
00066     case NFS_OK:             return "NFS_OK";
00067     case NFSERR_PERM:        return "NFSERR_PERM";
00068     case NFSERR_NOENT:       return "NFSERR_NOENT";
00069     case NFSERR_IO:          return "NFSERR_IO";
00070     case NFSERR_NXIO:        return "NFSERR_NXIO";
00071     case NFSERR_ACCES:       return "NFSERR_ACCES";
00072     case NFSERR_EXIST:       return "NFSERR_EXIST";
00073     case NFSERR_NODEV:       return "NFSERR_NODEV";
00074     case NFSERR_NOTDIR:      return "NFSERR_NOTDIR";
00075     case NFSERR_ISDIR:       return "NFSERR_ISDIR";
00076     case NFSERR_FBIG:        return "NFSERR_FBIG";
00077     case NFSERR_NOSPC:       return "NFSERR_NOSPC";
00078     case NFSERR_ROFS:        return "NFSERR_ROFS";
00079     case NFSERR_NAMETOOLONG: return "NFSERR_NAMETOOLONG";
00080     case NFSERR_NOTEMPTY:    return "NFSERR_NOTEMPTY";
00081     case NFSERR_DQUOT:       return "NFSERR_DQUOT";
00082     case NFSERR_STALE:       return "NFSERR_STALE";
00083     case NFSERR_WFLUSH:      return "NFSERR_WFLUSH";
00084     }
00085   return "UNKNOWN NFSv2 ERROR CODE";
00086 }
00087 
00088 char *nfsstat3_to_str(nfsstat3 code)
00089 {
00090   switch (code)
00091     {
00092       /* no nead for break statments,
00093        * because we "return".
00094        */
00095     case NFS3_OK:             return "NFS3_OK";
00096     case NFS3ERR_PERM:        return "NFS3ERR_PERM";
00097     case NFS3ERR_NOENT:       return "NFS3ERR_NOENT";
00098     case NFS3ERR_IO:          return "NFS3ERR_IO";
00099     case NFS3ERR_NXIO:        return "NFS3ERR_NXIO";
00100     case NFS3ERR_ACCES:       return "NFS3ERR_ACCES";
00101     case NFS3ERR_EXIST:       return "NFS3ERR_EXIST";
00102     case NFS3ERR_XDEV:        return "NFS3ERR_XDEV";
00103     case NFS3ERR_NODEV:       return "NFS3ERR_NODEV";
00104     case NFS3ERR_NOTDIR:      return "NFS3ERR_NOTDIR";
00105     case NFS3ERR_ISDIR:       return "NFS3ERR_ISDIR";
00106     case NFS3ERR_INVAL:       return "NFS3ERR_INVAL";
00107     case NFS3ERR_FBIG:        return "NFS3ERR_FBIG";
00108     case NFS3ERR_NOSPC:       return "NFS3ERR_NOSPC";
00109     case NFS3ERR_ROFS:        return "NFS3ERR_ROFS";
00110     case NFS3ERR_MLINK:       return "NFS3ERR_MLINK";
00111     case NFS3ERR_NAMETOOLONG: return "NFS3ERR_NAMETOOLONG";
00112     case NFS3ERR_NOTEMPTY:    return "NFS3ERR_NOTEMPTY";
00113     case NFS3ERR_DQUOT:       return "NFS3ERR_DQUOT";
00114     case NFS3ERR_STALE:       return "NFS3ERR_STALE";
00115     case NFS3ERR_REMOTE:      return "NFS3ERR_REMOTE";
00116     case NFS3ERR_BADHANDLE:   return "NFS3ERR_BADHANDLE";
00117     case NFS3ERR_NOT_SYNC:    return "NFS3ERR_NOT_SYNC";
00118     case NFS3ERR_BAD_COOKIE:  return "NFS3ERR_BAD_COOKIE";
00119     case NFS3ERR_NOTSUPP:     return "NFS3ERR_NOTSUPP";
00120     case NFS3ERR_TOOSMALL:    return "NFS3ERR_TOOSMALL";
00121     case NFS3ERR_SERVERFAULT: return "NFS3ERR_SERVERFAULT";
00122     case NFS3ERR_BADTYPE:     return "NFS3ERR_BADTYPE";
00123     case NFS3ERR_JUKEBOX:     return "NFS3ERR_JUKEBOX";
00124     }
00125   return "UNKNOWN NFSv3 ERROR CODE";
00126 }
00127 
00128 char *nfsstat4_to_str(nfsstat4 code)
00129 {
00130   switch(code)
00131     {
00132     case NFS4_OK:                     return "NFS4_OK";
00133     case NFS4ERR_PERM:                return "NFS4ERR_PERM";
00134     case NFS4ERR_NOENT:               return "NFS4ERR_NOENT";
00135     case NFS4ERR_IO:                  return "NFS4ERR_IO";
00136     case NFS4ERR_NXIO:                return "NFS4ERR_NXIO";
00137     case NFS4ERR_ACCESS:              return "NFS4ERR_ACCESS";
00138     case NFS4ERR_EXIST:               return "NFS4ERR_EXIST";
00139     case NFS4ERR_XDEV:                return "NFS4ERR_XDEV";
00140     case NFS4ERR_NOTDIR:              return "NFS4ERR_NOTDIR";
00141     case NFS4ERR_ISDIR:               return "NFS4ERR_ISDIR";
00142     case NFS4ERR_INVAL:               return "NFS4ERR_INVAL";
00143     case NFS4ERR_FBIG:                return "NFS4ERR_FBIG";
00144     case NFS4ERR_NOSPC:               return "NFS4ERR_NOSPC";
00145     case NFS4ERR_ROFS:                return "NFS4ERR_ROFS";
00146     case NFS4ERR_MLINK:               return "NFS4ERR_MLINK";
00147     case NFS4ERR_NAMETOOLONG:         return "NFS4ERR_NAMETOOLONG";
00148     case NFS4ERR_NOTEMPTY:            return "NFS4ERR_NOTEMPTY";
00149     case NFS4ERR_DQUOT:               return "NFS4ERR_DQUOT";
00150     case NFS4ERR_STALE:               return "NFS4ERR_STALE";
00151     case NFS4ERR_BADHANDLE:           return "NFS4ERR_BADHANDLE";
00152     case NFS4ERR_BAD_COOKIE:          return "NFS4ERR_BAD_COOKIE";
00153     case NFS4ERR_NOTSUPP:             return "NFS4ERR_NOTSUPP";
00154     case NFS4ERR_TOOSMALL:            return "NFS4ERR_TOOSMALL";
00155     case NFS4ERR_SERVERFAULT:         return "NFS4ERR_SERVERFAULT";
00156     case NFS4ERR_BADTYPE:             return "NFS4ERR_BADTYPE";
00157     case NFS4ERR_DELAY:               return "NFS4ERR_DELAY";
00158     case NFS4ERR_SAME:                return "NFS4ERR_SAME";
00159     case NFS4ERR_DENIED:              return "NFS4ERR_DENIED";
00160     case NFS4ERR_EXPIRED:             return "NFS4ERR_EXPIRED";
00161     case NFS4ERR_LOCKED:              return "NFS4ERR_LOCKED";
00162     case NFS4ERR_GRACE:               return "NFS4ERR_GRACE";
00163     case NFS4ERR_FHEXPIRED:           return "NFS4ERR_FHEXPIRED";
00164     case NFS4ERR_SHARE_DENIED:        return "NFS4ERR_SHARE_DENIED";
00165     case NFS4ERR_WRONGSEC:            return "NFS4ERR_WRONGSEC";
00166     case NFS4ERR_CLID_INUSE:          return "NFS4ERR_CLID_INUSE";
00167     case NFS4ERR_RESOURCE:            return "NFS4ERR_RESOURCE";
00168     case NFS4ERR_MOVED:               return "NFS4ERR_MOVED";
00169     case NFS4ERR_NOFILEHANDLE:        return "NFS4ERR_NOFILEHANDLE";
00170     case NFS4ERR_MINOR_VERS_MISMATCH: return "NFS4ERR_MINOR_VERS_MISMATCH";
00171     case NFS4ERR_STALE_CLIENTID:      return "NFS4ERR_STALE_CLIENTID";
00172     case NFS4ERR_STALE_STATEID:       return "NFS4ERR_STALE_STATEID";
00173     case NFS4ERR_OLD_STATEID:         return "NFS4ERR_OLD_STATEID";
00174     case NFS4ERR_BAD_STATEID:         return "NFS4ERR_BAD_STATEID";
00175     case NFS4ERR_BAD_SEQID:           return "NFS4ERR_BAD_SEQID";
00176     case NFS4ERR_NOT_SAME:            return "NFS4ERR_NOT_SAME";
00177     case NFS4ERR_LOCK_RANGE:          return "NFS4ERR_LOCK_RANGE";
00178     case NFS4ERR_SYMLINK:             return "NFS4ERR_SYMLINK";
00179     case NFS4ERR_RESTOREFH:           return "NFS4ERR_RESTOREFH";
00180     case NFS4ERR_LEASE_MOVED:         return "NFS4ERR_LEASE_MOVED";
00181     case NFS4ERR_ATTRNOTSUPP:         return "NFS4ERR_ATTRNOTSUPP";
00182     case NFS4ERR_NO_GRACE:            return "NFS4ERR_NO_GRACE";
00183     case NFS4ERR_RECLAIM_BAD:         return "NFS4ERR_RECLAIM_BAD";
00184     case NFS4ERR_RECLAIM_CONFLICT:    return "NFS4ERR_RECLAIM_CONFLICT";
00185     case NFS4ERR_BADXDR:              return "NFS4ERR_BADXDR";
00186     case NFS4ERR_LOCKS_HELD:          return "NFS4ERR_LOCKS_HELD";
00187     case NFS4ERR_OPENMODE:            return "NFS4ERR_OPENMODE";
00188     case NFS4ERR_BADOWNER:            return "NFS4ERR_BADOWNER";
00189     case NFS4ERR_BADCHAR:             return "NFS4ERR_BADCHAR";
00190     case NFS4ERR_BADNAME:             return "NFS4ERR_BADNAME";
00191     case NFS4ERR_BAD_RANGE:           return "NFS4ERR_BAD_RANGE";
00192     case NFS4ERR_LOCK_NOTSUPP:        return "NFS4ERR_LOCK_NOTSUPP";
00193     case NFS4ERR_OP_ILLEGAL:          return "NFS4ERR_OP_ILLEGAL";
00194     case NFS4ERR_DEADLOCK:            return "NFS4ERR_DEADLOCK";
00195     case NFS4ERR_FILE_OPEN:           return "NFS4ERR_FILE_OPEN";
00196     case NFS4ERR_ADMIN_REVOKED:       return "NFS4ERR_ADMIN_REVOKED";
00197     case NFS4ERR_CB_PATH_DOWN:        return "NFS4ERR_CB_PATH_DOWN";
00198 #ifdef _USE_NFS4_1
00199     case NFS4ERR_BADIOMODE:                 return "NFS4ERR_BADIOMODE";
00200     case NFS4ERR_BADLAYOUT:                 return "NFS4ERR_BADLAYOUT";
00201     case NFS4ERR_BAD_SESSION_DIGEST:        return "NFS4ERR_BAD_SESSION_DIGEST";
00202     case NFS4ERR_BADSESSION:                return "NFS4ERR_BADSESSION";
00203     case NFS4ERR_BADSLOT:                   return "NFS4ERR_BADSLOT";
00204     case NFS4ERR_COMPLETE_ALREADY:          return "NFS4ERR_COMPLETE_ALREADY";
00205     case NFS4ERR_CONN_NOT_BOUND_TO_SESSION: return "NFS4ERR_CONN_NOT_BOUND_TO_SESSION";
00206     case NFS4ERR_DELEG_ALREADY_WANTED:      return "NFS4ERR_DELEG_ALREADY_WANTED";
00207     case NFS4ERR_BACK_CHAN_BUSY:            return "NFS4ERR_BACK_CHAN_BUSY";
00208     case NFS4ERR_LAYOUTTRYLATER:            return "NFS4ERR_LAYOUTTRYLATER";
00209     case NFS4ERR_LAYOUTUNAVAILABLE:         return "NFS4ERR_LAYOUTUNAVAILABLE";
00210     case NFS4ERR_NOMATCHING_LAYOUT:         return "NFS4ERR_NOMATCHING_LAYOUT";
00211     case NFS4ERR_RECALLCONFLICT:            return "NFS4ERR_RECALLCONFLICT";
00212     case NFS4ERR_UNKNOWN_LAYOUTTYPE:        return "NFS4ERR_UNKNOWN_LAYOUTTYPE";
00213     case NFS4ERR_SEQ_MISORDERED:            return "NFS4ERR_SEQ_MISORDERED";
00214     case NFS4ERR_SEQUENCE_POS:              return "NFS4ERR_SEQUENCE_POS";
00215     case NFS4ERR_REQ_TOO_BIG:               return "NFS4ERR_REQ_TOO_BIG";
00216     case NFS4ERR_REP_TOO_BIG:               return "NFS4ERR_REP_TOO_BIG";
00217     case NFS4ERR_REP_TOO_BIG_TO_CACHE:      return "NFS4ERR_REP_TOO_BIG_TO_CACHE";
00218     case NFS4ERR_RETRY_UNCACHED_REP:        return "NFS4ERR_RETRY_UNCACHED_REP";
00219     case NFS4ERR_UNSAFE_COMPOUND:           return "NFS4ERR_UNSAFE_COMPOUND";
00220     case NFS4ERR_TOO_MANY_OPS:              return "NFS4ERR_TOO_MANY_OPS";
00221     case NFS4ERR_OP_NOT_IN_SESSION:         return "NFS4ERR_OP_NOT_IN_SESSION";
00222     case NFS4ERR_HASH_ALG_UNSUPP:           return "NFS4ERR_HASH_ALG_UNSUPP";
00223     case NFS4ERR_CLIENTID_BUSY:             return "NFS4ERR_CLIENTID_BUSY";
00224     case NFS4ERR_PNFS_IO_HOLE:              return "NFS4ERR_PNFS_IO_HOLE";
00225     case NFS4ERR_SEQ_FALSE_RETRY:           return "NFS4ERR_SEQ_FALSE_RETRY";
00226     case NFS4ERR_BAD_HIGH_SLOT:             return "NFS4ERR_BAD_HIGH_SLOT";
00227     case NFS4ERR_DEADSESSION:               return "NFS4ERR_DEADSESSION";
00228     case NFS4ERR_ENCR_ALG_UNSUPP:           return "NFS4ERR_ENCR_ALG_UNSUPP";
00229     case NFS4ERR_PNFS_NO_LAYOUT:            return "NFS4ERR_PNFS_NO_LAYOUT";
00230     case NFS4ERR_NOT_ONLY_OP:               return "NFS4ERR_NOT_ONLY_OP";
00231     case NFS4ERR_WRONG_CRED:                return "NFS4ERR_WRONG_CRED";
00232     case NFS4ERR_WRONG_TYPE:                return "NFS4ERR_WRONG_TYPE";
00233     case NFS4ERR_DIRDELEG_UNAVAIL:          return "NFS4ERR_DIRDELEG_UNAVAIL";
00234     case NFS4ERR_REJECT_DELEG:              return "NFS4ERR_REJECT_DELEG";
00235     case NFS4ERR_RETURNCONFLICT:            return "NFS4ERR_RETURNCONFLICT";
00236     case NFS4ERR_DELEG_REVOKED:             return "NFS4ERR_DELEG_REVOKED";
00237 #endif
00238     }
00239   return "UNKNOWN NFSv4 ERROR CODE";
00240 }
00241 
00242 char *nfstype2_to_str(ftype2 code)
00243 {
00244   switch (code)
00245     {
00246       /* no nead for break statments,
00247        * because we "return".
00248        */
00249     case NFNON:  return "NFNON";
00250     case NFREG:  return "NFREG";
00251     case NFDIR:  return "NFDIR";
00252     case NFBLK:  return "NFBLK";
00253     case NFCHR:  return "NFCHR";
00254     case NFLNK:  return "NFLNK";
00255     case NFSOCK: return "NFSOCK";
00256     case NFBAD:  return "NFBAD";
00257     case NFFIFO: return "NFFIFO";
00258     }
00259   return "UNKNOWN NFSv2 TYPE";
00260 }
00261 
00262 char *nfstype3_to_str(ftype3 code)
00263 {
00264   switch (code)
00265     {
00266       /* no nead for break statments,
00267        * because we "return".
00268        */
00269     case NF3REG:  return "NF3REG";
00270     case NF3DIR:  return "NF3DIR";
00271     case NF3BLK:  return "NF3BLK";
00272     case NF3CHR:  return "NF3CHR";
00273     case NF3LNK:  return "NF3LNK";
00274     case NF3SOCK: return "NF3SOCK";
00275     case NF3FIFO: return "NF3FIFO";
00276     }
00277   return "UNKNOWN NFSv3 TYPE";
00278 }
00279 
00289 uint64_t nfs_htonl64(uint64_t arg64)
00290 {
00291   uint64_t res64;
00292 
00293 #ifdef LITTLEEND
00294   uint32_t low = (uint32_t) (arg64 & 0x00000000FFFFFFFFLL);
00295   uint32_t high = (uint32_t) ((arg64 & 0xFFFFFFFF00000000LL) >> 32);
00296 
00297   low = htonl(low);
00298   high = htonl(high);
00299 
00300   res64 = (uint64_t) high + (((uint64_t) low) << 32);
00301 #else
00302   res64 = arg64;
00303 #endif
00304 
00305   return res64;
00306 }                               /* nfs_htonl64 */
00307 
00317 uint64_t nfs_ntohl64(uint64_t arg64)
00318 {
00319   uint64_t res64;
00320 
00321 #ifdef LITTLEEND
00322   uint32_t low = (uint32_t) (arg64 & 0x00000000FFFFFFFFLL);
00323   uint32_t high = (uint32_t) ((arg64 & 0xFFFFFFFF00000000LL) >> 32);
00324 
00325   low = ntohl(low);
00326   high = ntohl(high);
00327 
00328   res64 = (uint64_t) high + (((uint64_t) low) << 32);
00329 #else
00330   res64 = arg64;
00331 #endif
00332 
00333   return res64;
00334 }                               /* nfs_ntonl64 */
00335 
00347 void auth_stat2str(enum auth_stat why, char *str)
00348 {
00349   switch (why)
00350     {
00351     case AUTH_OK:
00352       strncpy(str, "AUTH_OK", AUTH_STR_LEN);
00353       break;
00354 
00355     case AUTH_BADCRED:
00356       strncpy(str, "AUTH_BADCRED", AUTH_STR_LEN);
00357       break;
00358 
00359     case AUTH_REJECTEDCRED:
00360       strncpy(str, "AUTH_REJECTEDCRED", AUTH_STR_LEN);
00361       break;
00362 
00363     case AUTH_BADVERF:
00364       strncpy(str, "AUTH_BADVERF", AUTH_STR_LEN);
00365       break;
00366 
00367     case AUTH_REJECTEDVERF:
00368       strncpy(str, "AUTH_REJECTEDVERF", AUTH_STR_LEN);
00369       break;
00370 
00371     case AUTH_TOOWEAK:
00372       strncpy(str, "AUTH_TOOWEAK", AUTH_STR_LEN);
00373       break;
00374 
00375     case AUTH_INVALIDRESP:
00376       strncpy(str, "AUTH_INVALIDRESP", AUTH_STR_LEN);
00377       break;
00378 
00379     case AUTH_FAILED:
00380       strncpy(str, "AUTH_FAILED", AUTH_STR_LEN);
00381       break;
00382 
00383 #ifdef _HAVE_GSSAPI
00384     case RPCSEC_GSS_CREDPROBLEM:
00385       strncpy(str, "RPCSEC_GSS_CREDPROBLEM", AUTH_STR_LEN);
00386       break;
00387 
00388     case RPCSEC_GSS_CTXPROBLEM:
00389       strncpy(str, "RPCSEC_GSS_CTXPROBLEM", AUTH_STR_LEN);
00390       break;
00391 #endif
00392 
00393     default:
00394       strncpy(str, "UNKNOWN AUTH", AUTH_STR_LEN);
00395       break;
00396     }                           /* switch */
00397 }                               /* auth_stat2str */