if (da->version == 3) {
snprintf(hex_attr, 10, "0x%x", da->attr);
ret = ndr_write_string(n, hex_attr);
} else {
ret = ndr_write_string(n, "");
} if (ret) return ret;
ret = ndr_write_int16(n, da->version); if (ret) return ret;
ret = ndr_write_int32(n, da->version); if (ret) return ret;
ret = ndr_write_int32(n, da->flags); if (ret) return ret;
ret = ndr_write_int32(n, da->attr); if (ret) return ret;
if (da->version == 3) {
ret = ndr_write_int32(n, da->ea_size); if (ret) return ret;
ret = ndr_write_int64(n, da->size); if (ret) return ret;
ret = ndr_write_int64(n, da->alloc_size);
} else {
ret = ndr_write_int64(n, da->itime);
} if (ret) return ret;
ret = ndr_write_int64(n, da->create_time); if (ret) return ret;
if (da->version == 3)
ret = ndr_write_int64(n, da->change_time); return ret;
}
int ndr_decode_dos_attr(struct ndr *n, struct xattr_dos_attrib *da)
{ char hex_attr[12]; unsignedint version2; int ret;
n->offset = 0;
ret = ndr_read_string(n, hex_attr, sizeof(hex_attr)); if (ret) return ret;
ret = ndr_read_int16(n, &da->version); if (ret) return ret;
if (da->version != 3 && da->version != 4) {
ksmbd_debug(VFS, "v%d version is not supported\n", da->version); return -EINVAL;
}
ret = ndr_read_int32(n, &version2); if (ret) return ret;
if (da->version != version2) {
ksmbd_debug(VFS, "ndr version mismatched(version: %d, version2: %d)\n",
da->version, version2); return -EINVAL;
}
ret = ndr_read_int32(n, NULL); if (ret) return ret;
ret = ndr_read_int32(n, &da->attr); if (ret) return ret;
if (da->version == 4) {
ret = ndr_read_int64(n, &da->itime); if (ret) return ret;
ret = ndr_read_int64(n, &da->create_time);
} else {
ret = ndr_read_int32(n, NULL); if (ret) return ret;
ret = ndr_read_int64(n, NULL); if (ret) return ret;
ret = ndr_read_int64(n, NULL); if (ret) return ret;
ret = ndr_read_int64(n, &da->create_time); if (ret) return ret;
ret = ndr_read_int64(n, NULL);
}
return ret;
}
staticint ndr_encode_posix_acl_entry(struct ndr *n, struct xattr_smb_acl *acl)
{ int i, ret;
ret = ndr_write_int32(n, acl->count); if (ret) return ret;
n->offset = ALIGN(n->offset, 8);
ret = ndr_write_int32(n, acl->count); if (ret) return ret;
ret = ndr_write_int32(n, 0); if (ret) return ret;
for (i = 0; i < acl->count; i++) {
n->offset = ALIGN(n->offset, 8);
ret = ndr_write_int16(n, acl->entries[i].type); if (ret) return ret;
ret = ndr_write_int16(n, acl->entries[i].type); if (ret) return ret;
if (acl->entries[i].type == SMB_ACL_USER) {
n->offset = ALIGN(n->offset, 8);
ret = ndr_write_int64(n, acl->entries[i].uid);
} elseif (acl->entries[i].type == SMB_ACL_GROUP) {
n->offset = ALIGN(n->offset, 8);
ret = ndr_write_int64(n, acl->entries[i].gid);
} if (ret) return ret;
/* push permission */
ret = ndr_write_int32(n, acl->entries[i].perm);
}
ret = ndr_write_int16(n, acl->version); if (ret) return ret;
ret = ndr_write_int32(n, acl->version); if (ret) return ret;
ret = ndr_write_int16(n, 2); if (ret) return ret;
ret = ndr_write_int32(n, ref_id); if (ret) return ret;
/* push hash type and hash 64bytes */
ret = ndr_write_int16(n, acl->hash_type); if (ret) return ret;
ret = ndr_write_bytes(n, acl->hash, XATTR_SD_HASH_SIZE); if (ret) return ret;
ret = ndr_write_bytes(n, acl->desc, acl->desc_len); if (ret) return ret;
ret = ndr_write_int64(n, acl->current_time); if (ret) return ret;
ret = ndr_write_bytes(n, acl->posix_acl_hash, XATTR_SD_HASH_SIZE); if (ret) return ret;
/* push ndr for security descriptor */
ret = ndr_write_bytes(n, acl->sd_buf, acl->sd_size); return ret;
}
int ndr_decode_v4_ntacl(struct ndr *n, struct xattr_ntacl *acl)
{ unsignedint version2; int ret;
n->offset = 0;
ret = ndr_read_int16(n, &acl->version); if (ret) return ret; if (acl->version != 4) {
ksmbd_debug(VFS, "v%d version is not supported\n", acl->version); return -EINVAL;
}
ret = ndr_read_int32(n, &version2); if (ret) return ret; if (acl->version != version2) {
ksmbd_debug(VFS, "ndr version mismatched(version: %d, version2: %d)\n",
acl->version, version2); return -EINVAL;
}
/* Read Level */
ret = ndr_read_int16(n, NULL); if (ret) return ret;
/* Read Ref Id */
ret = ndr_read_int32(n, NULL); if (ret) return ret;
ret = ndr_read_int16(n, &acl->hash_type); if (ret) return ret;
ret = ndr_read_bytes(n, acl->hash, XATTR_SD_HASH_SIZE); if (ret) return ret;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.