diff --git a/nfs4/libnfs-raw-nfs4.c b/nfs4/libnfs-raw-nfs4.c index 3027b87..0f450de 100644 --- a/nfs4/libnfs-raw-nfs4.c +++ b/nfs4/libnfs-raw-nfs4.c @@ -2453,6 +2453,87 @@ zdr_SAVEFH4res (ZDR *zdrs, SAVEFH4res *objp) return TRUE; } +uint32_t +zdr_SECINFO4args (ZDR *zdrs, SECINFO4args *objp) +{ + + + if (!zdr_component4 (zdrs, &objp->name)) + return FALSE; + return TRUE; +} + +uint32_t +zdr_rpc_gss_svc_t (ZDR *zdrs, rpc_gss_svc_t *objp) +{ + + + if (!zdr_enum (zdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +uint32_t +zdr_rpcsec_gss_info (ZDR *zdrs, rpcsec_gss_info *objp) +{ + + + if (!zdr_sec_oid4 (zdrs, &objp->oid)) + return FALSE; + if (!zdr_qop4 (zdrs, &objp->qop)) + return FALSE; + if (!zdr_rpc_gss_svc_t (zdrs, &objp->service)) + return FALSE; + return TRUE; +} + +uint32_t +zdr_secinfo4 (ZDR *zdrs, secinfo4 *objp) +{ + + + if (!zdr_uint32_t (zdrs, &objp->flavor)) + return FALSE; + switch (objp->flavor) { + case RPCSEC_GSS: + if (!zdr_rpcsec_gss_info (zdrs, &objp->secinfo4_u.flavor_info)) + return FALSE; + break; + default: + break; + } + return TRUE; +} + +uint32_t +zdr_SECINFO4resok (ZDR *zdrs, SECINFO4resok *objp) +{ + + + if (!zdr_array (zdrs, (char **)&objp->SECINFO4resok_val, (u_int *) &objp->SECINFO4resok_len, ~0, + sizeof (secinfo4), (zdrproc_t) zdr_secinfo4)) + return FALSE; + return TRUE; +} + +uint32_t +zdr_SECINFO4res (ZDR *zdrs, SECINFO4res *objp) +{ + + + if (!zdr_nfsstat4 (zdrs, &objp->status)) + return FALSE; + switch (objp->status) { + case NFS4_OK: + if (!zdr_SECINFO4resok (zdrs, &objp->SECINFO4res_u.resok4)) + return FALSE; + break; + default: + break; + } + return TRUE; +} + uint32_t zdr_SETATTR4args (ZDR *zdrs, SETATTR4args *objp) { @@ -3255,6 +3336,36 @@ zdr_LAYOUTRETURN4res (ZDR *zdrs, LAYOUTRETURN4res *objp) return TRUE; } +uint32_t +zdr_secinfo_style4 (ZDR *zdrs, secinfo_style4 *objp) +{ + + + if (!zdr_enum (zdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +uint32_t +zdr_SECINFO_NO_NAME4args (ZDR *zdrs, SECINFO_NO_NAME4args *objp) +{ + + + if (!zdr_secinfo_style4 (zdrs, objp)) + return FALSE; + return TRUE; +} + +uint32_t +zdr_SECINFO_NO_NAME4res (ZDR *zdrs, SECINFO_NO_NAME4res *objp) +{ + + + if (!zdr_SECINFO4res (zdrs, objp)) + return FALSE; + return TRUE; +} + uint32_t zdr_SEQUENCE4args (ZDR *zdrs, SEQUENCE4args *objp) { @@ -3637,6 +3748,10 @@ zdr_nfs_argop4 (ZDR *zdrs, nfs_argop4 *objp) break; case OP_SAVEFH: break; + case OP_SECINFO: + if (!zdr_SECINFO4args (zdrs, &objp->nfs_argop4_u.opsecinfo)) + return FALSE; + break; case OP_SETATTR: if (!zdr_SETATTR4args (zdrs, &objp->nfs_argop4_u.opsetattr)) return FALSE; @@ -3697,6 +3812,10 @@ zdr_nfs_argop4 (ZDR *zdrs, nfs_argop4 *objp) if (!zdr_LAYOUTRETURN4args (zdrs, &objp->nfs_argop4_u.oplayoutreturn)) return FALSE; break; + case OP_SECINFO_NO_NAME: + if (!zdr_SECINFO_NO_NAME4args (zdrs, &objp->nfs_argop4_u.opsecinfononame)) + return FALSE; + break; case OP_SEQUENCE: if (!zdr_SEQUENCE4args (zdrs, &objp->nfs_argop4_u.opsequence)) return FALSE; @@ -3857,6 +3976,10 @@ zdr_nfs_resop4 (ZDR *zdrs, nfs_resop4 *objp) if (!zdr_SAVEFH4res (zdrs, &objp->nfs_resop4_u.opsavefh)) return FALSE; break; + case OP_SECINFO: + if (!zdr_SECINFO4res (zdrs, &objp->nfs_resop4_u.opsecinfo)) + return FALSE; + break; case OP_SETATTR: if (!zdr_SETATTR4res (zdrs, &objp->nfs_resop4_u.opsetattr)) return FALSE; @@ -3917,6 +4040,10 @@ zdr_nfs_resop4 (ZDR *zdrs, nfs_resop4 *objp) if (!zdr_LAYOUTRETURN4res (zdrs, &objp->nfs_resop4_u.oplayoutreturn)) return FALSE; break; + case OP_SECINFO_NO_NAME: + if (!zdr_SECINFO_NO_NAME4res (zdrs, &objp->nfs_resop4_u.opsecinfononame)) + return FALSE; + break; case OP_SEQUENCE: if (!zdr_SEQUENCE4res (zdrs, &objp->nfs_resop4_u.opsequence)) return FALSE; diff --git a/nfs4/libnfs-raw-nfs4.h b/nfs4/libnfs-raw-nfs4.h index e965b5e..fdb85e1 100644 --- a/nfs4/libnfs-raw-nfs4.h +++ b/nfs4/libnfs-raw-nfs4.h @@ -1232,6 +1232,47 @@ struct SAVEFH4res { }; typedef struct SAVEFH4res SAVEFH4res; +struct SECINFO4args { + component4 name; +}; +typedef struct SECINFO4args SECINFO4args; + +enum rpc_gss_svc_t { + RPC_GSS_SVC_NONE = 1, + RPC_GSS_SVC_INTEGRITY = 2, + RPC_GSS_SVC_PRIVACY = 3, +}; +typedef enum rpc_gss_svc_t rpc_gss_svc_t; + +struct rpcsec_gss_info { + sec_oid4 oid; + qop4 qop; + rpc_gss_svc_t service; +}; +typedef struct rpcsec_gss_info rpcsec_gss_info; +#define RPCSEC_GSS 6 + +struct secinfo4 { + uint32_t flavor; + union { + rpcsec_gss_info flavor_info; + } secinfo4_u; +}; +typedef struct secinfo4 secinfo4; + +typedef struct { + u_int SECINFO4resok_len; + secinfo4 *SECINFO4resok_val; +} SECINFO4resok; + +struct SECINFO4res { + nfsstat4 status; + union { + SECINFO4resok resok4; + } SECINFO4res_u; +}; +typedef struct SECINFO4res SECINFO4res; + struct SETATTR4args { stateid4 stateid; fattr4 obj_attributes; @@ -1632,6 +1673,16 @@ struct LAYOUTRETURN4res { }; typedef struct LAYOUTRETURN4res LAYOUTRETURN4res; +enum secinfo_style4 { + SECINFO_STYLE4_CURRENT_FH = 0, + SECINFO_STYLE4_PARENT = 1, +}; +typedef enum secinfo_style4 secinfo_style4; + +typedef secinfo_style4 SECINFO_NO_NAME4args; + +typedef SECINFO4res SECINFO_NO_NAME4res; + struct SEQUENCE4args { sessionid4 sa_sessionid; sequenceid4 sa_sequenceid; @@ -1828,6 +1879,7 @@ enum nfs_opnum4 { OP_LAYOUTCOMMIT = 49, OP_LAYOUTGET = 50, OP_LAYOUTRETURN = 51, + OP_SECINFO_NO_NAME = 52, OP_SEQUENCE = 53, OP_SET_SSV = 54, OP_TEST_STATEID = 55, @@ -1864,6 +1916,7 @@ struct nfs_argop4 { REMOVE4args opremove; RENAME4args oprename; RENEW4args oprenew; + SECINFO4args opsecinfo; SETATTR4args opsetattr; SETCLIENTID4args opsetclientid; SETCLIENTID_CONFIRM4args opsetclientid_confirm; @@ -1879,6 +1932,7 @@ struct nfs_argop4 { LAYOUTCOMMIT4args oplayoutcommit; LAYOUTGET4args oplayoutget; LAYOUTRETURN4args oplayoutreturn; + SECINFO_NO_NAME4args opsecinfononame; SEQUENCE4args opsequence; SET_SSV4args opsetssv; TEST_STATEID4args opteststateid; @@ -1922,6 +1976,7 @@ struct nfs_resop4 { RENEW4res oprenew; RESTOREFH4res oprestorefh; SAVEFH4res opsavefh; + SECINFO4res opsecinfo; SETATTR4res opsetattr; SETCLIENTID4res opsetclientid; SETCLIENTID_CONFIRM4res opsetclientid_confirm; @@ -1937,6 +1992,7 @@ struct nfs_resop4 { LAYOUTCOMMIT4res oplayoutcommit; LAYOUTGET4res oplayoutget; LAYOUTRETURN4res oplayoutreturn; + SECINFO_NO_NAME4res opsecinfononame; SEQUENCE4res opsequence; SET_SSV4res opsetssv; TEST_STATEID4res opteststateid; @@ -2298,6 +2354,12 @@ extern uint32_t zdr_RENEW4args (ZDR *, RENEW4args*); extern uint32_t zdr_RENEW4res (ZDR *, RENEW4res*); extern uint32_t zdr_RESTOREFH4res (ZDR *, RESTOREFH4res*); extern uint32_t zdr_SAVEFH4res (ZDR *, SAVEFH4res*); +extern uint32_t zdr_SECINFO4args (ZDR *, SECINFO4args*); +extern uint32_t zdr_rpc_gss_svc_t (ZDR *, rpc_gss_svc_t*); +extern uint32_t zdr_rpcsec_gss_info (ZDR *, rpcsec_gss_info*); +extern uint32_t zdr_secinfo4 (ZDR *, secinfo4*); +extern uint32_t zdr_SECINFO4resok (ZDR *, SECINFO4resok*); +extern uint32_t zdr_SECINFO4res (ZDR *, SECINFO4res*); extern uint32_t zdr_SETATTR4args (ZDR *, SETATTR4args*); extern uint32_t zdr_SETATTR4res (ZDR *, SETATTR4res*); extern uint32_t zdr_SETCLIENTID4args (ZDR *, SETCLIENTID4args*); @@ -2349,6 +2411,9 @@ extern uint32_t zdr_layoutreturn4 (ZDR *, layoutreturn4*); extern uint32_t zdr_LAYOUTRETURN4args (ZDR *, LAYOUTRETURN4args*); extern uint32_t zdr_layoutreturn_stateid (ZDR *, layoutreturn_stateid*); extern uint32_t zdr_LAYOUTRETURN4res (ZDR *, LAYOUTRETURN4res*); +extern uint32_t zdr_secinfo_style4 (ZDR *, secinfo_style4*); +extern uint32_t zdr_SECINFO_NO_NAME4args (ZDR *, SECINFO_NO_NAME4args*); +extern uint32_t zdr_SECINFO_NO_NAME4res (ZDR *, SECINFO_NO_NAME4res*); extern uint32_t zdr_SEQUENCE4args (ZDR *, SEQUENCE4args*); extern uint32_t zdr_SEQUENCE4resok (ZDR *, SEQUENCE4resok*); extern uint32_t zdr_SEQUENCE4res (ZDR *, SEQUENCE4res*); @@ -2586,6 +2651,12 @@ extern uint32_t zdr_RENEW4args (); extern uint32_t zdr_RENEW4res (); extern uint32_t zdr_RESTOREFH4res (); extern uint32_t zdr_SAVEFH4res (); +extern uint32_t zdr_SECINFO4args (); +extern uint32_t zdr_rpc_gss_svc_t (); +extern uint32_t zdr_rpcsec_gss_info (); +extern uint32_t zdr_secinfo4 (); +extern uint32_t zdr_SECINFO4resok (); +extern uint32_t zdr_SECINFO4res (); extern uint32_t zdr_SETATTR4args (); extern uint32_t zdr_SETATTR4res (); extern uint32_t zdr_SETCLIENTID4args (); @@ -2637,6 +2708,9 @@ extern uint32_t zdr_layoutreturn4 (); extern uint32_t zdr_LAYOUTRETURN4args (); extern uint32_t zdr_layoutreturn_stateid (); extern uint32_t zdr_LAYOUTRETURN4res (); +extern uint32_t zdr_secinfo_style4 (); +extern uint32_t zdr_SECINFO_NO_NAME4args (); +extern uint32_t zdr_SECINFO_NO_NAME4res (); extern uint32_t zdr_SEQUENCE4args (); extern uint32_t zdr_SEQUENCE4resok (); extern uint32_t zdr_SEQUENCE4res (); diff --git a/nfs4/nfs4.x b/nfs4/nfs4.x index 14f84f6..7c6d476 100644 --- a/nfs4/nfs4.x +++ b/nfs4/nfs4.x @@ -1297,19 +1297,13 @@ struct SAVEFH4res { nfsstat4 status; }; -#if 0 /* * SECINFO: Obtain Available Security Mechanisms */ struct SECINFO4args { - /* CURRENT_FH: directory */ component4 name; }; -/* - - * From RFC 2203 - */ enum rpc_gss_svc_t { RPC_GSS_SVC_NONE = 1, RPC_GSS_SVC_INTEGRITY = 2, @@ -1322,7 +1316,8 @@ struct rpcsec_gss_info { rpc_gss_svc_t service; }; -/* RPCSEC_GSS has a value of '6' - See RFC 2203 */ +const RPCSEC_GSS = 6; + union secinfo4 switch (uint32_t flavor) { case RPCSEC_GSS: rpcsec_gss_info flavor_info; @@ -1338,7 +1333,6 @@ union SECINFO4res switch (nfsstat4 status) { default: void; }; -#endif /* * SETATTR: Set attributes @@ -1746,6 +1740,18 @@ default: void; }; +/* + * SECINFO_NO_NAME + */ +enum secinfo_style4 { + SECINFO_STYLE4_CURRENT_FH = 0, + SECINFO_STYLE4_PARENT = 1 +}; + +typedef secinfo_style4 SECINFO_NO_NAME4args; + +typedef SECINFO4res SECINFO_NO_NAME4res; + /* * SEQUENCE */ @@ -1936,6 +1942,7 @@ enum nfs_opnum4 { OP_LAYOUTCOMMIT = 49, OP_LAYOUTGET = 50, OP_LAYOUTRETURN = 51, + OP_SECINFO_NO_NAME = 52, OP_SEQUENCE = 53, OP_SET_SSV = 54, OP_TEST_STATEID = 55, @@ -1976,9 +1983,7 @@ union nfs_argop4 switch (nfs_opnum4 argop) { case OP_RENEW: RENEW4args oprenew; case OP_RESTOREFH: void; case OP_SAVEFH: void; -#if 0 case OP_SECINFO: SECINFO4args opsecinfo; -#endif case OP_SETATTR: SETATTR4args opsetattr; case OP_SETCLIENTID: SETCLIENTID4args opsetclientid; case OP_SETCLIENTID_CONFIRM: SETCLIENTID_CONFIRM4args @@ -1996,6 +2001,7 @@ union nfs_argop4 switch (nfs_opnum4 argop) { case OP_LAYOUTCOMMIT: LAYOUTCOMMIT4args oplayoutcommit; case OP_LAYOUTGET: LAYOUTGET4args oplayoutget; case OP_LAYOUTRETURN: LAYOUTRETURN4args oplayoutreturn; + case OP_SECINFO_NO_NAME: SECINFO_NO_NAME4args opsecinfononame; case OP_SEQUENCE: SEQUENCE4args opsequence; case OP_SET_SSV: SET_SSV4args opsetssv; case OP_TEST_STATEID: TEST_STATEID4args opteststateid; @@ -2036,9 +2042,7 @@ union nfs_resop4 switch (nfs_opnum4 resop){ case OP_RENEW: RENEW4res oprenew; case OP_RESTOREFH: RESTOREFH4res oprestorefh; case OP_SAVEFH: SAVEFH4res opsavefh; -#if 0 case OP_SECINFO: SECINFO4res opsecinfo; -#endif case OP_SETATTR: SETATTR4res opsetattr; case OP_SETCLIENTID: SETCLIENTID4res opsetclientid; case OP_SETCLIENTID_CONFIRM: SETCLIENTID_CONFIRM4res @@ -2056,6 +2060,7 @@ union nfs_resop4 switch (nfs_opnum4 resop){ case OP_LAYOUTCOMMIT: LAYOUTCOMMIT4res oplayoutcommit; case OP_LAYOUTGET: LAYOUTGET4res oplayoutget; case OP_LAYOUTRETURN: LAYOUTRETURN4res oplayoutreturn; + case OP_SECINFO_NO_NAME: SECINFO_NO_NAME4res opsecinfononame; case OP_SEQUENCE: SEQUENCE4res opsequence; case OP_SET_SSV: SET_SSV4res opsetssv; case OP_TEST_STATEID: TEST_STATEID4res opteststateid;