1 1.3 rin /* $NetBSD: ext2fs_xattr.h,v 1.4 2020/04/16 23:29:53 rin Exp $ */ 2 1.1 jdolecek 3 1.1 jdolecek /*- 4 1.1 jdolecek * Copyright (c) 2016 The NetBSD Foundation, Inc. 5 1.1 jdolecek * All rights reserved. 6 1.1 jdolecek * 7 1.1 jdolecek * This code is derived from software contributed to The NetBSD Foundation 8 1.1 jdolecek * by Jaromir Dolecek. 9 1.1 jdolecek * 10 1.1 jdolecek * Redistribution and use in source and binary forms, with or without 11 1.1 jdolecek * modification, are permitted provided that the following conditions 12 1.1 jdolecek * are met: 13 1.1 jdolecek * 1. Redistributions of source code must retain the above copyright 14 1.1 jdolecek * notice, this list of conditions and the following disclaimer. 15 1.1 jdolecek * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 jdolecek * notice, this list of conditions and the following disclaimer in the 17 1.1 jdolecek * documentation and/or other materials provided with the distribution. 18 1.1 jdolecek * 19 1.1 jdolecek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 jdolecek * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 jdolecek * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 jdolecek * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 jdolecek * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 jdolecek * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 jdolecek * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 jdolecek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 jdolecek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 jdolecek * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 jdolecek * POSSIBILITY OF SUCH DAMAGE. 30 1.1 jdolecek */ 31 1.1 jdolecek 32 1.1 jdolecek #ifndef _UFS_EXT2FS_EXT2FS_XATTR_H_ 33 1.1 jdolecek #define _UFS_EXT2FS_EXT2FS_XATTR_H_ 34 1.1 jdolecek 35 1.4 rin #include <sys/cdefs.h> 36 1.4 rin __KERNEL_RCSID(0, "$NetBSD: ext2fs_xattr.h,v 1.4 2020/04/16 23:29:53 rin Exp $"); 37 1.4 rin 38 1.1 jdolecek #ifdef _KERNEL 39 1.1 jdolecek 40 1.1 jdolecek #define EXT2FS_XATTR_MAGIC 0xEA020000 41 1.1 jdolecek 42 1.1 jdolecek #define EXT2FS_XATTR_NAME_LEN_MAX 255 43 1.1 jdolecek #define EXT2FS_XATTR_REFCOUNT_MAX 1024 44 1.1 jdolecek 45 1.1 jdolecek /* 46 1.1 jdolecek * This is used as header for extended attribute block within inode 47 1.1 jdolecek */ 48 1.1 jdolecek struct ext2fs_xattr_ibody_header { 49 1.1 jdolecek uint32_t h_magic; /* Magic number - 0xEA020000 */ 50 1.1 jdolecek }; 51 1.1 jdolecek 52 1.1 jdolecek /* 53 1.1 jdolecek * This is used as header for extended attribute on separate disk block 54 1.1 jdolecek */ 55 1.1 jdolecek struct ext2fs_xattr_header { 56 1.1 jdolecek uint32_t h_magic; /* Magic number - 0xEA020000 */ 57 1.1 jdolecek uint32_t h_refcount; /* Reference count */ 58 1.1 jdolecek uint32_t h_blocks; /* Number of blocks - only 1 supported */ 59 1.1 jdolecek uint32_t h_hash; /* Hash of all attributes */ 60 1.1 jdolecek uint32_t h_checksum; /* Checksum of the extended attribute block */ 61 1.1 jdolecek uint32_t h_reserved[3]; 62 1.1 jdolecek }; 63 1.1 jdolecek 64 1.1 jdolecek /* 65 1.1 jdolecek * Extended attribute on-disk header structure 66 1.1 jdolecek */ 67 1.1 jdolecek struct ext2fs_xattr_entry { 68 1.1 jdolecek uint8_t e_name_len; /* Name length */ 69 1.1 jdolecek uint8_t e_name_index; /* Name prefix index (see below) */ 70 1.1 jdolecek uint16_t e_value_offs; /* Offset of value within block */ 71 1.1 jdolecek uint32_t e_value_block; /* Value block - not supported (always zero) */ 72 1.1 jdolecek uint32_t e_value_size; /* Length of value */ 73 1.1 jdolecek uint32_t e_hash; /* Hash (not supported) */ 74 1.1 jdolecek char e_name[0]; /* Name string (e_name_len bytes) */ 75 1.1 jdolecek }; 76 1.1 jdolecek 77 1.1 jdolecek /* 78 1.1 jdolecek * Linux kernel checks only the 0, we also check that the current entry 79 1.1 jdolecek * doesn't overflow past end. 80 1.1 jdolecek */ 81 1.1 jdolecek #define EXT2FS_XATTR_IS_LAST_ENTRY(entry, end) \ 82 1.2 macallan (*((uint32_t *)(entry)) == 0 || (uintptr_t)EXT2FS_XATTR_NEXT(entry) > (uintptr_t)end) 83 1.1 jdolecek 84 1.1 jdolecek /* 85 1.1 jdolecek * Each ext2fs_xattr_entry starts on next 4-byte boundary, pad if necessary. 86 1.1 jdolecek */ 87 1.1 jdolecek #define EXT2FS_XATTR_PAD 4 88 1.1 jdolecek #define EXT2FS_XATTR_ROUND (EXT2FS_XATTR_PAD - 1) 89 1.1 jdolecek #define EXT2FS_XATTR_LEN(name_len) \ 90 1.1 jdolecek (((name_len) + EXT2FS_XATTR_ROUND + \ 91 1.1 jdolecek sizeof(struct ext2fs_xattr_entry)) & ~EXT2FS_XATTR_ROUND) 92 1.1 jdolecek #define EXT2FS_XATTR_NEXT(entry) \ 93 1.1 jdolecek (struct ext2fs_xattr_entry *)(((uint8_t *)(entry)) + EXT2FS_XATTR_LEN((entry)->e_name_len)) 94 1.1 jdolecek 95 1.1 jdolecek #define EXT2FS_XATTR_IFIRST(h) (void *)&(h)[1] 96 1.1 jdolecek #define EXT2FS_XATTR_BFIRST(h) EXT2FS_XATTR_IFIRST(h) 97 1.1 jdolecek 98 1.1 jdolecek /* 99 1.1 jdolecek * Name prefixes 100 1.1 jdolecek */ 101 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_NONE 0 /* no prefix */ 102 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_USER 1 /* "user." */ 103 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_POSIX_ACCESS 2 /* "system.posix_acl_access" */ 104 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_POSIX_DEFAULT1 3 /* "system.posix_acl_default" */ 105 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_TRUSTED 4 /* "trusted." */ 106 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_SECURITY 6 /* "security." */ 107 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_SYSTEM 7 /* "system." */ 108 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_SYSTEM_RICHACL 8 /* "system.richacl" */ 109 1.1 jdolecek #define EXT2FS_XATTR_PREFIX_ENCRYPTION 9 /* "c" */ 110 1.1 jdolecek 111 1.1 jdolecek int ext2fs_getextattr(void *); 112 1.1 jdolecek int ext2fs_setextattr(void *); 113 1.1 jdolecek int ext2fs_listextattr(void *); 114 1.1 jdolecek int ext2fs_deleteextattr(void *); 115 1.1 jdolecek #endif /* _KERNEL */ 116 1.1 jdolecek 117 1.1 jdolecek #endif /* _UFS_EXT2FS_EXT2FS_XATTR_H_ */ 118