bool_t smb_token_xdr(XDR *xdrs, smb_token_t *objp) { if (!smb_id_xdr(xdrs, &objp->tkn_user)) return (FALSE); if (!smb_id_xdr(xdrs, &objp->tkn_owner)) return (FALSE); if (!smb_id_xdr(xdrs, &objp->tkn_primary_grp)) return (FALSE); if (!smb_ids_xdr(xdrs, &objp->tkn_win_grps)) return (FALSE); if (!smb_privset_helper_xdr(xdrs, (char **)&objp->tkn_privileges)) return (FALSE); if (!xdr_string(xdrs, &objp->tkn_account_name, ~0)) return (FALSE); if (!xdr_string(xdrs, &objp->tkn_domain_name, ~0)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->tkn_flags)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->tkn_audit_sid)) return (FALSE); if (!xdr_pointer(xdrs, (char **)&objp->tkn_session_key, sizeof (smb_session_key_t), (xdrproc_t)smb_session_key_xdr)) return (FALSE); if (!smb_posix_grps_helper_xdr(xdrs, (char **)&objp->tkn_posix_grps)) return (FALSE); return (TRUE); }
bool_t dfs_info_xdr(XDR *xdrs, dfs_info_t *objp) { if (!xdr_vector(xdrs, (char *)objp->i_uncpath, DFS_PATH_MAX, sizeof (char), (xdrproc_t)xdr_char)) return (FALSE); if (!xdr_vector(xdrs, (char *)objp->i_comment, DFS_COMMENT_MAX, sizeof (char), (xdrproc_t)xdr_char)) return (FALSE); if (!xdr_vector(xdrs, (char *)objp->i_guid, UUID_PRINTABLE_STRING_LENGTH, sizeof (char), (xdrproc_t)xdr_char)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->i_state)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->i_timeout)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->i_propflags)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->i_type)) return (FALSE); if (!xdr_array(xdrs, (char **)&objp->i_targets, (uint32_t *)&objp->i_ntargets, ~0, sizeof (dfs_target_t), (xdrproc_t)dfs_target_xdr)) return (FALSE); return (TRUE); }
/* * XDR encode/decode for smb_netuserinfo_t. */ bool_t smb_netuserinfo_xdr(XDR *xdrs, smb_netuserinfo_t *objp) { if (!xdr_uint64_t(xdrs, &objp->ui_session_id)) return (FALSE); if (!xdr_uint16_t(xdrs, &objp->ui_smb_uid)) return (FALSE); if (!xdr_uint16_t(xdrs, &objp->ui_domain_len)) return (FALSE); if (!xdr_string(xdrs, &objp->ui_domain, ~0)) return (FALSE); if (!xdr_uint16_t(xdrs, &objp->ui_account_len)) return (FALSE); if (!xdr_string(xdrs, &objp->ui_account, ~0)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->ui_posix_uid)) return (FALSE); if (!xdr_uint16_t(xdrs, &objp->ui_workstation_len)) return (FALSE); if (!xdr_string(xdrs, &objp->ui_workstation, ~0)) return (FALSE); if (!smb_inaddr_xdr(xdrs, &objp->ui_ipaddr)) return (FALSE); if (!xdr_int32_t(xdrs, &objp->ui_native_os)) return (FALSE); if (!xdr_int64_t(xdrs, &objp->ui_logon_time)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->ui_numopens)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->ui_flags)) return (FALSE); return (TRUE); }
bool_t xdr_geo_sync_data_ret_t (XDR *xdrs, geo_sync_data_ret_t *objp) { //register int32_t *buf; if (!xdr_uint16_t (xdrs, &objp->eid)) return FALSE; if (!xdr_uint16_t (xdrs, &objp->site_id)) return FALSE; if (!xdr_uint64_t (xdrs, &objp->file_idx)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->local_ref)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->remote_ref)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->last)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->first_record)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->nb_records)) return FALSE; if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, ~0)) return FALSE; return TRUE; }
bool_t xdr_nis_oid(XDR *xdrs, nis_oid *objp) { if (!xdr_uint32_t(xdrs, &objp->ctime)) return (FALSE); return (xdr_uint32_t(xdrs, &objp->mtime)); }
bool_t _xdr_nis_result (XDR *xdrs, nis_result *objp) { bool_t res = xdr_nis_error (xdrs, &objp->status); if (__builtin_expect (res, TRUE)) { res = xdr_array (xdrs, (void *) &objp->objects.objects_val, &objp->objects.objects_len, ~0, sizeof (nis_object), (xdrproc_t) _xdr_nis_object); if (__builtin_expect (res, TRUE)) { res = xdr_netobj (xdrs, &objp->cookie); if (__builtin_expect (res, TRUE)) { res = xdr_uint32_t (xdrs, &objp->zticks); if (__builtin_expect (res, TRUE)) { res = xdr_uint32_t (xdrs, &objp->dticks); if (__builtin_expect (res, TRUE)) { res = xdr_uint32_t (xdrs, &objp->aticks); if (__builtin_expect (res, TRUE)) res = xdr_uint32_t (xdrs, &objp->cticks); } } } } } return res; }
/* * XDR the MSG_DENIED part of a reply message union */ bool_t xdr_rejected_reply(XDR *xdrs, struct rejected_reply *rr) { enum reject_stat *prj_stat; enum auth_stat *prj_why; assert(xdrs != NULL); assert(rr != NULL); prj_stat = &rr->rj_stat; /* personalized union, rather than calling xdr_union */ if (! xdr_enum(xdrs, (enum_t *) prj_stat)) return (FALSE); switch (rr->rj_stat) { case RPC_MISMATCH: if (! xdr_uint32_t(xdrs, &(rr->rj_vers.low))) return (FALSE); return (xdr_uint32_t(xdrs, &(rr->rj_vers.high))); case AUTH_ERROR: prj_why = &rr->rj_why; return (xdr_enum(xdrs, (enum_t *) prj_why)); } /* NOTREACHED */ assert(0); return (FALSE); }
bool_t xdr_disk_vol_t( XDR *xdrs, disk_vol_t *objp) { if (!xdr_vsn_t(xdrs, objp->vol_name)) return (FALSE); if (!xdr_host_t(xdrs, objp->host)) return (FALSE); if (!xdr_upath_t(xdrs, objp->path)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->set_flags)) return (FALSE); /* added in 4.4 release */ #ifdef SAMRPC_CLIENT if (xdrs->x_op == XDR_DECODE || xdrs->x_op == XDR_ENCODE) { if ((xdrs->x_public != NULL) && (strcmp(xdrs->x_public, "1.2") <= 0)) { return (TRUE); /* versions 1.2 or lower */ } } #endif /* samrpc_client */ if (!xdr_fsize_t(xdrs, &objp->capacity)) return (FALSE); if (!xdr_fsize_t(xdrs, &objp->free_space)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->status_flags)) return (FALSE); return (TRUE); }
static bool_t xdr_nis_oid (XDR *xdrs, nis_oid *objp) { bool_t res = xdr_uint32_t (xdrs, &objp->ctime); if (__builtin_expect (res, TRUE)) res = xdr_uint32_t (xdrs, &objp->mtime); return res; }
static bool_t smb_luid_xdr(XDR *xdrs, smb_luid_t *objp) { if (!xdr_uint32_t(xdrs, &objp->lo_part)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->hi_part)) return (FALSE); return (TRUE); }
bool_t xdr_storcli_read_no_data_ret_t (XDR *xdrs, storcli_read_no_data_ret_t *objp) { //register int32_t *buf; if (!xdr_uint32_t (xdrs, &objp->alignment)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->len)) return FALSE; return TRUE; }
bool_t xdr_kdbe_time_t (XDR *xdrs, kdbe_time_t *objp) { int32_t *buf; if (!xdr_uint32_t (xdrs, &objp->seconds)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->useconds)) return FALSE; return TRUE; }
bool_t xdr_pmap( XDR *xdrs, struct pmap *regs) { if (xdr_uint32_t(xdrs, ®s->pm_prog) && xdr_uint32_t(xdrs, ®s->pm_vers) && xdr_uint32_t(xdrs, ®s->pm_prot)) return (xdr_uint32_t(xdrs, ®s->pm_port)); return (FALSE); }
bool_t _xdr_cp_result (XDR *xdrs, cp_result *objp) { bool_t res = xdr_nis_error (xdrs, &objp->cp_status); if (__builtin_expect (res, TRUE)) { res = xdr_uint32_t (xdrs, &objp->cp_zticks); if (__builtin_expect (res, TRUE)) res = xdr_uint32_t (xdrs, &objp->cp_dticks); } return res; }
/* * XDR a list_t list of elements * offset - offset of list_node_t in list element * elsize - size of list element * elproc - XDR function for the list element */ bool_t smb_list_xdr(XDR *xdrs, list_t *list, const size_t offset, const size_t elsize, const xdrproc_t elproc) { void *node; uint32_t count = 0; switch (xdrs->x_op) { case XDR_ENCODE: node = list_head(list); while (node) { ++count; node = list_next(list, node); } if (!xdr_uint32_t(xdrs, &count)) return (FALSE); node = list_head(list); while (node) { if (!elproc(xdrs, node)) return (FALSE); node = list_next(list, node); } return (TRUE); case XDR_DECODE: if (!xdr_uint32_t(xdrs, &count)) return (FALSE); list_create(list, elsize, offset); while (count) { node = MEM_MALLOC("xdr", elsize); if (node == NULL) return (FALSE); if (!elproc(xdrs, node)) return (FALSE); list_insert_tail(list, node); --count; } return (TRUE); case XDR_FREE: while ((node = list_head(list)) != NULL) { list_remove(list, node); (void) elproc(xdrs, node); MEM_FREE("xdr", node); } list_destroy(list); return (TRUE); } return (FALSE); }
static bool_t smb_privset_xdr(XDR *xdrs, smb_privset_t *objp) { if (!xdr_uint32_t(xdrs, &objp->priv_cnt)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->control)) return (FALSE); if (!xdr_vector(xdrs, (char *)objp->priv, objp->priv_cnt, sizeof (smb_luid_attrs_t), (xdrproc_t)smb_luid_attrs_xdr)) return (FALSE); return (TRUE); }
bool_t _xdr_nis_object (XDR *xdrs, nis_object *objp) { bool_t res = xdr_nis_oid (xdrs, &objp->zo_oid); if (__builtin_expect (res, TRUE)) { res = xdr_nis_name (xdrs, &objp->zo_name); if (__builtin_expect (res, TRUE)) { res = xdr_nis_name (xdrs, &objp->zo_owner); if (__builtin_expect (res, TRUE)) { res = xdr_nis_name (xdrs, &objp->zo_group); if (__builtin_expect (res, TRUE)) { res = xdr_nis_name (xdrs, &objp->zo_domain); if (__builtin_expect (res, TRUE)) { res = xdr_u_int (xdrs, &objp->zo_access); if (__builtin_expect (res, TRUE)) { res = xdr_uint32_t (xdrs, &objp->zo_ttl); if (__builtin_expect (res, TRUE)) res = xdr_objdata (xdrs, &objp->zo_data); } } } } } } return res; }
bool_t xdr_storcli_read_arg_t (XDR *xdrs, storcli_read_arg_t *objp) { //register int32_t *buf; //int i; if (!xdr_uint16_t (xdrs, &objp->cid)) return FALSE; if (!xdr_uint8_t (xdrs, &objp->sid)) return FALSE; if (!xdr_uint8_t (xdrs, &objp->layout)) return FALSE; if (!xdr_uint8_t (xdrs, &objp->spare)) return FALSE; if (!xdr_vector (xdrs, (char *)objp->dist_set, ROZOFS_SAFE_MAX, sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) return FALSE; if (!xdr_storcli_uuid_t (xdrs, objp->fid)) return FALSE; if (!xdr_uint8_t (xdrs, &objp->proj_id)) return FALSE; if (!xdr_uint64_t (xdrs, &objp->bid)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->nb_proj)) return FALSE; return TRUE; }
bool_t xdr_storcli_write_arg_no_data_t (XDR *xdrs, storcli_write_arg_no_data_t *objp) { //register int32_t *buf; //int i; if (!xdr_uint16_t (xdrs, &objp->cid)) return FALSE; if (!xdr_uint8_t (xdrs, &objp->sid)) return FALSE; if (!xdr_uint8_t (xdrs, &objp->empty_file)) return FALSE; if (!xdr_uint8_t (xdrs, &objp->layout)) return FALSE; if (!xdr_vector (xdrs, (char *)objp->dist_set, ROZOFS_SAFE_MAX, sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) return FALSE; if (!xdr_storcli_uuid_t (xdrs, objp->fid)) return FALSE; if (!xdr_uint64_t (xdrs, &objp->off)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->len)) return FALSE; return TRUE; }
bool_t xdr_count4(XDR *xdrs, count4 *objp) { if (!xdr_uint32_t(xdrs, objp)) return (FALSE); return (TRUE); }
bool_t xdr_fsdb_client (XDR *xdrs, fsdb_client *objp) { if (!xdr_fsdb_client_id (xdrs, &objp->id)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->flags)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->sequence_id)) return FALSE; if (!xdr_opaque (xdrs, objp->verifier, NFS_VERIFIER_SIZE)) return FALSE; if (!xdr_bytes (xdrs, (char **)&objp->owner.owner_val, (u_int *) &objp->owner.owner_len, NFS_OPAQUE_LIMIT)) return FALSE; return TRUE; }
static bool_t smb_posix_grps_helper_xdr(XDR *xdrs, char **identity) { uint32_t pos, len; uint32_t cnt; bool_t rc; if (xdrs->x_op == XDR_DECODE) { pos = xdr_getpos(xdrs); if (!xdr_bool(xdrs, &rc)) return (FALSE); if (!xdr_uint32_t(xdrs, &cnt)) return (FALSE); rc = xdr_setpos(xdrs, pos); if (rc == FALSE) return (FALSE); } else { if (*identity == NULL) return (FALSE); cnt = ((smb_posix_grps_t *)(uintptr_t)*identity)->pg_ngrps; } len = SMB_POSIX_GRPS_SIZE(cnt); if (!xdr_pointer(xdrs, identity, len, (xdrproc_t)smb_posix_grps_xdr)) return (FALSE); return (TRUE); }
bool_t _xdr_directory_obj (XDR *xdrs, directory_obj *objp) { bool_t res = xdr_nis_name (xdrs, &objp->do_name); if (__builtin_expect (res, TRUE)) { res = xdr_nstype (xdrs, &objp->do_type); if (__builtin_expect (res, TRUE)) { res = xdr_array (xdrs, (void *) &objp->do_servers.do_servers_val, &objp->do_servers.do_servers_len, ~0, sizeof (nis_server), (xdrproc_t) _xdr_nis_server); if (__builtin_expect (res, TRUE)) { res = xdr_uint32_t (xdrs, &objp->do_ttl); if (__builtin_expect (res, TRUE)) res = xdr_array (xdrs, (void *) &objp->do_armask.do_armask_val, &objp->do_armask.do_armask_len, ~0, sizeof (oar_mask), (xdrproc_t) xdr_oar_mask); } } } return res; }
/* * Custom XDR routine for our API structure fmd_stat_t. This function must * match the definition of fmd_stat_t in <fm/fmd_api.h> and must also match * the corresponding routine in usr/src/cmd/fm/fmd/common/fmd_rpc_adm.c. */ bool_t xdr_fmd_stat(XDR *xp, fmd_stat_t *sp) { bool_t rv = TRUE; rv &= xdr_opaque(xp, sp->fmds_name, sizeof (sp->fmds_name)); rv &= xdr_u_int(xp, &sp->fmds_type); rv &= xdr_opaque(xp, sp->fmds_desc, sizeof (sp->fmds_desc)); switch (sp->fmds_type) { case FMD_TYPE_BOOL: rv &= xdr_int(xp, &sp->fmds_value.bool); break; case FMD_TYPE_INT32: rv &= xdr_int32_t(xp, &sp->fmds_value.i32); break; case FMD_TYPE_UINT32: rv &= xdr_uint32_t(xp, &sp->fmds_value.ui32); break; case FMD_TYPE_INT64: rv &= xdr_int64_t(xp, &sp->fmds_value.i64); break; case FMD_TYPE_UINT64: case FMD_TYPE_TIME: case FMD_TYPE_SIZE: rv &= xdr_uint64_t(xp, &sp->fmds_value.ui64); break; case FMD_TYPE_STRING: rv &= xdr_string(xp, &sp->fmds_value.str, ~0); break; } return (rv); }
bool_t xdr_uint32 (XDR *xdrs, uint32 *objp) { if (!xdr_uint32_t (xdrs, objp)) return FALSE; return TRUE; }
bool_t xdr_geo_sync_delete_req_arg_t (XDR *xdrs, geo_sync_delete_req_arg_t *objp) { //register int32_t *buf; if (!xdr_uint16_t (xdrs, &objp->eid)) return FALSE; if (!xdr_uint16_t (xdrs, &objp->site_id)) return FALSE; if (!xdr_uint64_t (xdrs, &objp->file_idx)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->local_ref)) return FALSE; if (!xdr_uint32_t (xdrs, &objp->remote_ref)) return FALSE; return TRUE; }
bool_t _xdr_ping_args (XDR *xdrs, ping_args *objp) { bool_t res = xdr_nis_name (xdrs, &objp->dir); if (__builtin_expect (res, TRUE)) res = xdr_uint32_t (xdrs, &objp->stamp); return res; }
static bool_t smb_luid_attrs_xdr(XDR *xdrs, smb_luid_attrs_t *objp) { if (!smb_luid_xdr(xdrs, &objp->luid)) return (FALSE); if (!xdr_uint32_t(xdrs, &objp->attrs)) return (FALSE); return (TRUE); }
bool_t xdr_kdb_sno_t (XDR *xdrs, kdb_sno_t *objp) { int32_t *buf; if (!xdr_uint32_t (xdrs, objp)) return FALSE; return TRUE; }
static int send_file_chunk (guestfs_h *g, int cancel, const char *buf, size_t buflen) { u_int32_t len; int r; guestfs_chunk chunk; XDR xdr; char *msg_out; size_t msg_out_size; /* Allocate the chunk buffer. Don't use the stack to avoid * excessive stack usage and unnecessary copies. */ msg_out = safe_malloc (g, GUESTFS_MAX_CHUNK_SIZE + 4 + 48); xdrmem_create (&xdr, msg_out + 4, GUESTFS_MAX_CHUNK_SIZE + 48, XDR_ENCODE); /* Serialize the chunk. */ chunk.cancel = cancel; chunk.data.data_len = buflen; chunk.data.data_val = (char *) buf; if (!xdr_guestfs_chunk (&xdr, &chunk)) { error (g, _("xdr_guestfs_chunk failed (buf = %p, buflen = %zu)"), buf, buflen); xdr_destroy (&xdr); goto cleanup1; } len = xdr_getpos (&xdr); xdr_destroy (&xdr); /* Reduce the size of the outgoing message buffer to the real length. */ msg_out = safe_realloc (g, msg_out, len + 4); msg_out_size = len + 4; xdrmem_create (&xdr, msg_out, 4, XDR_ENCODE); xdr_uint32_t (&xdr, &len); r = guestfs___send_to_daemon (g, msg_out, msg_out_size); /* Did the daemon send a cancellation message? */ if (r == -2) { debug (g, "got daemon cancellation"); return -2; } if (r == -1) goto cleanup1; free (msg_out); return 0; cleanup1: free (msg_out); return -1; }