📄 nfs_xdr.c
字号:
}/* * Arguments to readdir */bool_txdr_rddirargs(xdrs, rda) XDR *xdrs; struct nfsrddirargs *rda;{ if (xdr_fhandle(xdrs, &rda->rda_fh) && xdr_u_long(xdrs, &rda->rda_offset) && xdr_u_long(xdrs, &rda->rda_count) ) {#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_rddirargs: %s fh %o %d, off %d, cnt %d\n", xdropnames[(int)xdrs->x_op], rda->rda_fh.fh_fsid, rda->rda_fh.fh_fno, rda->rda_offset, rda->rda_count);#endif return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_rddirargs: %s FAILED\n", xdropnames[(int)xdrs->x_op]);#endif return (FALSE);}/* * Directory read reply: * union (enum status) { * NFS_OK: entlist; * boolean eof; * default: * } * * Directory entries * struct direct { * u_long d_fileno; * inode number of entry * * u_short d_reclen; * length of this record * * u_short d_namlen; * length of string in d_name * * char d_name[MAXNAMLEN + 1]; * name no longer than this * * }; * are on the wire as: * union entlist (boolean valid) { * TRUE: struct dirent; * u_long nxtoffset; * union entlist; * FALSE: * } * where dirent is: * struct dirent { * u_long de_fid; * string de_name<NFS_MAXNAMELEN>; * } */#define nextdp(dp) ((struct direct *)((int)(dp) + (dp)->d_reclen))#undef DIRSIZ#define DIRSIZ(dp) (sizeof(struct direct) - MAXNAMLEN + (dp)->d_namlen)/* * ENCODE ONLY */bool_txdr_putrddirres(xdrs, rd) XDR *xdrs; struct nfsrddirres *rd;{ register struct direct *dp; register int size; u_long offset; char *name; u_int namlen; int xdrpos; bool_t true = TRUE; bool_t false = FALSE;#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_putrddirres: %s size %d offset %d\n", xdropnames[(int)xdrs->x_op], rd->rd_size, rd->rd_offset);#endif if (xdrs->x_op != XDR_ENCODE) { return (FALSE); } if (!xdr_enum(xdrs, (enum_t *)&rd->rd_status)) { return (FALSE); } if (rd->rd_status != NFS_OK) { return (TRUE); } xdrpos = XDR_GETPOS(xdrs); for (offset = rd->rd_offset, size = rd->rd_size, dp = rd->rd_entries; size > 0; size -= dp->d_reclen, dp = nextdp(dp) ) { if (dp->d_reclen == 0 || DIRSIZ(dp) > dp->d_reclen) {#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_putrddirres: bad directory\n");#endif return (FALSE); } offset += dp->d_reclen;#ifdef NFSDEBUG dprint(nfsdebug, 10, "xdr_putrddirres: entry %d %s(%d) %d %d %d %d\n", dp->d_fileno, dp->d_name, dp->d_namlen, offset, dp->d_reclen, XDR_GETPOS(xdrs), size);#endif if (dp->d_fileno == 0) { continue; } name = dp->d_name; namlen = dp->d_namlen; if (!xdr_bool(xdrs, &true) || !xdr_u_long(xdrs, &dp->d_fileno) || !xdr_bytes(xdrs, &name, &namlen, NFS_MAXNAMLEN) || !xdr_u_long(xdrs, &offset) ) { return (FALSE); } if (XDR_GETPOS(xdrs) - xdrpos >= rd->rd_bufallocsize) { rd->rd_eof = FALSE; break; } } if (!xdr_bool(xdrs, &false)) { return (FALSE); } if (!xdr_bool(xdrs, &rd->rd_eof)) { return (FALSE); } return (TRUE);}/* there was an error in calculating the record length fo each directory */#define roundtoint(x) (((x) + (sizeof(int) - 1)) & ~(sizeof(int) - 1))#define reclen(dp) roundtoint(((dp)->d_namlen + 1 + sizeof(u_long) +\ 2 * sizeof(u_short)))/* * DECODE ONLY */bool_txdr_getrddirres(xdrs, rd) XDR *xdrs; struct nfsrddirres *rd;{ register struct direct *dp; register int size; bool_t valid; u_long offset = (u_long)-1; if (!xdr_enum(xdrs, (enum_t *)&rd->rd_status)) {#ifdef NFSDEBUG dprint(nfsdebug, 6, "getrddires failed doing status\n");#endif return (FALSE); } if (rd->rd_status != NFS_OK) { return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_getrddirres: %s size %d\n", xdropnames[(int)xdrs->x_op], rd->rd_size);#endif size = rd->rd_size; dp = rd->rd_entries; for (;;) { if (!xdr_bool(xdrs, &valid)) {#ifdef NFSDEBUG dprint(nfsdebug, 6, "getrddires failed doing valid\n");#endif return (FALSE); } if (valid) {#ifdef NFSDEBUG if (!xdr_u_long(xdrs, &dp->d_fileno)) { printf("entry err on fileno\n"); return (FALSE); } if (!xdr_u_short(xdrs, &dp->d_namlen)) { printf("entry error on namlen\n"); return (FALSE); } if (reclen(dp) > size) {printf("entry error on reclen -- reclen %d size %d\n", reclen(dp), size); return (FALSE); } if (!xdr_opaque(xdrs, dp->d_name, (u_int)dp->d_namlen)) { printf("entry error on name\n"); return (FALSE); } if (!xdr_u_long(xdrs, &offset) ) { printf("entry error on offset\n"); return (FALSE); }#else NFSDEBUG if (!xdr_u_long(xdrs, &dp->d_fileno) || !xdr_u_short(xdrs, &dp->d_namlen) || (reclen(dp) > size) || !xdr_opaque(xdrs, dp->d_name, (u_int)dp->d_namlen)|| !xdr_u_long(xdrs, &offset) ) { return (FALSE); }#endif NFSDEBUG dp->d_reclen = reclen(dp); dp->d_name[dp->d_namlen] = '\0';#ifdef NFSDEBUG dprint(nfsdebug, 10, "xdr_getrddirres: entry %d %s(%d) %d %d\n", dp->d_fileno, dp->d_name, dp->d_namlen, dp->d_reclen, offset);#endif NFSDEBUG } else { break; } size -= dp->d_reclen; if (size <= 0) { return (FALSE); } dp = nextdp(dp); } if (!xdr_bool(xdrs, &rd->rd_eof)) { return (FALSE); } rd->rd_size = (int)dp - (int)(rd->rd_entries); rd->rd_offset = offset;#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_getrddirres: returning size %d offset %d eof %d\n", rd->rd_size, rd->rd_offset, rd->rd_eof);#endif return (TRUE);}/* * Arguments for directory operations */bool_txdr_diropargs(xdrs, da) XDR *xdrs; struct nfsdiropargs *da;{ if (xdr_fhandle(xdrs, &da->da_fhandle) && xdr_string(xdrs, &da->da_name, NFS_MAXNAMLEN) ) {#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_diropargs: %s %o %d '%s'\n", xdropnames[(int)xdrs->x_op], da->da_fhandle.fh_fsid, da->da_fhandle.fh_fno, da->da_name);#endif return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_diropargs: FAILED\n");#endif return (FALSE);}/* * NFS_OK part of directory operation result */bool_txdr_drok(xdrs, drok) XDR *xdrs; struct nfsdrok *drok;{ if (xdr_fhandle(xdrs, &drok->drok_fhandle) && xdr_fattr(xdrs, &drok->drok_attr) ) { return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_drok: FAILED\n");#endif return (FALSE);}struct xdr_discrim diropres_discrim[2] = { { (int)NFS_OK, xdr_drok }, { __dontcare__, NULL_xdrproc_t }};/* * Results from directory operation */bool_txdr_diropres(xdrs, dr) XDR *xdrs; struct nfsdiropres *dr;{ if (xdr_union(xdrs, (enum_t *)&(dr->dr_status), (caddr_t)&(dr->dr_drok), diropres_discrim, xdr_void) ) {#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_diropres: %s stat %d\n", xdropnames[(int)xdrs->x_op], dr->dr_status);#endif return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_diropres: FAILED\n");#endif return (FALSE);}/* * Time structure */bool_txdr_timeval(xdrs, tv) XDR *xdrs; struct timeval *tv;{ if (xdr_long(xdrs, &tv->tv_sec) && xdr_long(xdrs, &tv->tv_usec) ) { return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_timeval: FAILED\n");#endif return (FALSE);}/* * arguments to setattr */bool_txdr_saargs(xdrs, argp) XDR *xdrs; struct nfssaargs *argp;{ if (xdr_fhandle(xdrs, &argp->saa_fh) && xdr_sattr(xdrs, &argp->saa_sa) ) {#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_saargs: %s %o %d\n", xdropnames[(int)xdrs->x_op], argp->saa_fh.fh_fsid, argp->saa_fh.fh_fno);#endif return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_saargs: FAILED\n");#endif return (FALSE);}/* * arguments to create and mkdir */bool_txdr_creatargs(xdrs, argp) XDR *xdrs; struct nfscreatargs *argp;{ if (xdr_diropargs(xdrs, &argp->ca_da) && xdr_sattr(xdrs, &argp->ca_sa) ) { return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_creatargs: FAILED\n");#endif return (FALSE);}/* * arguments to link */bool_txdr_linkargs(xdrs, argp) XDR *xdrs; struct nfslinkargs *argp;{ if (xdr_fhandle(xdrs, &argp->la_from) && xdr_diropargs(xdrs, &argp->la_to) ) { return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_linkargs: FAILED\n");#endif return (FALSE);}/* * arguments to rename */bool_txdr_rnmargs(xdrs, argp) XDR *xdrs; struct nfsrnmargs *argp;{ if (xdr_diropargs(xdrs, &argp->rna_from) && xdr_diropargs(xdrs, &argp->rna_to) ) { return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_rnmargs: FAILED\n");#endif return (FALSE);}/* * arguments to symlink */bool_txdr_slargs(xdrs, argp) XDR *xdrs; struct nfsslargs *argp;{ if (xdr_diropargs(xdrs, &argp->sla_from) && xdr_string(xdrs, &argp->sla_tnm, (u_int)MAXPATHLEN) && xdr_sattr(xdrs, &argp->sla_sa) ) { return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_slargs: FAILED\n");#endif return (FALSE);}/* * NFS_OK part of statfs operation */xdr_fsok(xdrs, fsok) XDR *xdrs; struct nfsstatfsok *fsok;{#ifdef GFSDEBUG if(GFS[14]) printf("xdr_fsok: called\n");#endif if (xdr_long(xdrs, (long *)&fsok->fsok_tsize) && xdr_long(xdrs, (long *)&fsok->fsok_bsize) && xdr_long(xdrs, (long *)&fsok->fsok_blocks) && xdr_long(xdrs, (long *)&fsok->fsok_bfree) && xdr_long(xdrs, (long *)&fsok->fsok_bavail) ) {#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_fsok: %s tsz %d bsz %d blks %d bfree %d bavail %d\n", xdropnames[(int)xdrs->x_op], fsok->fsok_tsize, fsok->fsok_bsize, fsok->fsok_blocks, fsok->fsok_bfree, fsok->fsok_bavail);#endif return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_fsok: FAILED\n");#endif return (FALSE);}struct xdr_discrim statfs_discrim[2] = { { (int)NFS_OK, xdr_fsok }, { __dontcare__, NULL_xdrproc_t }};/* * Results of statfs operation */xdr_statfs(xdrs, fs) XDR *xdrs; struct nfsstatfs *fs;{#ifdef NFSDEBUG dprint(nfsdebug, 4, "xdr_statfs: were here\n");#endif if (xdr_union(xdrs, (enum_t *)&(fs->fs_status), (caddr_t)&(fs->fs_fsok), statfs_discrim, xdr_void) ) {#ifdef NFSDEBUG dprint(nfsdebug, 6, "xdr_statfs: %s stat %d\n", xdropnames[(int)xdrs->x_op], fs->fs_status);#endif return (TRUE); }#ifdef NFSDEBUG dprint(nfsdebug, 2, "xdr_statfs: FAILED\n");#endif return (FALSE);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -