Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update UKXattrMetadataStore.[mh] again #9

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 24 additions & 8 deletions UKXattrMetadataStore.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,27 @@ NS_ASSUME_NONNULL_BEGIN
The file to get xattr names from.
@param travLnk
If <code>YES</code>, follows symlinks.
@return An \c NSArray of <code>NSString</code>s, or \c nil on failure.
@return An \c NSArray of <code>NSString</code>s, or an empty array on failure.
@discussion Returns an \c NSArray of <code>NSString</code>s containing all xattr names currently set
for the file at the specified path.
*/
+(NSArray<NSString*>*) allKeysAtPath: (NSString*)path traverseLink: (BOOL)travLnk NS_SWIFT_NAME(keys(path:traverseLink:));
+(NSArray<NSString*>*) allKeysAtPath: (NSString*)path traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '+allKeysAtPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("");

/*!
@method allKeysAtPath:traverseLink:
@param path
The file to get xattr names from.
@param travLnk
If <code>YES</code>, follows symlinks.
@param error
If the method does not complete successfully, upon return
contains an \c NSError object that describes the problem.
@return An \c NSArray of <code>NSString</code>s, or \c nil on failure.
@discussion Returns an \c NSArray of <code>NSString</code>s containing all xattr names currently set
for the file at the specified path. Will return an empty \c NSArray if the file does not
have any extended attributes.
*/
+(nullable NSArray<NSString*>*) allKeysAtPath: (NSString*)path traverseLink: (BOOL)travLnk error:(NSError * _Nullable __autoreleasing * _Nullable)error NS_SWIFT_NAME(keys(path:traverseLink:));


#pragma mark Store UTF8 strings:
Expand All @@ -87,7 +103,7 @@ NS_ASSUME_NONNULL_BEGIN
@deprecated This method throws an Obj-C exception. No other error information is provided, not even if it was successful.
*/
+(void) setString: (NSString*)str forKey: (NSString*)key
atPath: (NSString*)path traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '-setString:forKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'setString(_:forKey:atPath:traverseLink:) throws' instead");
atPath: (NSString*)path traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '+setString:forKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'setString(_:forKey:atPath:traverseLink:) throws' instead");

/*!
@method setString:forKey:atPath:traverseLink:error:
Expand Down Expand Up @@ -123,7 +139,7 @@ NS_ASSUME_NONNULL_BEGIN
@deprecated This method has no error handling.
*/
+(nullable NSString*) stringForKey: (NSString*)key atPath: (NSString*)path
traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '-stringForKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'string(forKey:atPath:traverseLink:) throws' instead");
traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '+stringForKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'string(forKey:atPath:traverseLink:) throws' instead");

/*!
@method stringForKey:atPath:traverseLink:error:
Expand Down Expand Up @@ -160,7 +176,7 @@ NS_ASSUME_NONNULL_BEGIN
@deprecated This method has no way of indicating success or failure.
*/
+(void) setData: (NSData*)data forKey: (NSString*)key
atPath: (NSString*)path traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '-setData:forKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'setData(_:forKey:atPath:traverseLink:) throws' instead");
atPath: (NSString*)path traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '+setData:forKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'setData(_:forKey:atPath:traverseLink:) throws' instead");
/*!
@method setData:forKey:atPath:traverseLink:error:
@brief Set the xattr with name \c key to the raw data in <code>data</code>.
Expand Down Expand Up @@ -195,7 +211,7 @@ NS_ASSUME_NONNULL_BEGIN
@deprecated This method throws an Obj-C exception. No other error information is provoded on failure.
*/
+(nullable NSData*) dataForKey: (NSString*)key atPath: (NSString*)path
traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '-dataForKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'data(forKey:atPath:traverseLink:) throws' instead");
traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '+dataForKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'data(forKey:atPath:traverseLink:) throws' instead");
/*!
@method dataForKey:atPath:traverseLink:error:
@brief Get the xattr with name \c key as raw data.
Expand Down Expand Up @@ -231,7 +247,7 @@ NS_ASSUME_NONNULL_BEGIN
not even if it was successful.
*/
+(void) setObject: (id)obj forKey: (NSString*)key atPath: (NSString*)path
traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '-setPlist:asXMLForKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'setPlistAsXML(_:key:path:traverseLink:) throws' instead");
traverseLink: (BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '+setPlist:asXMLForKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'setPlistAsXML(_:key:path:traverseLink:) throws' instead");

/*!
@method setPlist:asXMLForKey:atPath:traverseLink:error:
Expand Down Expand Up @@ -267,7 +283,7 @@ property list representation of
@deprecated This method throws an Obj-C exception. No other error information is provided,
not even if it was successful.
*/
+(nullable id) objectForKey: (NSString*)key atPath: (NSString*)path traverseLink:(BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '-plistForXMLInKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'plistFromXML(key:path:traverseLink:) throws' instead");
+(nullable id) objectForKey: (NSString*)key atPath: (NSString*)path traverseLink:(BOOL)travLnk DEPRECATED_MSG_ATTRIBUTE("Use '+plistForXMLInKey:atPath:traverseLink:error:' instead.") NS_SWIFT_UNAVAILABLE("Use 'plistFromXML(key:path:traverseLink:) throws' instead");

/*!
@method plistForXMLInKey:atPath:traverseLink:error:
Expand Down
24 changes: 20 additions & 4 deletions UKXattrMetadataStore.m
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,29 @@
@implementation UKXattrMetadataStore

+(NSArray*) allKeysAtPath: (NSString*)path traverseLink:(BOOL)travLnk
{
NSArray *tmpArray = [self allKeysAtPath: path traverseLink: travLnk error: NULL];
if (tmpArray == nil) {
return @[];
}
return tmpArray;
}


+(NSArray*) allKeysAtPath: (NSString*)path traverseLink:(BOOL)travLnk error:(NSError * _Nullable __autoreleasing * _Nullable)error
{
NSMutableArray<NSString*>* allKeys = [NSMutableArray array];
size_t dataSize = listxattr( [path fileSystemRepresentation],
ssize_t dataSize = listxattr( [path fileSystemRepresentation],
NULL, ULONG_MAX,
(travLnk ? 0 : XATTR_NOFOLLOW) );
if (dataSize == ULONG_MAX) {
if (dataSize == 0) {
return allKeys; // Empty list.
} else if (dataSize == -1) {
if (error) {
*error = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno
userInfo:@{NSFilePathErrorKey: path}];
}
return nil;
}

NSMutableData* listBuffer = [NSMutableData dataWithLength: dataSize];
Expand Down Expand Up @@ -162,9 +178,9 @@ +(nullable NSData*) dataForKey: (NSString*)key atPath: (NSString*)path traverseL
{
NSAssert(key.length <= ULIMaxXAttrKeyLength, @"Key length limit exceeded.");

size_t dataSize = getxattr( [path fileSystemRepresentation], [key UTF8String],
ssize_t dataSize = getxattr( [path fileSystemRepresentation], [key UTF8String],
NULL, ULONG_MAX, 0, (travLnk ? 0 : XATTR_NOFOLLOW) );
if( dataSize == ULONG_MAX ) {
if( dataSize == -1 ) {
if (error) {
*error = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:@{NSFilePathErrorKey: path}];
}
Expand Down