fhtab.h revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1999 by Sun Microsystems, Inc.
* All rights reserved.
*/
#ifndef _FHTAB_H
#define _FHTAB_H
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* Support for the fh mapping file for nfslog.
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
* RPC dispatch table for file handles
* Indexed by program, version, proc
* Based on NFS dispatch table.
* Differences: no xdr of args/res.
*/
struct nfsl_fh_proc_disp {
void (*nfsl_dis_args)(); /* dispatch routine for proc */
bool_t (*xdr_args)(); /* XDR function for arguments */
bool_t (*xdr_res)(); /* XDR function for results */
int args_size; /* size of arguments struct */
int res_size; /* size of results struct */
};
struct nfsl_fh_vers_disp {
int nfsl_dis_nprocs; /* number of procs */
struct nfsl_fh_proc_disp *nfsl_dis_proc_table; /* proc array */
};
struct nfsl_fh_prog_disp {
int nfsl_dis_prog; /* program number */
int nfsl_dis_versmin; /* minimum version number */
int nfsl_dis_nvers; /* number of version values */
struct nfsl_fh_vers_disp *nfsl_dis_vers_table; /* versions array */
};
/* key comprised of inode/gen, currenly 8 or 10 bytes */
#define PRIMARY_KEY_LEN_MAX 16
typedef char fh_primary_key[PRIMARY_KEY_LEN_MAX];
/* link key - directory primary key plus name (upto 2 components) */
#define SECONDARY_KEY_LEN_MAX (PRIMARY_KEY_LEN_MAX + MAXPATHLEN)
typedef char fh_secondary_key[SECONDARY_KEY_LEN_MAX];
/*
* This is the runtime filehandle table entry. Because an fhandle_t is
* used for both Version 2 and Version 3, we don't need two different types
* of entries in the table.
*/
typedef struct fhlist_ent {
fhandle_t fh; /* filehandle for this component */
time32_t mtime; /* modification time of entry */
time32_t atime; /* access time of entry */
fhandle_t dfh; /* parent filehandle for this component */
ushort_t flags;
short reclen; /* length of record */
char name[MAXPATHLEN]; /* variable record */
} fhlist_ent;
/* flags values */
#define EXPORT_POINT 0x01 /* if this is export point */
#define NAME_DELETED 0x02 /* is the dir info still valid for this fh? */
#define PUBLIC_PATH 0x04 /* is the dir info still valid for this fh? */
/*
* Information maintained for the secondary key
* Note that this is a variable length record with 4 variable size fields:
* fhkey - primary key (must be there)
* name - component name (must be there)
* next - next link in list (could be null)
* prev - previous link in list (could be null)
*/
#define MAX_LINK_VARBUF (3 * SECONDARY_KEY_LEN_MAX)
typedef struct linkinfo_ent {
fhandle_t dfh; /* directory filehandle */
time32_t mtime; /* modification time of entry */
time32_t atime; /* access time of entry */
ushort_t flags;
short reclen; /* Actual record length */
short fhkey_offset; /* offset of fhkey, from head of record */
short name_offset; /* offset of name */
short next_offset; /* offset of next link key */
short prev_offset; /* offset of prev link key */
char varbuf[MAX_LINK_VARBUF]; /* max size for above */
} linkinfo_ent;
/* Macros for lengths of the various fields */
#define LN_FHKEY_LEN(link) ((link)->name_offset - (link)->fhkey_offset)
#define LN_NAME_LEN(link) ((link)->next_offset - (link)->name_offset)
#define LN_NEXT_LEN(link) ((link)->prev_offset - (link)->next_offset)
#define LN_PREV_LEN(link) ((link)->reclen - (link)->prev_offset)
/* Macros for address of the various fields */
#define LN_FHKEY(link) (char *)((uintptr_t)(link) + (link)->fhkey_offset)
#define LN_NAME(link) (char *)((uintptr_t)(link) + (link)->name_offset)
#define LN_NEXT(link) (char *)((uintptr_t)(link) + (link)->next_offset)
#define LN_PREV(link) (char *)((uintptr_t)(link) + (link)->prev_offset)
/* Which record can reside in database */
typedef union {
fhlist_ent fhlist_rec;
linkinfo_ent link_rec;
} db_record;
void debug_opaque_print(FILE *, void *buf, int size);
int db_add(char *fhpath, fhandle_t *dfh, char *name, fhandle_t *fh,
uint_t flags);
fhlist_ent *db_lookup(char *fhpath, fhandle_t *fh, fhlist_ent *fhrecp,
int *errorp);
fhlist_ent *db_lookup_link(char *fhpath, fhandle_t *dfh, char *name,
fhlist_ent *fhrecp, int *errorp);
int db_delete(char *fhpath, fhandle_t *fh);
int db_delete_link(char *fhpath, fhandle_t *dfh, char *name);
int db_rename_link(char *fhpath, fhandle_t *from_dfh, char *from_name,
fhandle_t *to_dfh, char *to_name);
void db_print_all_keys(char *fhpath, fsid_t *fsidp, FILE *fp);
char *nfslog_get_path(fhandle_t *fh, char *name, char *fhpath, char *prtstr);
extern fhandle_t public_fh;
/*
* Macro to determine which fhandle to use - input or public fh
*/
#define NFSLOG_GET_FHANDLE2(fh) \
(((fh)->fh_len > 0) ? fh : &public_fh)
/*
* Macro to determine which fhandle to use - input or public fh
*/
#define NFSLOG_GET_FHANDLE3(fh3) \
(((fh3)->fh3_length == sizeof (fhandle_t)) ? \
&(fh3)->fh3_u.nfs_fh3_i.fh3_i : &public_fh)
#ifdef __cplusplus
}
#endif
#endif /* _FHTAB_H */