/*
 * Copyright 2000, International Business Machines Corporation and others.
 * All Rights Reserved.
 *
 * This software has been released under the terms of the IBM Public
 * License.  For details, see the LICENSE file in the top-level source
 * directory or online at http://www.openafs.org/dl/license10.html
 */

#ifndef	__EXPORTER__
#define	__EXPORTER__

#ifdef UID_NOBODY
#define	NFS_NOBODY	UID_NOBODY
#endif
#ifndef	NFS_NOBODY
#define NFS_NOBODY      -2	/* maps Nfs's "nobody" but since not declared by some systems (i.e. Ultrix) we use a constant  */
#endif
#define	RMTUSER_REQ		0xabc
#define	RMTUSER_REQ_PRIV	0xabe

/**
  * There is a limitation on the number of bytes that can be passed into
  * the file handle that nfs passes into AFS.  The limit is 10 bytes.
  * We pass in an array of long of size 2. On a 32 bit system this would be
  * 8 bytes. But on a 64 bit system this would be 16 bytes. The first
  * element of this array is a pointer so we cannot truncate that. But the
  * second element is the AFS_XLATOR_MAGIC, which we can truncate.
  * So on a 64 bit system the 10 bytes are used as below
  * Bytes 1-8 			pointer to vnode
  * Bytes 9 and 10		AFS_XLATOR_MAGIC
  *
  * And hence for 64 bit environments AFS_XLATOR_MAGIC is 8765 which takes
  * up 2 bytes
  */

#if defined(AFS_SUN5_64BIT_ENV) || (defined(AFS_SGI61_ENV) && (_MIPS_SZPTR==64)) || defined(AFS_LINUX_64BIT_KERNEL)
#define	AFS_XLATOR_MAGIC	0x8765	/* XXX */
#else
#define	AFS_XLATOR_MAGIC	0x87654321
#endif

#if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
#define AFS_NFSXLATORREQ(cred) 0
#else
#define	AFS_NFSXLATORREQ(cred)    (afs_cr_rgid(cred) == NFSXLATOR_CRED)
#endif

struct afs_exporter;

struct exporterops {
    int (*export_reqhandler) (struct afs_exporter *exp,
		    	      afs_ucred_t **cred,
			      afs_uint32 host,
			      afs_int32 *pag,
			      struct afs_exporter **expp);
    void (*export_hold) (struct afs_exporter *exp);
    void (*export_rele) (struct afs_exporter *exp);
    int (*export_sysname) (struct afs_exporter *exp,
		           char *inname,
			   char ***outname,
			   int *num,
			   int allpags);
    void (*export_garbagecollect) (struct afs_exporter *exp,
		    		   afs_int32 param);
    int (*export_statistics) (struct afs_exporter *exp);
    int (*export_checkhost) (struct afs_exporter *exp, afs_uint32 host);
    afs_uint32 (*export_gethost) (struct afs_exporter *exp);
};

struct exporterstats {
    afs_int32 calls;		/* # of calls to the exporter */
    afs_int32 rejectedcalls;	/* # of afs rejected  calls */
    afs_int32 nopag;		/* # of unpagged remote calls */
    afs_int32 invalidpag;	/* # of invalid pag calls */
};

struct afs_exporter {
    struct afs_exporter *exp_next;
    struct exporterops *exp_op;
    afs_int32 exp_states;
    afs_int32 exp_type;
    struct exporterstats exp_stats;
    char *exp_data;
};

/* exp_type values */
#define	EXP_NULL    0		/* Undefined */
#define	EXP_NFS	    1		/* Nfs/Afs translator */

/* exp_states values */
#define	EXP_EXPORTED	1
#define	EXP_UNIXMODE	2
#define	EXP_PWSYNC	4
#define	EXP_SUBMOUNTS	8
#define EXP_CLIPAGS    16
#define EXP_CALLBACK   32


#define	AFS_NFSFULLFID	1

#define	EXP_REQHANDLER(EXP, CRED, HOST, PAG, EXPP) \
        (*(EXP)->exp_op->export_reqhandler)(EXP, CRED, HOST, PAG, EXPP)
#define	EXP_HOLD(EXP)	\
        (*(EXP)->exp_op->export_hold)(EXP)
#define	EXP_RELE(EXP)	\
        (*(EXP)->exp_op->export_rele)(EXP)
#define	EXP_SYSNAME(EXP, INNAME, OUTNAME, NUM, ALLPAGS)   \
        (*(EXP)->exp_op->export_sysname)(EXP, INNAME, OUTNAME, NUM, ALLPAGS)
#define	EXP_GC(EXP, param)	\
        (*(EXP)->exp_op->export_garbagecollect)(EXP, param)
#define	EXP_STATISTICS(EXP)	\
        (*(EXP)->exp_op->export_statistics)(EXP)
#define	EXP_CHECKHOST(EXP, HOST)	\
        (*(EXP)->exp_op->export_checkhost)(EXP, HOST)
#define	EXP_GETHOST(EXP)	\
        (*(EXP)->exp_op->export_gethost)(EXP)

struct afs3_fid {
    u_short len;
    u_short padding;
    afs_uint32 Cell;
    afs_uint32 Volume;
    afs_uint32 Vnode;
    afs_uint32 Unique;
};

struct Sfid {
    afs_uint32 padding;
    afs_uint32 Cell;
    afs_uint32 Volume;
    afs_uint32 Vnode;
    afs_uint32 Unique;
#ifdef	AFS_SUN5_ENV
    struct cred *credp;
#endif
};


#endif /* __EXPORTER__ */
