/* * Copyright (c) 2023 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. The rights granted to you under the License * may not be used to create, or enable the creation or redistribution of, * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ subsystem #if KERNEL_USER KernelUser #endif /* KERNEL_USER */ doubleagent 6300; #include #include import ; #define MAX_NUM_OF_XATTRS 256 #define DA_XATTR_MAXNAMELEN 127 // Must match the 'XATTR_MAXNAMELEN' in . #define XATTR_FINDERINFO_NAME_LEN 21 // sizeof("com.apple.FinderInfo") (including '\0') #define XATTR_RESOURCEFORK_NAME_LEN 23 // sizeof("com.apple.ResourceFork") (including '\0') #define LISTXATTR_RESULT_MAX_NAMES_LEN_MIG (XATTR_FINDERINFO_NAME_LEN + XATTR_RESOURCEFORK_NAME_LEN + (MAX_NUM_OF_XATTRS * ((DA_XATTR_MAXNAMELEN + 1)))) // Mig copy of LISTXATTR_RESULT_MAX_NAMES_LEN #define LISTXATTR_RESULT_MAX_HINTS_LEN_MIG (MAX_NUM_OF_XATTRS * 8) // Mig copy of LISTXATTR_RESULT_MAX_HINTS_LEN (8 = 2 * sizeof(uint32_t)) #define LISTXATTR_RESULT_MAX_SIZE_MIG (LISTXATTR_RESULT_MAX_NAMES_LEN_MIG + LISTXATTR_RESULT_MAX_HINTS_LEN_MIG) // Mig copy of LISTXATTR_RESULT_MAX_SIZE #define LISTXATTR_RESULT_MAX_SIZE_INCLUDING_HEADER_MIG (LISTXATTR_RESULT_MAX_SIZE_MIG + 56) // 56 = 7 fields of uint64_t. type xattrname = c_string[*:DA_XATTR_MAXNAMELEN + 1]; type listxattrs_result_t = struct [LISTXATTR_RESULT_MAX_SIZE_INCLUDING_HEADER_MIG] of uint8_t; routine doubleagent_lookup_xattr( server : mach_port_t; in file_port : mach_port_move_send_t; /* fileport */ in file_size : int64_t; /* AD file size */ in name : xattrname; /* xattr name to lookup */ out err : int; /* error value */ out value_offset : uint64_t; /* returned xattr offset */ out value_length : uint64_t /* returned xattr length */ ); routine doubleagent_allocate_xattr( server : mach_port_t; in file_port : mach_port_move_send_t; /* fileport */ in file_size : int64_t; /* AD file size */ in name : xattrname; /* xattr name to allocate */ in size : uint64_t; /* xattr size to allocate */ in options : uint32_t; /* how to allocate */ out err : int; /* error value */ out value_offset : uint64_t /* returned xattr offset */ ); routine doubleagent_list_xattrs( server : mach_port_t; in file_port : mach_port_move_send_t; /* fileport */ in file_size : int64_t; /* AD file size */ out err : int; /* error value */ out result : listxattrs_result_t /* listxattr result struct */ ); routine doubleagent_remove_xattr( server : mach_port_t; in file_port : mach_port_move_send_t; /* fileport */ in file_size : int64_t; /* AD file size */ in name : xattrname; /* xattr name to remove */ out err : int; /* error value */ out is_empty : boolean_t /* true if we've removed the last xattr in file */ );