1
2
3
4
5
6
7
8
9
|
1
2
3
4
5
6
7
8
9
|
-
+
|
/*
* Copyright (c) 2008-2022 Jonathan Schleifer <js@nil.im>
* Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
|
| ︙ | | |
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
+
-
|
#include <string.h>
#import "OFApplication.h"
#import "OFArray.h"
#import "OFFile.h"
#import "OFFileManager.h"
#import "OFIRI.h"
#import "OFLocale.h"
#import "OFOptionsParser.h"
#import "OFSandbox.h"
#import "OFStdIOStream.h"
#import "OFURI.h"
#import "OFArc.h"
#import "GZIPArchive.h"
#import "LHAArchive.h"
#import "TarArchive.h"
#import "ZIPArchive.h"
|
| ︙ | | |
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
-
+
-
+
-
+
|
if (full) {
[stream writeString: @"\n"];
[stream writeLine: OF_LOCALIZED(@"full_usage",
@"Options:\n"
@" -a --append Append to archive\n"
@" -c --create Create archive\n"
@" -C --directory Extract into the specified "
@" -C --directory= Extract into the specified "
@"directory\n"
@" -E --encoding The encoding used by the archive "
@" -E --encoding= The encoding used by the archive "
"(only tar files)\n"
@" -f --force Force / overwrite files\n"
@" -h --help Show this help\n"
@" -l --list List all files in the archive\n"
@" -n --no-clobber Never overwrite files\n"
@" -p --print Print one or more files from the "
@"archive\n"
@" -q --quiet Quiet mode (no output, except "
@"errors)\n"
@" -t --type Archive type (gz, lha, tar, tgz, "
@" -t --type= Archive type (gz, lha, tar, tgz, "
@"zip)\n"
@" -v --verbose Verbose output for file list\n"
@" -x --extract Extract files")];
}
[OFApplication terminateWithStatus: status];
}
|
| ︙ | | |
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
-
+
|
[expandedFiles addObject: file];
}
[archive addFiles: expandedFiles];
}
@implementation OFArc
- (void)applicationDidFinishLaunching
- (void)applicationDidFinishLaunching: (OFNotification *)notification
{
OFString *outputDir, *encodingString, *type;
const OFOptionsParserOption options[] = {
{ 'a', @"append", 0, NULL, NULL },
{ 'c', @"create", 0, NULL, NULL },
{ 'C', @"directory", 1, NULL, &outputDir },
{ 'E', @"encoding", 1, NULL, &encodingString },
|
| ︙ | | |
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
|
-
+
+
-
-
+
+
|
/* Dropped after parsing options */
sandbox.allowsUnveil = true;
[OFApplication of_activateSandbox: sandbox];
#endif
#ifndef OF_AMIGAOS
[OFLocale addLocalizationDirectory: @LOCALIZATION_DIR];
[OFLocale addLocalizationDirectoryIRI:
[OFIRI fileIRIWithPath: @LOCALIZATION_DIR]];
#else
[OFLocale addLocalizationDirectory:
@"PROGDIR:/share/ofarc/localization"];
[OFLocale addLocalizationDirectoryIRI:
[OFIRI fileIRIWithPath: @"PROGDIR:/share/ofarc/localization"]];
#endif
optionsParser = [OFOptionsParser parserWithOptions: options];
while ((option = [optionsParser nextOption]) != '\0') {
switch (option) {
case 'f':
if (_overwrite < 0)
|
| ︙ | | |
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
|
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
|
-
+
|
OFString *error = [OFString
stringWithCString: strerror(e.errNo)
encoding: [OFLocale encoding]];
[OFStdErr writeString: @"\r"];
[OFStdErr writeLine: OF_LOCALIZED(
@"failed_to_create_directory",
@"Failed to create directory %[dir]: %[error]",
@"dir", e.URI.fileSystemRepresentation,
@"dir", e.IRI.fileSystemRepresentation,
@"error", error)];
_exitStatus = 1;
} @catch (OFOpenItemFailedException *e) {
OFString *error = [OFString
stringWithCString: strerror(e.errNo)
encoding: [OFLocale encoding]];
[OFStdErr writeString: @"\r"];
|
| ︙ | | |
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
|
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
|
-
+
+
+
|
help(OFStdErr, true, 1);
break;
}
[OFApplication terminateWithStatus: _exitStatus];
}
- (id <Archive>)openArchiveWithPath: (OFString *)path
- (id <Archive>)openArchiveWithPath: (OFString *)path_
type: (OFString *)type
mode: (char)mode
encoding: (OFStringEncoding)encoding
{
/* To make clang-analyzer happy about assigning nil to path later. */
OFString *path = path_;
OFString *modeString, *fileModeString;
OFStream *file = nil;
id <Archive> archive = nil;
[_archivePath release];
_archivePath = [path copy];
|
| ︙ | | |
529
530
531
532
533
534
535
536
537
538
539
540
541
542
|
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
|
+
+
|
case 'p':
case 'x':
file = OFStdIn;
break;
default:
@throw [OFInvalidArgumentException exception];
}
path = nil;
} else {
@try {
file = [OFFile fileWithPath: path mode: fileModeString];
} @catch (OFOpenItemFailedException *e) {
OFString *error = [OFString
stringWithCString: strerror(e.errNo)
encoding: [OFLocale encoding]];
|
| ︙ | | |
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
|
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
|
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
|
type = @"tar";
else
type = @"zip";
}
@try {
if ([type isEqual: @"gz"])
archive = [GZIPArchive archiveWithStream: file
mode: modeString
encoding: encoding];
archive = [GZIPArchive archiveWithPath: path
stream: file
mode: modeString
encoding: encoding];
else if ([type isEqual: @"lha"])
archive = [LHAArchive archiveWithStream: file
mode: modeString
encoding: encoding];
archive = [LHAArchive archiveWithPath: path
stream: file
mode: modeString
encoding: encoding];
else if ([type isEqual: @"tar"])
archive = [TarArchive archiveWithStream: file
mode: modeString
encoding: encoding];
archive = [TarArchive archiveWithPath: path
stream: file
mode: modeString
encoding: encoding];
else if ([type isEqual: @"tgz"]) {
OFStream *GZIPStream = [OFGZIPStream
streamWithStream: file
mode: modeString];
archive = [TarArchive archiveWithStream: GZIPStream
mode: modeString
encoding: encoding];
archive = [TarArchive archiveWithPath: path
stream: GZIPStream
mode: modeString
encoding: encoding];
} else if ([type isEqual: @"zip"])
archive = [ZIPArchive archiveWithStream: file
mode: modeString
encoding: encoding];
archive = [ZIPArchive archiveWithPath: path
stream: file
mode: modeString
encoding: encoding];
else {
[OFStdErr writeLine: OF_LOCALIZED(
@"unknown_archive_type",
@"Unknown archive type: %[type]",
@"type", type)];
goto error;
}
|
| ︙ | | |
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
|
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
|
-
+
-
+
|
writingNotSupported(type);
goto error;
}
return archive;
error:
if (mode == 'c')
if (mode == 'c' && path != nil)
[[OFFileManager defaultManager] removeItemAtPath: path];
[OFApplication terminateWithStatus: 1];
return nil;
abort();
}
- (bool)shouldExtractFile: (OFString *)fileName
outFileName: (OFString *)outFileName
{
OFString *line;
|
| ︙ | | |