/
test_physfs.c
1224 lines (996 loc) · 30.2 KB
1
2
3
/**
* Test program for PhysicsFS. May only work on Unix.
*
4
* Please see the file LICENSE.txt in the source's root directory.
5
6
7
8
*
* This file written by Ryan C. Gordon.
*/
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include <errno.h>
12
13
#include <string.h>
14
15
16
17
#if (defined __MWERKS__)
#include <SIOUX.h>
#endif
18
#if (defined PHYSFS_HAVE_READLINE)
19
#include <unistd.h>
20
21
#include <readline/readline.h>
#include <readline/history.h>
22
23
#endif
24
25
#include <time.h>
26
27
#include "physfs.h"
28
#define TEST_VERSION_MAJOR 2
29
#define TEST_VERSION_MINOR 1
30
#define TEST_VERSION_PATCH 0
31
32
static FILE *history_file = NULL;
33
static PHYSFS_uint32 do_buffer_size = 0;
34
35
static void output_versions(void)
36
37
38
39
40
41
42
43
44
45
46
{
PHYSFS_Version compiled;
PHYSFS_Version linked;
PHYSFS_VERSION(&compiled);
PHYSFS_getLinkedVersion(&linked);
printf("test_physfs version %d.%d.%d.\n"
" Compiled against PhysicsFS version %d.%d.%d,\n"
" and linked against %d.%d.%d.\n\n",
TEST_VERSION_MAJOR, TEST_VERSION_MINOR, TEST_VERSION_PATCH,
47
48
(int) compiled.major, (int) compiled.minor, (int) compiled.patch,
(int) linked.major, (int) linked.minor, (int) linked.patch);
49
50
51
} /* output_versions */
52
static void output_archivers(void)
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
{
const PHYSFS_ArchiveInfo **rc = PHYSFS_supportedArchiveTypes();
const PHYSFS_ArchiveInfo **i;
printf("Supported archive types:\n");
if (*rc == NULL)
printf(" * Apparently, NONE!\n");
else
{
for (i = rc; *i != NULL; i++)
{
printf(" * %s: %s\n Written by %s.\n %s\n",
(*i)->extension, (*i)->description,
(*i)->author, (*i)->url);
} /* for */
} /* else */
69
70
printf("\n");
71
72
73
} /* output_archivers */
74
75
static int cmd_quit(char *args)
{
76
return 0;
77
78
79
80
} /* cmd_quit */
static int cmd_init(char *args)
81
{
82
83
84
85
86
87
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
88
89
90
91
92
if (PHYSFS_init(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
93
return 1;
94
} /* cmd_init */
95
96
97
static int cmd_deinit(char *args)
98
{
99
100
101
102
103
if (PHYSFS_deinit())
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
104
return 1;
105
106
107
108
109
} /* cmd_deinit */
static int cmd_addarchive(char *args)
{
110
char *ptr = strrchr(args, ' ');
111
112
113
int appending = atoi(ptr + 1);
*ptr = '\0';
114
115
116
117
if (*args == '\"')
{
args++;
*(ptr - 1) = '\0';
118
} /* if */
119
120
121
/*printf("[%s], [%d]\n", args, appending);*/
122
123
124
125
126
if (PHYSFS_addToSearchPath(args, appending))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
127
return 1;
128
129
130
} /* cmd_addarchive */
131
132
133
134
135
136
137
138
139
140
141
142
143
static int cmd_mount(char *args)
{
char *ptr;
char *mntpoint = NULL;
int appending = 0;
if (*args == '\"')
{
args++;
ptr = strchr(args, '\"');
if (ptr == NULL)
{
printf("missing string terminator in argument.\n");
144
return 1;
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
} /* if */
*(ptr) = '\0';
} /* if */
else
{
ptr = strchr(args, ' ');
*ptr = '\0';
} /* else */
mntpoint = ptr + 1;
if (*mntpoint == '\"')
{
mntpoint++;
ptr = strchr(mntpoint, '\"');
if (ptr == NULL)
{
printf("missing string terminator in argument.\n");
162
return 1;
163
164
165
166
167
168
169
170
171
172
} /* if */
*(ptr) = '\0';
} /* if */
else
{
ptr = strchr(mntpoint, ' ');
*(ptr) = '\0';
} /* else */
appending = atoi(ptr + 1);
173
/*printf("[%s], [%s], [%d]\n", args, mntpoint, appending);*/
174
175
176
177
178
179
if (PHYSFS_mount(args, mntpoint, appending))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
180
return 1;
181
182
183
} /* cmd_mount */
184
185
static int cmd_removearchive(char *args)
{
186
187
188
189
190
191
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
192
193
194
195
196
if (PHYSFS_removeFromSearchPath(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
197
return 1;
198
199
200
201
202
} /* cmd_removearchive */
static int cmd_enumerate(char *args)
{
203
204
205
206
207
208
209
210
211
char **rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
rc = PHYSFS_enumerateFiles(args);
212
213
214
215
216
217
218
219
220
221
222
223
224
225
if (rc == NULL)
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
else
{
int file_count;
char **i;
for (i = rc, file_count = 0; *i != NULL; i++, file_count++)
printf("%s\n", *i);
printf("\n total (%d) files.\n", file_count);
PHYSFS_freeList(rc);
} /* else */
226
return 1;
227
228
229
230
231
232
} /* cmd_enumerate */
static int cmd_getdirsep(char *args)
{
printf("Directory separator is [%s].\n", PHYSFS_getDirSeparator());
233
return 1;
234
235
236
237
238
239
} /* cmd_getdirsep */
static int cmd_getlasterror(char *args)
{
printf("last error is [%s].\n", PHYSFS_getLastError());
240
return 1;
241
242
243
244
245
246
247
248
} /* cmd_getlasterror */
static int cmd_getcdromdirs(char *args)
{
char **rc = PHYSFS_getCdRomDirs();
if (rc == NULL)
249
printf("Failure. Reason: [%s].\n", PHYSFS_getLastError());
250
251
252
253
254
255
256
257
258
259
260
else
{
int dir_count;
char **i;
for (i = rc, dir_count = 0; *i != NULL; i++, dir_count++)
printf("%s\n", *i);
printf("\n total (%d) drives.\n", dir_count);
PHYSFS_freeList(rc);
} /* else */
261
return 1;
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
} /* cmd_getcdromdirs */
static int cmd_getsearchpath(char *args)
{
char **rc = PHYSFS_getSearchPath();
if (rc == NULL)
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
else
{
int dir_count;
char **i;
for (i = rc, dir_count = 0; *i != NULL; i++, dir_count++)
printf("%s\n", *i);
printf("\n total (%d) directories.\n", dir_count);
PHYSFS_freeList(rc);
} /* else */
282
return 1;
283
284
285
286
287
288
} /* cmd_getcdromdirs */
static int cmd_getbasedir(char *args)
{
printf("Base dir is [%s].\n", PHYSFS_getBaseDir());
289
return 1;
290
291
292
293
294
295
} /* cmd_getbasedir */
static int cmd_getuserdir(char *args)
{
printf("User dir is [%s].\n", PHYSFS_getUserDir());
296
return 1;
297
298
299
300
301
302
} /* cmd_getuserdir */
static int cmd_getwritedir(char *args)
{
printf("Write dir is [%s].\n", PHYSFS_getWriteDir());
303
return 1;
304
305
306
307
308
} /* cmd_getwritedir */
static int cmd_setwritedir(char *args)
{
309
310
311
312
313
314
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
315
316
317
318
319
if (PHYSFS_setWriteDir(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
320
return 1;
321
322
323
324
325
} /* cmd_setwritedir */
static int cmd_permitsyms(char *args)
{
326
327
328
329
330
331
332
333
334
int num;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
num = atoi(args);
335
336
PHYSFS_permitSymbolicLinks(num);
printf("Symlinks are now %s.\n", num ? "permitted" : "forbidden");
337
return 1;
338
339
340
} /* cmd_permitsyms */
341
342
343
344
345
346
347
348
static int cmd_setbuffer(char *args)
{
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
349
do_buffer_size = (unsigned int) atoi(args);
350
351
352
353
354
355
356
357
358
359
360
if (do_buffer_size)
{
printf("Further tests will set a (%lu) size buffer.\n",
(unsigned long) do_buffer_size);
} /* if */
else
{
printf("Further tests will NOT use a buffer.\n");
} /* else */
361
return 1;
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
} /* cmd_setbuffer */
static int cmd_stressbuffer(char *args)
{
int num;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
num = atoi(args);
if (num < 0)
printf("buffer must be greater than or equal to zero.\n");
else
{
380
PHYSFS_File *f;
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
int rndnum;
printf("Stress testing with (%d) byte buffer...\n", num);
f = PHYSFS_openWrite("test.txt");
if (f == NULL)
printf("Couldn't open test.txt for writing: %s.\n", PHYSFS_getLastError());
else
{
int i, j;
char buf[37];
char buf2[37];
if (!PHYSFS_setBuffer(f, num))
{
printf("PHYSFS_setBuffer() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
PHYSFS_delete("test.txt");
398
return 1;
399
400
401
} /* if */
strcpy(buf, "abcdefghijklmnopqrstuvwxyz0123456789");
402
srand((unsigned int) time(NULL));
403
404
405
406
407
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10000; j++)
{
408
409
PHYSFS_uint32 right = 1 + (PHYSFS_uint32) (35.0 * rand() / (RAND_MAX + 1.0));
PHYSFS_uint32 left = 36 - right;
410
411
412
413
if (PHYSFS_write(f, buf, left, 1) != 1)
{
printf("PHYSFS_write() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
414
return 1;
415
416
417
418
419
420
421
422
423
} /* if */
rndnum = 1 + (int) (1000.0 * rand() / (RAND_MAX + 1.0));
if (rndnum == 42)
{
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
424
return 1;
425
426
427
428
429
430
431
} /* if */
} /* if */
if (PHYSFS_write(f, buf + left, 1, right) != right)
{
printf("PHYSFS_write() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
432
return 1;
433
434
435
436
437
438
439
440
441
} /* if */
rndnum = 1 + (int) (1000.0 * rand() / (RAND_MAX + 1.0));
if (rndnum == 42)
{
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
442
return 1;
443
444
445
446
447
448
449
450
} /* if */
} /* if */
} /* for */
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
451
return 1;
452
453
454
455
456
457
458
} /* if */
} /* for */
if (!PHYSFS_close(f))
{
printf("PHYSFS_close() failed: %s.\n", PHYSFS_getLastError());
459
return 1; /* oh well. */
460
461
462
463
464
465
466
} /* if */
printf(" ... test file written ...\n");
f = PHYSFS_openRead("test.txt");
if (f == NULL)
{
printf("Failed to reopen stress file for reading: %s.\n", PHYSFS_getLastError());
467
return 1;
468
469
470
471
472
473
} /* if */
if (!PHYSFS_setBuffer(f, num))
{
printf("PHYSFS_setBuffer() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
474
return 1;
475
476
477
478
479
480
} /* if */
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10000; j++)
{
481
482
PHYSFS_uint32 right = 1 + (PHYSFS_uint32) (35.0 * rand() / (RAND_MAX + 1.0));
PHYSFS_uint32 left = 36 - right;
483
484
485
486
if (PHYSFS_read(f, buf2, left, 1) != 1)
{
printf("PHYSFS_read() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
487
return 1;
488
489
490
491
492
493
494
495
496
} /* if */
rndnum = 1 + (int) (1000.0 * rand() / (RAND_MAX + 1.0));
if (rndnum == 42)
{
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
497
return 1;
498
499
500
501
502
503
504
} /* if */
} /* if */
if (PHYSFS_read(f, buf2 + left, 1, right) != right)
{
printf("PHYSFS_read() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
505
return 1;
506
507
508
509
510
511
512
513
514
} /* if */
rndnum = 1 + (int) (1000.0 * rand() / (RAND_MAX + 1.0));
if (rndnum == 42)
{
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
515
return 1;
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
} /* if */
} /* if */
if (memcmp(buf, buf2, 36) != 0)
{
printf("readback is mismatched on iterations (%d, %d).\n", i, j);
printf("wanted: [");
for (i = 0; i < 36; i++)
printf("%c", buf[i]);
printf("]\n");
printf(" got: [");
for (i = 0; i < 36; i++)
printf("%c", buf2[i]);
printf("]\n");
PHYSFS_close(f);
532
return 1;
533
534
535
536
537
538
539
} /* if */
} /* for */
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
540
return 1;
541
542
543
544
545
546
547
548
549
550
551
552
} /* if */
} /* for */
printf(" ... test file read ...\n");
if (!PHYSFS_eof(f))
printf("PHYSFS_eof() returned true! That's wrong.\n");
if (!PHYSFS_close(f))
{
printf("PHYSFS_close() failed: %s.\n", PHYSFS_getLastError());
553
return 1; /* oh well. */
554
555
556
557
558
559
560
} /* if */
PHYSFS_delete("test.txt");
printf("stress test completed successfully.\n");
} /* else */
} /* else */
561
return 1;
562
563
564
} /* cmd_stressbuffer */
565
566
static int cmd_setsaneconfig(char *args)
{
567
char *org;
568
569
570
571
572
573
574
char *appName;
char *arcExt;
int inclCD;
int arcsFirst;
char *ptr = args;
/* ugly. */
575
576
org = ptr;
ptr = strchr(ptr, ' '); *ptr = '\0'; ptr++; appName = ptr;
577
578
579
580
581
582
583
ptr = strchr(ptr, ' '); *ptr = '\0'; ptr++; arcExt = ptr;
ptr = strchr(ptr, ' '); *ptr = '\0'; ptr++; inclCD = atoi(arcExt);
arcsFirst = atoi(ptr);
if (strcmp(arcExt, "!") == 0)
arcExt = NULL;
584
if (PHYSFS_setSaneConfig(org, appName, arcExt, inclCD, arcsFirst))
585
586
587
588
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
589
return 1;
590
591
592
} /* cmd_setsaneconfig */
593
594
static int cmd_mkdir(char *args)
{
595
596
597
598
599
600
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
601
602
603
604
605
if (PHYSFS_mkdir(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
606
return 1;
607
608
609
610
611
} /* cmd_mkdir */
static int cmd_delete(char *args)
{
612
613
614
615
616
617
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
618
619
620
621
622
if (PHYSFS_delete(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
623
return 1;
624
625
626
627
628
} /* cmd_delete */
static int cmd_getrealdir(char *args)
{
629
630
631
632
633
634
635
636
637
const char *rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
rc = PHYSFS_getRealDir(args);
638
639
640
641
642
if (rc)
printf("Found at [%s].\n", rc);
else
printf("Not found.\n");
643
return 1;
644
645
646
647
648
} /* cmd_getrealdir */
static int cmd_exists(char *args)
{
649
650
651
652
653
654
655
656
657
int rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
rc = PHYSFS_exists(args);
658
printf("File %sexists.\n", rc ? "" : "does not ");
659
return 1;
660
661
662
663
664
} /* cmd_exists */
static int cmd_isdir(char *args)
{
665
666
667
668
669
670
671
672
673
int rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
rc = PHYSFS_isDirectory(args);
674
printf("File %s a directory.\n", rc ? "is" : "is NOT");
675
return 1;
676
677
678
679
680
} /* cmd_isdir */
static int cmd_issymlink(char *args)
{
681
682
683
684
685
686
687
688
689
int rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
rc = PHYSFS_isSymbolicLink(args);
690
printf("File %s a symlink.\n", rc ? "is" : "is NOT");
691
return 1;
692
693
694
} /* cmd_issymlink */
695
696
static int cmd_cat(char *args)
{
697
PHYSFS_File *f;
698
699
700
701
702
703
704
705
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
f = PHYSFS_openRead(args);
706
707
708
709
if (f == NULL)
printf("failed to open. Reason: [%s].\n", PHYSFS_getLastError());
else
{
710
711
712
713
714
715
716
if (do_buffer_size)
{
if (!PHYSFS_setBuffer(f, do_buffer_size))
{
printf("failed to set file buffer. Reason: [%s].\n",
PHYSFS_getLastError());
PHYSFS_close(f);
717
return 1;
718
719
720
} /* if */
} /* if */
721
722
723
while (1)
{
char buffer[128];
724
725
PHYSFS_sint64 rc;
PHYSFS_sint64 i;
726
727
728
729
730
731
732
733
734
rc = PHYSFS_read(f, buffer, 1, sizeof (buffer));
for (i = 0; i < rc; i++)
fputc((int) buffer[i], stdout);
if (rc < sizeof (buffer))
{
printf("\n\n");
if (!PHYSFS_eof(f))
735
736
737
738
{
printf("\n (Error condition in reading. Reason: [%s])\n\n",
PHYSFS_getLastError());
} /* if */
739
PHYSFS_close(f);
740
return 1;
741
742
743
744
} /* if */
} /* while */
} /* else */
745
return 1;
746
747
748
} /* cmd_cat */
749
750
static int cmd_filelength(char *args)
{
751
PHYSFS_File *f;
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
f = PHYSFS_openRead(args);
if (f == NULL)
printf("failed to open. Reason: [%s].\n", PHYSFS_getLastError());
else
{
PHYSFS_sint64 len = PHYSFS_fileLength(f);
if (len == -1)
printf("failed to determine length. Reason: [%s].\n", PHYSFS_getLastError());
else
printf(" (cast to int) %d bytes.\n", (int) len);
PHYSFS_close(f);
} /* else */
773
return 1;
774
775
776
777
778
779
780
} /* cmd_filelength */
#define WRITESTR "The cat sat on the mat.\n\n"
static int cmd_append(char *args)
{
781
PHYSFS_File *f;
782
783
784
785
786
787
788
789
790
791
792
793
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
f = PHYSFS_openAppend(args);
if (f == NULL)
printf("failed to open. Reason: [%s].\n", PHYSFS_getLastError());
else
{
794
795
796
797
798
799
800
801
802
803
size_t bw;
PHYSFS_sint64 rc;
if (do_buffer_size)
{
if (!PHYSFS_setBuffer(f, do_buffer_size))
{
printf("failed to set file buffer. Reason: [%s].\n",
PHYSFS_getLastError());
PHYSFS_close(f);
804
return 1;
805
806
807
808
809
} /* if */
} /* if */
bw = strlen(WRITESTR);
rc = PHYSFS_write(f, WRITESTR, 1, bw);
810
811
if (rc != bw)
{
812
813
printf("Wrote (%d) of (%d) bytes. Reason: [%s].\n",
(int) rc, (int) bw, PHYSFS_getLastError());
814
815
816
817
818
819
820
821
822
} /* if */
else
{
printf("Successful.\n");
} /* else */
PHYSFS_close(f);
} /* else */
823
return 1;
824
825
826
827
828
} /* cmd_append */
static int cmd_write(char *args)
{
829
PHYSFS_File *f;
830
831
832
833
834
835
836
837
838
839
840
841
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
f = PHYSFS_openWrite(args);
if (f == NULL)
printf("failed to open. Reason: [%s].\n", PHYSFS_getLastError());
else
{
842
843
844
845
846
847
848
849
850
851
size_t bw;
PHYSFS_sint64 rc;
if (do_buffer_size)
{
if (!PHYSFS_setBuffer(f, do_buffer_size))
{
printf("failed to set file buffer. Reason: [%s].\n",
PHYSFS_getLastError());
PHYSFS_close(f);
852
return 1;
853
854
855
856
857
} /* if */
} /* if */
bw = strlen(WRITESTR);
rc = PHYSFS_write(f, WRITESTR, 1, bw);
858
859
if (rc != bw)
{
860
861
printf("Wrote (%d) of (%d) bytes. Reason: [%s].\n",
(int) rc, (int) bw, PHYSFS_getLastError());
862
863
864
865
866
867
868
869
870
} /* if */
else
{
printf("Successful.\n");
} /* else */
PHYSFS_close(f);
} /* else */
871
return 1;
872
873
874
} /* cmd_write */
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
static void modTimeToStr(PHYSFS_sint64 modtime, char *modstr, size_t strsize)
{
time_t t = (time_t) modtime;
char *str = ctime(&t);
strncpy(modstr, str, strsize);
modstr[strsize-1] = '\0';
} /* modTimeToStr */
static int cmd_getlastmodtime(char *args)
{
PHYSFS_sint64 rc = PHYSFS_getLastModTime(args);
if (rc == -1)
printf("Failed to determine. Reason: [%s].\n", PHYSFS_getLastError());
else
{
char modstr[64];
modTimeToStr(rc, modstr, sizeof (modstr));
printf("Last modified: %s (%ld).\n", modstr, (long) rc);
} /* else */
896
return 1;
897
898
899
} /* cmd_getLastModTime */
900
901
902
903
/* must have spaces trimmed prior to this call. */
static int count_args(const char *str)
{
int retval = 0;
904
int in_quotes = 0;
905
906
907
908
909
if (str != NULL)
{
for (; *str != '\0'; str++)
{
910
911
912
if (*str == '\"')
in_quotes = !in_quotes;
else if ((*str == ' ') && (!in_quotes))
913
914
915
916
917
retval++;
} /* for */
retval++;
} /* if */
918
return retval;
919
} /* count_args */
920
921
922
923
static int cmd_help(char *args);
924
925
926
typedef struct
{
const char *cmd;
927
928
929
int (*func)(char *args);
int argcount;
const char *usage;
930
931
} command_info;
932
static const command_info commands[] =
933
{
934
935
936
937
938
939
{ "quit", cmd_quit, 0, NULL },
{ "q", cmd_quit, 0, NULL },
{ "help", cmd_help, 0, NULL },
{ "init", cmd_init, 1, "<argv0>" },
{ "deinit", cmd_deinit, 0, NULL },
{ "addarchive", cmd_addarchive, 2, "<archiveLocation> <append>" },
940
{ "mount", cmd_mount, 3, "<archiveLocation> <mntpoint> <append>" },
941
942
{ "removearchive", cmd_removearchive, 1, "<archiveLocation>" },
{ "enumerate", cmd_enumerate, 1, "<dirToEnumerate>" },
943
{ "ls", cmd_enumerate, 1, "<dirToEnumerate>" },
944
945
946
947
948
949
950
951
952
{ "getlasterror", cmd_getlasterror, 0, NULL },
{ "getdirsep", cmd_getdirsep, 0, NULL },
{ "getcdromdirs", cmd_getcdromdirs, 0, NULL },
{ "getsearchpath", cmd_getsearchpath, 0, NULL },
{ "getbasedir", cmd_getbasedir, 0, NULL },
{ "getuserdir", cmd_getuserdir, 0, NULL },
{ "getwritedir", cmd_getwritedir, 0, NULL },
{ "setwritedir", cmd_setwritedir, 1, "<newWriteDir>" },
{ "permitsymlinks", cmd_permitsyms, 1, "<1or0>" },
953
{ "setsaneconfig", cmd_setsaneconfig, 5, "<org> <appName> <arcExt> <includeCdRoms> <archivesFirst>" },
954
955
956
957
958
959
{ "mkdir", cmd_mkdir, 1, "<dirToMk>" },
{ "delete", cmd_delete, 1, "<dirToDelete>" },
{ "getrealdir", cmd_getrealdir, 1, "<fileToFind>" },
{ "exists", cmd_exists, 1, "<fileToCheck>" },
{ "isdir", cmd_isdir, 1, "<fileToCheck>" },
{ "issymlink", cmd_issymlink, 1, "<fileToCheck>" },
960
{ "cat", cmd_cat, 1, "<fileToCat>" },
961
962
963
{ "filelength", cmd_filelength, 1, "<fileToCheck>" },
{ "append", cmd_append, 1, "<fileToAppend>" },
{ "write", cmd_write, 1, "<fileToCreateOrTrash>" },
964
{ "getlastmodtime", cmd_getlastmodtime, 1, "<fileToExamine>" },
965
966
{ "setbuffer", cmd_setbuffer, 1, "<bufferSize>" },
{ "stressbuffer", cmd_stressbuffer, 1, "<bufferSize>" },
967
{ NULL, NULL, -1, NULL }
968
969
};
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
static void output_usage(const char *intro, const command_info *cmdinfo)
{
if (cmdinfo->argcount == 0)
printf("%s \"%s\" (no arguments)\n", intro, cmdinfo->cmd);
else
printf("%s \"%s %s\"\n", intro, cmdinfo->cmd, cmdinfo->usage);
} /* output_usage */
static int cmd_help(char *args)
{
const command_info *i;
printf("Commands:\n");
for (i = commands; i->cmd != NULL; i++)
output_usage(" -", i);
988
return 1;
989
990
991
992
993
994
995
996
997
998
999
1000
} /* output_cmd_help */
static void trim_command(const char *orig, char *copy)
{
const char *i;
char *writeptr = copy;
int spacecount = 0;
int have_first = 0;
for (i = orig; *i != '\0'; i++)
{