Index: utils/ofarc/OFArc.m ================================================================== --- utils/ofarc/OFArc.m +++ utils/ofarc/OFArc.m @@ -319,12 +319,13 @@ files = [remainingArguments objectsInRange: of_range(1, remainingArguments.count - 1)]; #ifdef OF_HAVE_SANDBOX - [sandbox unveilPath: remainingArguments.firstObject - permissions: (mode == 'a' ? @"rwc" : @"wc")]; + if (![remainingArguments.firstObject isEqual: @"-"]) + [sandbox unveilPath: remainingArguments.firstObject + permissions: (mode == 'a' ? @"rwc" : @"wc")]; for (OFString *path in files) [sandbox unveilPath: path permissions: @"r"]; @@ -343,12 +344,14 @@ case 'l': if (remainingArguments.count != 1) help(of_stderr, false, 1); #ifdef OF_HAVE_SANDBOX - [sandbox unveilPath: remainingArguments.firstObject - permissions: @"r"]; + if (![remainingArguments.firstObject isEqual: @"-"]) + [sandbox unveilPath: remainingArguments.firstObject + permissions: @"r"]; + sandbox.allowsUnveil = false; [OFApplication activateSandbox: sandbox]; #endif archive = [self @@ -362,12 +365,14 @@ case 'p': if (remainingArguments.count < 1) help(of_stderr, false, 1); #ifdef OF_HAVE_SANDBOX - [sandbox unveilPath: remainingArguments.firstObject - permissions: @"r"]; + if (![remainingArguments.firstObject isEqual: @"-"]) + [sandbox unveilPath: remainingArguments.firstObject + permissions: @"r"]; + sandbox.allowsUnveil = false; [OFApplication activateSandbox: sandbox]; #endif files = [remainingArguments objectsInRange: @@ -387,12 +392,13 @@ files = [remainingArguments objectsInRange: of_range(1, remainingArguments.count - 1)]; #ifdef OF_HAVE_SANDBOX - [sandbox unveilPath: remainingArguments.firstObject - permissions: @"r"]; + if (![remainingArguments.firstObject isEqual: @"-"]) + [sandbox unveilPath: remainingArguments.firstObject + permissions: @"r"]; if (files.count > 0) for (OFString *path in files) [sandbox unveilPath: path permissions: @"wc"]; @@ -464,11 +470,11 @@ type: (OFString *)type mode: (char)mode encoding: (of_string_encoding_t)encoding { OFString *modeString, *fileModeString; - OFFile *file = nil; + OFStream *file = nil; id archive = nil; [_archivePath release]; _archivePath = [path copy]; @@ -490,24 +496,40 @@ break; default: @throw [OFInvalidArgumentException exception]; } - @try { - file = [OFFile fileWithPath: path - mode: fileModeString]; - } @catch (OFOpenItemFailedException *e) { - OFString *error = [OFString - stringWithCString: strerror(e.errNo) - encoding: [OFLocale encoding]]; - [of_stderr writeString: @"\r"]; - [of_stderr writeLine: OF_LOCALIZED( - @"failed_to_open_file", - @"Failed to open file %[file]: %[error]", - @"file", e.path, - @"error", error)]; - [OFApplication terminateWithStatus: 1]; + if ([path isEqual: @"-"]) { + switch (mode) { + case 'a': + case 'c': + file = of_stdout; + break; + case 'l': + case 'p': + case 'x': + file = of_stdin; + break; + default: + @throw [OFInvalidArgumentException exception]; + } + } else { + @try { + file = [OFFile fileWithPath: path + mode: fileModeString]; + } @catch (OFOpenItemFailedException *e) { + OFString *error = [OFString + stringWithCString: strerror(e.errNo) + encoding: [OFLocale encoding]]; + [of_stderr writeString: @"\r"]; + [of_stderr writeLine: OF_LOCALIZED( + @"failed_to_open_file", + @"Failed to open file %[file]: %[error]", + @"file", e.path, + @"error", error)]; + [OFApplication terminateWithStatus: 1]; + } } if (type == nil || [type isEqual: @"auto"]) { /* This one has to be first for obvious reasons */ if ([path hasSuffix: @".tar.gz"] || [path hasSuffix: @".tgz"] ||