int acl3svc_submit_reply (rpcsvc_request_t *req, void *arg, acl3_serializer sfunc) { struct iovec outmsg = {0, }; struct iobuf *iob = NULL; struct nfs3_state *nfs3 = NULL; int ret = -1; struct iobref *iobref = NULL; if (!req) return -1; nfs3 = (struct nfs3_state *)rpcsvc_request_program_private (req); if (!nfs3) { gf_log (GF_ACL, GF_LOG_ERROR, "mount state not found"); goto ret; } /* First, get the io buffer into which the reply in arg will * be serialized. */ iob = iobuf_get (nfs3->iobpool); if (!iob) { gf_log (GF_ACL, GF_LOG_ERROR, "Failed to get iobuf"); goto ret; } iobuf_to_iovec (iob, &outmsg); /* Use the given serializer to translate the give C structure in arg * to XDR format which will be written into the buffer in outmsg. */ outmsg.iov_len = sfunc (outmsg, arg); iobref = iobref_new (); if (iobref == NULL) { gf_log (GF_ACL, GF_LOG_ERROR, "Failed to get iobref"); goto ret; } iobref_add (iobref, iob); /* Then, submit the message for transmission. */ ret = rpcsvc_submit_message (req, &outmsg, 1, NULL, 0, iobref); if (ret == -1) { gf_log (GF_ACL, GF_LOG_ERROR, "Reply submission failed"); goto ret; } ret = 0; ret: if (iob) iobuf_unref (iob); if (iobref) iobref_unref (iobref); return ret; }
int acl3svc_submit_reply (rpcsvc_request_t *req, void *arg, acl3_serializer sfunc) { struct iovec outmsg = {0, }; struct iobuf *iob = NULL; struct nfs3_state *nfs3 = NULL; int ret = -1; ssize_t msglen = 0; struct iobref *iobref = NULL; if (!req) return -1; nfs3 = (struct nfs3_state *)rpcsvc_request_program_private (req); if (!nfs3) { gf_msg (GF_ACL, GF_LOG_ERROR, EINVAL, NFS_MSG_MNT_STATE_NOT_FOUND, "mount state not found"); goto ret; } /* First, get the io buffer into which the reply in arg will * be serialized. */ iob = iobuf_get (nfs3->iobpool); if (!iob) { gf_msg (GF_ACL, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, "Failed to get iobuf"); goto ret; } iobuf_to_iovec (iob, &outmsg); /* Use the given serializer to translate the give C structure in arg * to XDR format which will be written into the buffer in outmsg. */ msglen = sfunc (outmsg, arg); if (msglen < 0) { gf_msg (GF_ACL, GF_LOG_ERROR, errno, NFS_MSG_ENCODE_MSG_FAIL, "Failed to encode message"); goto ret; } outmsg.iov_len = msglen; iobref = iobref_new (); if (iobref == NULL) { gf_msg (GF_ACL, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, "Failed to get iobref"); goto ret; } ret = iobref_add (iobref, iob); if (ret) { gf_msg (GF_ACL, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, "Failed to add iob to iobref"); goto ret; } /* Then, submit the message for transmission. */ ret = rpcsvc_submit_message (req, &outmsg, 1, NULL, 0, iobref); if (ret == -1) { gf_msg (GF_ACL, GF_LOG_ERROR, errno, NFS_MSG_REP_SUBMIT_FAIL, "Reply submission failed"); goto ret; } ret = 0; ret: if (iob) iobuf_unref (iob); if (iobref) iobref_unref (iobref); return ret; }