︙ | | |
53
54
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
82
|
53
54
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
|
-
-
-
+
+
+
-
-
+
+
-
+
-
|
#import "OFArray.h"
#ifdef OF_HAVE_THREADS
# import "threading.h"
#endif
#import "OFDate.h"
#import "OFSystemInfo.h"
#import "OFChangeDirectoryFailedException.h"
#import "OFChangeFileModeFailedException.h"
#import "OFChangeFileOwnerFailedException.h"
#import "OFChangeCurrentDirectoryPathFailedException.h"
#import "OFChangeOwnerFailedException.h"
#import "OFChangePermissionsFailedException.h"
#import "OFCreateDirectoryFailedException.h"
#import "OFDeleteDirectoryFailedException.h"
#import "OFDeleteFileFailedException.h"
#import "OFCreateSymbolicLinkFailedException.h"
#import "OFInitializationFailedException.h"
#import "OFInvalidArgumentException.h"
#import "OFLinkFailedException.h"
#import "OFLockFailedException.h"
#import "OFOpenFileFailedException.h"
#import "OFOutOfMemoryException.h"
#import "OFReadFailedException.h"
#import "OFRemoveFailedException.h"
#import "OFRenameFileFailedException.h"
#import "OFRenameFailedException.h"
#import "OFSeekFailedException.h"
#import "OFSymlinkFailedException.h"
#import "OFUnlockFailedException.h"
#import "OFWriteFailedException.h"
#import "autorelease.h"
#import "macros.h"
#ifdef _WIN32
|
︙ | | |
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
-
-
+
+
|
exceptionWithClass: self];
#endif
}
+ (instancetype)fileWithPath: (OFString*)path
mode: (OFString*)mode
{
return [[(OFFile*)[self alloc] initWithPath: path
mode: mode] autorelease];
return [[[self alloc] initWithPath: path
mode: mode] autorelease];
}
+ (instancetype)fileWithFileDescriptor: (int)filedescriptor
{
return [[[self alloc]
initWithFileDescriptor: filedescriptor] autorelease];
}
|
︙ | | |
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
|
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
|
-
+
|
[currentPath autorelease];
}
objc_autoreleasePoolPop(pool);
}
+ (OFArray*)filesInDirectoryAtPath: (OFString*)path
+ (OFArray*)contentsOfDirectoryAtPath: (OFString*)path
{
OFMutableArray *files = [OFMutableArray array];
#ifndef _WIN32
DIR *dir;
struct dirent *dirent;
|
︙ | | |
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
|
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
|
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
#endif
[files makeImmutable];
return files;
}
+ (void)changeToDirectoryAtPath: (OFString*)path
+ (void)changeCurrentDirectoryPath: (OFString*)path
{
#ifndef _WIN32
if (chdir([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE]))
#else
if (_wchdir([path UTF16String]))
#endif
@throw [OFChangeDirectoryFailedException
@throw [OFChangeCurrentDirectoryPathFailedException
exceptionWithPath: path];
}
#ifdef OF_HAVE_CHMOD
+ (void)changeModeOfFileAtPath: (OFString*)path
mode: (mode_t)mode
{
# ifndef _WIN32
if (chmod([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE], mode))
# else
if (_wchmod([path UTF16String], mode))
# endif
@throw [OFChangeFileModeFailedException
exceptionWithPath: path
mode: mode];
}
#endif
+ (off_t)sizeOfFileAtPath: (OFString*)path
{
#ifndef _WIN32
struct stat s;
if (stat([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE],
&s) == -1)
|
︙ | | |
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
|
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
-
+
+
+
|
/* FIXME: Maybe use another exception? */
@throw [OFOpenFileFailedException exceptionWithPath: path
mode: @"r"];
/* FIXME: We could be more precise on some OSes */
return [OFDate dateWithTimeIntervalSince1970: s.st_mtime];
}
#ifdef OF_HAVE_CHMOD
+ (void)changePermissionsOfItemAtPath: (OFString*)path
permissions: (mode_t)permissions
{
# ifndef _WIN32
if (chmod([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE],
permissions))
# else
if (_wchmod([path UTF16String], permissions))
# endif
@throw [OFChangePermissionsFailedException
exceptionWithPath: path
permissions: permissions];
}
#endif
#ifdef OF_HAVE_CHOWN
+ (void)changeOwnerOfFileAtPath: (OFString*)path
+ (void)changeOwnerOfItemAtPath: (OFString*)path
owner: (OFString*)owner
group: (OFString*)group
{
uid_t uid = -1;
gid_t gid = -1;
if (owner == nil && group == nil)
@throw [OFInvalidArgumentException exception];
# ifdef OF_HAVE_THREADS
if (!of_mutex_lock(&mutex))
@throw [OFLockFailedException exception];
@try {
# endif
if (owner != nil) {
struct passwd *passwd;
if ((passwd = getpwnam([owner cStringWithEncoding:
OF_STRING_ENCODING_NATIVE])) == NULL)
@throw [OFChangeFileOwnerFailedException
@throw [OFChangeOwnerFailedException
exceptionWithPath: path
owner: owner
group: group];
uid = passwd->pw_uid;
}
if (group != nil) {
struct group *group_;
if ((group_ = getgrnam([group cStringWithEncoding:
OF_STRING_ENCODING_NATIVE])) == NULL)
@throw [OFChangeFileOwnerFailedException
@throw [OFChangeOwnerFailedException
exceptionWithPath: path
owner: owner
group: group];
gid = group_->gr_gid;
}
# ifdef OF_HAVE_THREADS
} @finally {
if (!of_mutex_unlock(&mutex))
@throw [OFUnlockFailedException exception];
}
# endif
if (chown([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE],
uid, gid))
@throw [OFChangeFileOwnerFailedException
exceptionWithPath: path
owner: owner
group: group];
@throw [OFChangeOwnerFailedException exceptionWithPath: path
owner: owner
group: group];
}
#endif
+ (void)copyFileAtPath: (OFString*)source
toPath: (OFString*)destination
{
void *pool = objc_autoreleasePoolPush();
|
︙ | | |
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
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
|
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
|
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
|
}
#ifdef OF_HAVE_CHMOD
if (!override) {
struct stat s;
if (fstat(sourceFile->_fd, &s) == 0)
[self changeModeOfFileAtPath: destination
mode: s.st_mode];
[self changePermissionsOfItemAtPath: destination
permissions: s.st_mode];
}
#else
(void)override;
#endif
} @finally {
[sourceFile close];
[destinationFile close];
free(buffer);
}
objc_autoreleasePoolPop(pool);
}
+ (void)renameFileAtPath: (OFString*)source
+ (void)renameItemAtPath: (OFString*)source
toPath: (OFString*)destination
{
void *pool = objc_autoreleasePoolPush();
if ([self directoryExistsAtPath: destination]) {
OFString *filename = [source lastPathComponent];
destination = [OFString stringWithPath: destination, filename,
nil];
}
#ifndef _WIN32
if (rename([source cStringWithEncoding: OF_STRING_ENCODING_NATIVE],
[destination cStringWithEncoding: OF_STRING_ENCODING_NATIVE]))
#else
if (_wrename([source UTF16String], [destination UTF16String]))
#endif
@throw [OFRenameFileFailedException
@throw [OFRenameFailedException
exceptionWithSourcePath: source
destinationPath: destination];
objc_autoreleasePoolPop(pool);
}
+ (void)deleteFileAtPath: (OFString*)path
+ (void)removeItemAtPath: (OFString*)path
{
#ifndef _WIN32
if (unlink([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE]))
if (remove([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE]))
#else
if (_wunlink([path UTF16String]))
if (_wremove([path UTF16String]))
#endif
@throw [OFDeleteFileFailedException exceptionWithPath: path];
@throw [OFRemoveFailedException exceptionWithPath: path];
}
+ (void)deleteDirectoryAtPath: (OFString*)path
{
#ifndef _WIN32
if (rmdir([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE]))
#else
if (_wrmdir([path UTF16String]))
#endif
@throw [OFDeleteDirectoryFailedException
exceptionWithPath: path];
}
#ifdef OF_HAVE_LINK
+ (void)linkFileAtPath: (OFString*)source
+ (void)linkItemAtPath: (OFString*)source
toPath: (OFString*)destination
{
void *pool = objc_autoreleasePoolPush();
if ([self directoryExistsAtPath: destination]) {
OFString *filename = [source lastPathComponent];
destination = [OFString stringWithPath: destination, filename,
|
︙ | | |
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
|
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
|
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
destinationPath: destination];
objc_autoreleasePoolPop(pool);
}
#endif
#ifdef OF_HAVE_SYMLINK
+ (void)symlinkFileAtPath: (OFString*)source
toPath: (OFString*)destination
+ (void)createSymbolicLinkAtPath: (OFString*)source
destinationPath: (OFString*)destination
{
void *pool = objc_autoreleasePoolPush();
if ([self directoryExistsAtPath: destination]) {
OFString *filename = [source lastPathComponent];
destination = [OFString stringWithPath: destination, filename,
nil];
}
if (symlink([source cStringWithEncoding: OF_STRING_ENCODING_NATIVE],
[destination cStringWithEncoding: OF_STRING_ENCODING_NATIVE]) != 0)
@throw [OFSymlinkFailedException
@throw [OFCreateSymbolicLinkFailedException
exceptionWithSourcePath: source
destinationPath: destination];
objc_autoreleasePoolPop(pool);
}
+ (OFString*)destinationOfSymbolicLinkAtPath: (OFString*)path
{
char destination[PATH_MAX];
ssize_t length;
length = readlink([path cStringWithEncoding: OF_STRING_ENCODING_NATIVE],
destination, PATH_MAX);
if (length < 0)
@throw [OFOpenFileFailedException exceptionWithPath: path
mode: @"r"];
return [OFString stringWithCString: destination
encoding: OF_STRING_ENCODING_NATIVE
length: length];
}
#endif
- init
{
@try {
[self doesNotRecognizeSelector: _cmd];
} @catch (id e) {
|
︙ | | |