void gssx_enc_accept_sec_context(struct rpc_rqst *req, struct xdr_stream *xdr, struct gssx_arg_accept_sec_context *arg) { int err; err = gssx_enc_call_ctx(xdr, &arg->call_ctx); if (err) goto done; /* arg->context_handle */ if (arg->context_handle) { err = gssx_enc_ctx(xdr, arg->context_handle); if (err) goto done; } else { err = gssx_enc_bool(xdr, 0); } /* arg->cred_handle */ if (arg->cred_handle) { err = gssx_enc_cred(xdr, arg->cred_handle); if (err) goto done; } else { err = gssx_enc_bool(xdr, 0); } /* arg->input_token */ err = gssx_enc_in_token(xdr, &arg->input_token); if (err) goto done; /* arg->input_cb */ if (arg->input_cb) { err = gssx_enc_cb(xdr, arg->input_cb); if (err) goto done; } else { err = gssx_enc_bool(xdr, 0); } err = gssx_enc_bool(xdr, arg->ret_deleg_cred); if (err) goto done; /* leave options empty for now, will add once we have any options * to pass up at all */ /* arg->options */ err = dummy_enc_opt_array(xdr, &arg->options); xdr_inline_pages(&req->rq_rcv_buf, PAGE_SIZE/2 /* pretty arbitrary */, arg->pages, 0 /* page base */, arg->npages * PAGE_SIZE); done: if (err) dprintk("RPC: gssx_enc_accept_sec_context: %d\n", err); }
static int gssx_dec_name(struct xdr_stream *xdr, struct gssx_name *name) { struct xdr_netobj dummy_netobj = { .len = 0 }; struct gssx_name_attr_array dummy_name_attr_array = { .count = 0 }; struct gssx_option_array dummy_option_array = { .count = 0 }; int err; /* name->display_name */ err = gssx_dec_buffer(xdr, &name->display_name); if (err) return err; /* name->name_type */ err = gssx_dec_buffer(xdr, &dummy_netobj); if (err) return err; /* name->exported_name */ err = gssx_dec_buffer(xdr, &dummy_netobj); if (err) return err; /* name->exported_composite_name */ err = gssx_dec_buffer(xdr, &dummy_netobj); if (err) return err; /* we assume we have no attributes for now, so simply consume them */ /* name->name_attributes */ err = dummy_dec_nameattr_array(xdr, &dummy_name_attr_array); if (err) return err; /* we assume we have no options for now, so simply consume them */ /* name->extensions */ err = dummy_dec_opt_array(xdr, &dummy_option_array); return err; } static int dummy_enc_credel_array(struct xdr_stream *xdr, struct gssx_cred_element_array *cea) { __be32 *p; if (cea->count != 0) return -EINVAL; p = xdr_reserve_space(xdr, 4); if (!p) return -ENOSPC; *p = 0; return 0; } static int gssx_enc_cred(struct xdr_stream *xdr, struct gssx_cred *cred) { int err; /* cred->desired_name */ err = gssx_enc_name(xdr, &cred->desired_name); if (err) return err; /* cred->elements */ err = dummy_enc_credel_array(xdr, &cred->elements); if (err) return err; /* cred->cred_handle_reference */ err = gssx_enc_buffer(xdr, &cred->cred_handle_reference); if (err) return err; /* cred->needs_release */ err = gssx_enc_bool(xdr, cred->needs_release); return err; } static int gssx_enc_ctx(struct xdr_stream *xdr, struct gssx_ctx *ctx) { __be32 *p; int err; /* ctx->exported_context_token */ err = gssx_enc_buffer(xdr, &ctx->exported_context_token); if (err) return err; /* ctx->state */ err = gssx_enc_buffer(xdr, &ctx->state); if (err) return err; /* ctx->need_release */ err = gssx_enc_bool(xdr, ctx->need_release); if (err) return err; /* ctx->mech */ err = gssx_enc_buffer(xdr, &ctx->mech); if (err) return err; /* ctx->src_name */ err = gssx_enc_name(xdr, &ctx->src_name); if (err) return err; /* ctx->targ_name */ err = gssx_enc_name(xdr, &ctx->targ_name); if (err) return err; /* ctx->lifetime */ p = xdr_reserve_space(xdr, 8+8); if (!p) return -ENOSPC; p = xdr_encode_hyper(p, ctx->lifetime); /* ctx->ctx_flags */ p = xdr_encode_hyper(p, ctx->ctx_flags); /* ctx->locally_initiated */ err = gssx_enc_bool(xdr, ctx->locally_initiated); if (err) return err; /* ctx->open */ err = gssx_enc_bool(xdr, ctx->open); if (err) return err; /* leave options empty for now, will add once we have any options * to pass up at all */ /* ctx->options */ err = dummy_enc_opt_array(xdr, &ctx->options); return err; }