author | Tero Marttila <terom@fixme.fi> |
Fri, 18 Jul 2008 21:28:42 +0300 | |
changeset 11175 | 020c61e39c94 |
parent 11140 | 67fe23cbc27b |
child 11179 | fa96e29d7187 |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
6527
f584ab6d87f8
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
6505
diff
changeset
|
3 |
/** @file fileio.cpp Standard In/Out file operations */ |
6505
abcb0580d976
(svn r8950) -Cleanup: doxygen changes. Mostly @files missing tags and a few comments style.
belugas
parents:
6218
diff
changeset
|
4 |
|
0 | 5 |
#include "stdafx.h" |
1891
92a3b0aa0946
(svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents:
1198
diff
changeset
|
6 |
#include "openttd.h" |
1093
e8d26c7dc42f
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1039
diff
changeset
|
7 |
#include "fileio.h" |
2153
91e89aa8c299
(svn r2663) Include variables.h only in these files which need it, not globally via openttd.h
tron
parents:
1891
diff
changeset
|
8 |
#include "variables.h" |
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
9 |
#include "debug.h" |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
10 |
#include "fios.h" |
8626
440dfcd14c4a
(svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents:
8609
diff
changeset
|
11 |
#include "core/alloc_func.hpp" |
8627
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
12 |
#include "core/math_func.hpp" |
8710
52015340050c
(svn r11777) -Codechange: split the string header and make do not include it when it's not necessary.
rubidium
parents:
8627
diff
changeset
|
13 |
#include "string_func.h" |
11061
f5806d84e7a9
(svn r13618) -Codechange: move tar-specific declarations to separate file
smatz
parents:
10839
diff
changeset
|
14 |
#include "tar_type.h" |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
15 |
#ifdef WIN32 |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
16 |
#include <windows.h> |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
17 |
#else |
6649
5598de323f01
(svn r9281) -Fix [FS#687]: compile failure when compiling with 'home directories' enabled (stepancheg).
rubidium
parents:
6646
diff
changeset
|
18 |
#include <pwd.h> |
6643
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
19 |
#include <unistd.h> |
8085
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
20 |
#endif |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
21 |
#include <sys/stat.h> |
0 | 22 |
|
23 |
/*************************************************/ |
|
24 |
/* FILE IO ROUTINES ******************************/ |
|
25 |
/*************************************************/ |
|
26 |
||
27 |
#define FIO_BUFFER_SIZE 512 |
|
28 |
||
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
29 |
struct Fio { |
8301
47e8f031a6ab
(svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents:
8124
diff
changeset
|
30 |
byte *buffer, *buffer_end; ///< position pointer in local buffer and last valid byte of buffer |
10465
0c68afe3d725
(svn r13008) -Fix [FS#1997]: silence some MSVC x64 warnings
glx
parents:
10421
diff
changeset
|
31 |
size_t pos; ///< current (system) position in file |
8301
47e8f031a6ab
(svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents:
8124
diff
changeset
|
32 |
FILE *cur_fh; ///< current file handle |
47e8f031a6ab
(svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents:
8124
diff
changeset
|
33 |
const char *filename; ///< current filename |
47e8f031a6ab
(svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents:
8124
diff
changeset
|
34 |
FILE *handles[MAX_FILE_SLOTS]; ///< array of file handles we can have open |
47e8f031a6ab
(svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents:
8124
diff
changeset
|
35 |
byte buffer_start[FIO_BUFFER_SIZE]; ///< local buffer when read from file |
47e8f031a6ab
(svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents:
8124
diff
changeset
|
36 |
const char *filenames[MAX_FILE_SLOTS]; ///< array of filenames we (should) have open |
8870
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
37 |
char *shortnames[MAX_FILE_SLOTS];///< array of short names for spriteloader's use |
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
38 |
#if defined(LIMITED_FDS) |
8301
47e8f031a6ab
(svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents:
8124
diff
changeset
|
39 |
uint open_handles; ///< current amount of open handles |
47e8f031a6ab
(svn r11355) -Fix [FS#1377]: loading too many GRFs was not handled gracefully causing crashes and such.
rubidium
parents:
8124
diff
changeset
|
40 |
uint usage_count[MAX_FILE_SLOTS]; ///< count how many times this file has been opened |
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
41 |
#endif /* LIMITED_FDS */ |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
42 |
}; |
0 | 43 |
|
44 |
static Fio _fio; |
|
45 |
||
6505
abcb0580d976
(svn r8950) -Cleanup: doxygen changes. Mostly @files missing tags and a few comments style.
belugas
parents:
6218
diff
changeset
|
46 |
/* Get current position in file */ |
10751
ebd94f2d6385
(svn r13301) -Fix [FS#1997]: resolve more MSVC 9 x64 warnings.
rubidium
parents:
10465
diff
changeset
|
47 |
size_t FioGetPos() |
0 | 48 |
{ |
10421
1daeaead8993
(svn r12963) -Fix (r12960): loading some NewGRFs could cause an infinite loop.
rubidium
parents:
10418
diff
changeset
|
49 |
return _fio.pos + (_fio.buffer - _fio.buffer_end); |
0 | 50 |
} |
51 |
||
8870
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
52 |
const char *FioGetFilename(uint8 slot) |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7371
diff
changeset
|
53 |
{ |
8870
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
54 |
return _fio.shortnames[slot]; |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7371
diff
changeset
|
55 |
} |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7371
diff
changeset
|
56 |
|
10751
ebd94f2d6385
(svn r13301) -Fix [FS#1997]: resolve more MSVC 9 x64 warnings.
rubidium
parents:
10465
diff
changeset
|
57 |
void FioSeekTo(size_t pos, int mode) |
0 | 58 |
{ |
59 |
if (mode == SEEK_CUR) pos += FioGetPos(); |
|
60 |
_fio.buffer = _fio.buffer_end = _fio.buffer_start + FIO_BUFFER_SIZE; |
|
4203
790879e123dd
(svn r5687) - Cleanup: Some cleanup and commentarizing.
Darkvater
parents:
4202
diff
changeset
|
61 |
_fio.pos = pos; |
790879e123dd
(svn r5687) - Cleanup: Some cleanup and commentarizing.
Darkvater
parents:
4202
diff
changeset
|
62 |
fseek(_fio.cur_fh, _fio.pos, SEEK_SET); |
0 | 63 |
} |
64 |
||
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
65 |
#if defined(LIMITED_FDS) |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
66 |
static void FioRestoreFile(int slot) |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
67 |
{ |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
68 |
/* Do we still have the file open, or should we reopen it? */ |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
69 |
if (_fio.handles[slot] == NULL) { |
7848 | 70 |
DEBUG(misc, 6, "Restoring file '%s' in slot '%d' from disk", _fio.filenames[slot], slot); |
71 |
FioOpenFile(slot, _fio.filenames[slot]); |
|
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
72 |
} |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
73 |
_fio.usage_count[slot]++; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
74 |
} |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
75 |
#endif /* LIMITED_FDS */ |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
76 |
|
6505
abcb0580d976
(svn r8950) -Cleanup: doxygen changes. Mostly @files missing tags and a few comments style.
belugas
parents:
6218
diff
changeset
|
77 |
/* Seek to a file and a position */ |
10753
428f22725618
(svn r13303) -Fix (r13301): 64bit gcc compilation was broken
smatz
parents:
10751
diff
changeset
|
78 |
void FioSeekToFile(uint8 slot, size_t pos) |
0 | 79 |
{ |
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
80 |
FILE *f; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
81 |
#if defined(LIMITED_FDS) |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
82 |
/* Make sure we have this file open */ |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7848
diff
changeset
|
83 |
FioRestoreFile(slot); |
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
84 |
#endif /* LIMITED_FDS */ |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7848
diff
changeset
|
85 |
f = _fio.handles[slot]; |
0 | 86 |
assert(f != NULL); |
87 |
_fio.cur_fh = f; |
|
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7848
diff
changeset
|
88 |
_fio.filename = _fio.filenames[slot]; |
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7848
diff
changeset
|
89 |
FioSeekTo(pos, SEEK_SET); |
0 | 90 |
} |
91 |
||
6573 | 92 |
byte FioReadByte() |
0 | 93 |
{ |
94 |
if (_fio.buffer == _fio.buffer_end) { |
|
10418
3ac4a89469df
(svn r12960) -Codechange: handle return values of (some) file system related functions.
rubidium
parents:
10401
diff
changeset
|
95 |
_fio.buffer = _fio.buffer_start; |
10421
1daeaead8993
(svn r12963) -Fix (r12960): loading some NewGRFs could cause an infinite loop.
rubidium
parents:
10418
diff
changeset
|
96 |
size_t size = fread(_fio.buffer, 1, FIO_BUFFER_SIZE, _fio.cur_fh); |
1daeaead8993
(svn r12963) -Fix (r12960): loading some NewGRFs could cause an infinite loop.
rubidium
parents:
10418
diff
changeset
|
97 |
_fio.pos += size; |
1daeaead8993
(svn r12963) -Fix (r12960): loading some NewGRFs could cause an infinite loop.
rubidium
parents:
10418
diff
changeset
|
98 |
_fio.buffer_end = _fio.buffer_start + size; |
1daeaead8993
(svn r12963) -Fix (r12960): loading some NewGRFs could cause an infinite loop.
rubidium
parents:
10418
diff
changeset
|
99 |
|
1daeaead8993
(svn r12963) -Fix (r12960): loading some NewGRFs could cause an infinite loop.
rubidium
parents:
10418
diff
changeset
|
100 |
if (size == 0) return 0; |
0 | 101 |
} |
102 |
return *_fio.buffer++; |
|
103 |
} |
|
104 |
||
105 |
void FioSkipBytes(int n) |
|
106 |
{ |
|
2952 | 107 |
for (;;) { |
0 | 108 |
int m = min(_fio.buffer_end - _fio.buffer, n); |
109 |
_fio.buffer += m; |
|
110 |
n -= m; |
|
111 |
if (n == 0) break; |
|
112 |
FioReadByte(); |
|
113 |
n--; |
|
114 |
} |
|
115 |
} |
|
116 |
||
6573 | 117 |
uint16 FioReadWord() |
0 | 118 |
{ |
119 |
byte b = FioReadByte(); |
|
120 |
return (FioReadByte() << 8) | b; |
|
121 |
} |
|
122 |
||
6573 | 123 |
uint32 FioReadDword() |
0 | 124 |
{ |
125 |
uint b = FioReadWord(); |
|
126 |
return (FioReadWord() << 16) | b; |
|
127 |
} |
|
128 |
||
10465
0c68afe3d725
(svn r13008) -Fix [FS#1997]: silence some MSVC x64 warnings
glx
parents:
10421
diff
changeset
|
129 |
void FioReadBlock(void *ptr, size_t size) |
0 | 130 |
{ |
131 |
FioSeekTo(FioGetPos(), SEEK_SET); |
|
10418
3ac4a89469df
(svn r12960) -Codechange: handle return values of (some) file system related functions.
rubidium
parents:
10401
diff
changeset
|
132 |
_fio.pos += fread(ptr, 1, size, _fio.cur_fh); |
0 | 133 |
} |
134 |
||
1039
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
135 |
static inline void FioCloseFile(int slot) |
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
136 |
{ |
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
137 |
if (_fio.handles[slot] != NULL) { |
1109
1bab892228cd
(svn r1610) Remove trailing whitespace (last time ever, i hope)
tron
parents:
1093
diff
changeset
|
138 |
fclose(_fio.handles[slot]); |
8870
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
139 |
|
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
140 |
free(_fio.shortnames[slot]); |
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
141 |
_fio.shortnames[slot] = NULL; |
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
142 |
|
1039
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
143 |
_fio.handles[slot] = NULL; |
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
144 |
#if defined(LIMITED_FDS) |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
145 |
_fio.open_handles--; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
146 |
#endif /* LIMITED_FDS */ |
1039
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
147 |
} |
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
148 |
} |
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
149 |
|
6573 | 150 |
void FioCloseAll() |
0 | 151 |
{ |
152 |
int i; |
|
153 |
||
1039
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
154 |
for (i = 0; i != lengthof(_fio.handles); i++) |
8736f759759b
(svn r1540) -Fix: since grf files are reopened on every load/new game, close the old opened to fix stale filehandles (thx tamlin)
darkvater
parents:
1036
diff
changeset
|
155 |
FioCloseFile(i); |
0 | 156 |
} |
157 |
||
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
158 |
#if defined(LIMITED_FDS) |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
159 |
static void FioFreeHandle() |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
160 |
{ |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
161 |
/* If we are about to open a file that will exceed the limit, close a file */ |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
162 |
if (_fio.open_handles + 1 == LIMITED_FDS) { |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
163 |
uint i, count; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
164 |
int slot; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
165 |
|
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
166 |
count = UINT_MAX; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
167 |
slot = -1; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
168 |
/* Find the file that is used the least */ |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
169 |
for (i = 0; i < lengthof(_fio.handles); i++) { |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
170 |
if (_fio.handles[i] != NULL && _fio.usage_count[i] < count) { |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
171 |
count = _fio.usage_count[i]; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
172 |
slot = i; |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
173 |
} |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
174 |
} |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
175 |
assert(slot != -1); |
7848 | 176 |
DEBUG(misc, 6, "Closing filehandler '%s' in slot '%d' because of fd-limit", _fio.filenames[slot], slot); |
6218
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
177 |
FioCloseFile(slot); |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
178 |
} |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
179 |
} |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
180 |
#endif /* LIMITED_FDS */ |
89dc931b8d78
(svn r8647) -Codechange: add a general way to handle platforms who can only have a limited amount of file-descripters open at any given time.
truelight
parents:
5835
diff
changeset
|
181 |
|
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
182 |
void FioOpenFile(int slot, const char *filename) |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
183 |
{ |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
184 |
FILE *f; |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
185 |
|
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
186 |
#if defined(LIMITED_FDS) |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
187 |
FioFreeHandle(); |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
188 |
#endif /* LIMITED_FDS */ |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
189 |
f = FioFOpenFile(filename); |
10839
a62547c31fdb
(svn r13390) -Codechange: introduce usererror() for fatal but not openttd related errors. Now all error() will 'crash' openttd after showing the message in win32 releases (MSVC), creating a crash.log and crash.dmp (like the '!' hack used before). On the other hand, usererror() will just close the game. So use error() only when it can be helpful to debugging, else use usererror().
glx
parents:
10753
diff
changeset
|
190 |
if (f == NULL) usererror("Cannot open file '%s'", filename); |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7848
diff
changeset
|
191 |
uint32 pos = ftell(f); |
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
192 |
|
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
193 |
FioCloseFile(slot); // if file was opened before, close it |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
194 |
_fio.handles[slot] = f; |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7371
diff
changeset
|
195 |
_fio.filenames[slot] = filename; |
8870
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
196 |
|
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
197 |
/* Store the filename without path and extension */ |
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
198 |
const char *t = strrchr(filename, PATHSEPCHAR); |
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
199 |
_fio.shortnames[slot] = strdup(t == NULL ? filename : t); |
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
200 |
char *t2 = strrchr(_fio.shortnames[slot], '.'); |
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
201 |
if (t2 != NULL) *t2 = '\0'; |
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
202 |
strtolower(_fio.shortnames[slot]); |
461ed7760525
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
peter1138
parents:
8769
diff
changeset
|
203 |
|
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
204 |
#if defined(LIMITED_FDS) |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
205 |
_fio.usage_count[slot] = 0; |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
206 |
_fio.open_handles++; |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
207 |
#endif /* LIMITED_FDS */ |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7848
diff
changeset
|
208 |
FioSeekToFile(slot, pos); |
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
209 |
} |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
210 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
211 |
const char *_subdirs[NUM_SUBDIRS] = { |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
212 |
"", |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
213 |
"save" PATHSEP, |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
214 |
"save" PATHSEP "autosave" PATHSEP, |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
215 |
"scenario" PATHSEP, |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
216 |
"scenario" PATHSEP "heightmap" PATHSEP, |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
217 |
"gm" PATHSEP, |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
218 |
"data" PATHSEP, |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
219 |
"lang" PATHSEP |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
220 |
}; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
221 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
222 |
const char *_searchpaths[NUM_SEARCHPATHS]; |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
223 |
TarList _tar_list; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
224 |
TarFileList _tar_filelist; |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
225 |
|
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
226 |
typedef std::map<std::string, std::string> TarLinkList; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
227 |
static TarLinkList _tar_linklist; ///< List of directory links |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
228 |
|
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
229 |
/** |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
230 |
* Check whether the given file exists |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
231 |
* @param filename the file to try for existance |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
232 |
* @param subdir the subdirectory to look in |
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
233 |
* @return true if and only if the file can be opened |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
234 |
*/ |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
235 |
bool FioCheckFileExists(const char *filename, Subdirectory subdir) |
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
236 |
{ |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
237 |
FILE *f = FioFOpenFile(filename, "rb", subdir); |
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
238 |
if (f == NULL) return false; |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
239 |
|
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
240 |
FioFCloseFile(f); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
241 |
return true; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
242 |
} |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
243 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
244 |
/** |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
245 |
* Close a file in a safe way. |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
246 |
*/ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
247 |
void FioFCloseFile(FILE *f) |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
248 |
{ |
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
249 |
fclose(f); |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
250 |
} |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
251 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
252 |
char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename) |
2736
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
253 |
{ |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
254 |
assert(subdir < NUM_SUBDIRS); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
255 |
assert(sp < NUM_SEARCHPATHS); |
2736
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
256 |
|
7437
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
257 |
snprintf(buf, buflen, "%s%s%s", _searchpaths[sp], _subdirs[subdir], filename); |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
258 |
return buf; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
259 |
} |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
260 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
261 |
char *FioFindFullPath(char *buf, size_t buflen, Subdirectory subdir, const char *filename) |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
262 |
{ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
263 |
Searchpath sp; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
264 |
assert(subdir < NUM_SUBDIRS); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
265 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
266 |
FOR_ALL_SEARCHPATHS(sp) { |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
267 |
FioGetFullPath(buf, buflen, sp, subdir, filename); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
268 |
if (FileExists(buf)) break; |
6920
ee15b916f758
(svn r9560) -Codechange: add support for multiple 'base' directories for newgrf searching.
rubidium
parents:
6649
diff
changeset
|
269 |
} |
2736
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
270 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
271 |
return buf; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
272 |
} |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
273 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
274 |
char *FioAppendDirectory(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir) |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
275 |
{ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
276 |
assert(subdir < NUM_SUBDIRS); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
277 |
assert(sp < NUM_SEARCHPATHS); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
278 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
279 |
snprintf(buf, buflen, "%s%s", _searchpaths[sp], _subdirs[subdir]); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
280 |
return buf; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
281 |
} |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
282 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
283 |
char *FioGetDirectory(char *buf, size_t buflen, Subdirectory subdir) |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
284 |
{ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
285 |
Searchpath sp; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
286 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
287 |
/* Find and return the first valid directory */ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
288 |
FOR_ALL_SEARCHPATHS(sp) { |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
289 |
char *ret = FioAppendDirectory(buf, buflen, sp, subdir); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
290 |
if (FileExists(buf)) return ret; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
291 |
} |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
292 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
293 |
/* Could not find the directory, fall back to a base path */ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
294 |
ttd_strlcpy(buf, _personal_dir, buflen); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
295 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
296 |
return buf; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
297 |
} |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
298 |
|
8070
959633559d9f
(svn r11099) -Codechange: allow on opening of a file via FioFOpenFile to request the size of the file, so we can keep that in mind
truelight
parents:
8066
diff
changeset
|
299 |
FILE *FioFOpenFileSp(const char *filename, const char *mode, Searchpath sp, Subdirectory subdir, size_t *filesize) |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
300 |
{ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
301 |
#if defined(WIN32) && defined(UNICODE) |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
302 |
/* fopen is implemented as a define with ellipses for |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
303 |
* Unicode support (prepend an L). As we are not sending |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
304 |
* a string, but a variable, it 'renames' the variable, |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
305 |
* so make that variable to makes it compile happily */ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
306 |
wchar_t Lmode[5]; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
307 |
MultiByteToWideChar(CP_ACP, 0, mode, -1, Lmode, lengthof(Lmode)); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
308 |
#endif |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
309 |
FILE *f = NULL; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
310 |
char buf[MAX_PATH]; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
311 |
|
7431
f340111a55ec
(svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents:
7425
diff
changeset
|
312 |
if (subdir == NO_DIRECTORY) { |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
313 |
ttd_strlcpy(buf, filename, lengthof(buf)); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
314 |
} else { |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
315 |
snprintf(buf, lengthof(buf), "%s%s%s", _searchpaths[sp], _subdirs[subdir], filename); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
316 |
} |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
317 |
|
8120
2ab4ad82fd44
(svn r11155) -Fix [FS#1253]: work around a nasty MS CRT 8 SP1 bug making it virtually impossible to debug 32bpp games under MSVC (http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=257606). Patch by boekabart.
rubidium
parents:
8088
diff
changeset
|
318 |
#if defined(WIN32) |
8124
beda591abd6c
(svn r11159) -Fix (r11155): restore the ability to save in a non existing file
glx
parents:
8121
diff
changeset
|
319 |
if (mode[0] == 'r' && GetFileAttributes(OTTD2FS(buf)) == INVALID_FILE_ATTRIBUTES) return NULL; |
8120
2ab4ad82fd44
(svn r11155) -Fix [FS#1253]: work around a nasty MS CRT 8 SP1 bug making it virtually impossible to debug 32bpp games under MSVC (http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=257606). Patch by boekabart.
rubidium
parents:
8088
diff
changeset
|
320 |
#endif |
2ab4ad82fd44
(svn r11155) -Fix [FS#1253]: work around a nasty MS CRT 8 SP1 bug making it virtually impossible to debug 32bpp games under MSVC (http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=257606). Patch by boekabart.
rubidium
parents:
8088
diff
changeset
|
321 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
322 |
f = fopen(buf, mode); |
2736
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
323 |
#if !defined(WIN32) |
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
324 |
if (f == NULL) { |
10401
9036e551960f
(svn r12943) -Fix: reading/modifying invalid data under some circumstances.
rubidium
parents:
8870
diff
changeset
|
325 |
strtolower(buf + ((subdir == NO_DIRECTORY) ? 0 : strlen(_searchpaths[sp]) - 1)); |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
326 |
f = fopen(buf, mode); |
2736
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
327 |
} |
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
328 |
#endif |
8070
959633559d9f
(svn r11099) -Codechange: allow on opening of a file via FioFOpenFile to request the size of the file, so we can keep that in mind
truelight
parents:
8066
diff
changeset
|
329 |
if (f != NULL && filesize != NULL) { |
959633559d9f
(svn r11099) -Codechange: allow on opening of a file via FioFOpenFile to request the size of the file, so we can keep that in mind
truelight
parents:
8066
diff
changeset
|
330 |
/* Find the size of the file */ |
959633559d9f
(svn r11099) -Codechange: allow on opening of a file via FioFOpenFile to request the size of the file, so we can keep that in mind
truelight
parents:
8066
diff
changeset
|
331 |
fseek(f, 0, SEEK_END); |
959633559d9f
(svn r11099) -Codechange: allow on opening of a file via FioFOpenFile to request the size of the file, so we can keep that in mind
truelight
parents:
8066
diff
changeset
|
332 |
*filesize = ftell(f); |
959633559d9f
(svn r11099) -Codechange: allow on opening of a file via FioFOpenFile to request the size of the file, so we can keep that in mind
truelight
parents:
8066
diff
changeset
|
333 |
fseek(f, 0, SEEK_SET); |
959633559d9f
(svn r11099) -Codechange: allow on opening of a file via FioFOpenFile to request the size of the file, so we can keep that in mind
truelight
parents:
8066
diff
changeset
|
334 |
} |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
335 |
return f; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
336 |
} |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
337 |
|
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
338 |
FILE *FioFOpenFileTar(TarFileListEntry *entry, size_t *filesize) |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
339 |
{ |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
340 |
FILE *f = fopen(entry->tar->filename, "rb"); |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
341 |
assert(f != NULL); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
342 |
|
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
343 |
fseek(f, entry->position, SEEK_SET); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
344 |
if (filesize != NULL) *filesize = entry->size; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
345 |
return f; |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
346 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
347 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
348 |
/** Opens OpenTTD files somewhere in a personal or global directory */ |
8071 | 349 |
FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, size_t *filesize) |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
350 |
{ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
351 |
FILE *f = NULL; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
352 |
Searchpath sp; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
353 |
|
7431
f340111a55ec
(svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents:
7425
diff
changeset
|
354 |
assert(subdir < NUM_SUBDIRS || subdir == NO_DIRECTORY); |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
355 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
356 |
FOR_ALL_SEARCHPATHS(sp) { |
8071 | 357 |
f = FioFOpenFileSp(filename, mode, sp, subdir, filesize); |
7431
f340111a55ec
(svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents:
7425
diff
changeset
|
358 |
if (f != NULL || subdir == NO_DIRECTORY) break; |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
359 |
} |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
360 |
|
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
361 |
/* We can only use .tar in case of data-dir, and read-mode */ |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
362 |
if (f == NULL && subdir == DATA_DIR && mode[0] == 'r') { |
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
363 |
static const uint MAX_RESOLVED_LENGTH = 2 * (100 + 100 + 155) + 1; // Enough space to hold two filenames plus link. See 'TarHeader'. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
364 |
char resolved_name[MAX_RESOLVED_LENGTH]; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
365 |
|
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
366 |
/* Filenames in tars are always forced to be lowercase */ |
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
367 |
strcpy(resolved_name, filename); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
368 |
strtolower(resolved_name); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
369 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
370 |
uint resolved_len = strlen(resolved_name); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
371 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
372 |
/* Resolve ONE directory link */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
373 |
for (TarLinkList::iterator link = _tar_linklist.begin(); link != _tar_linklist.end(); link++) { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
374 |
const std::string &src = link->first; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
375 |
uint len = src.length(); |
11140 | 376 |
if (resolved_len >= len && resolved_name[len - 1] == PATHSEPCHAR && strncmp(src.c_str(), resolved_name, len) == 0) { |
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
377 |
/* Apply link */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
378 |
char resolved_name2[MAX_RESOLVED_LENGTH]; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
379 |
const std::string &dest = link->second; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
380 |
strcpy(resolved_name2, &(resolved_name[len])); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
381 |
strcpy(resolved_name, dest.c_str()); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
382 |
strcpy(&(resolved_name[dest.length()]), resolved_name2); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
383 |
break; // Only resolve one level |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
384 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
385 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
386 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
387 |
TarFileList::iterator it = _tar_filelist.find(resolved_name); |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
388 |
if (it != _tar_filelist.end()) { |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
389 |
f = FioFOpenFileTar(&((*it).second), filesize); |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
390 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
391 |
} |
2736
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
392 |
|
8505
e2e4f0c44da9
(svn r11569) -Fix [FS#1480]: full paths sometimes did not work correctly.
rubidium
parents:
8423
diff
changeset
|
393 |
/* Sometimes a full path is given. To support |
e2e4f0c44da9
(svn r11569) -Fix [FS#1480]: full paths sometimes did not work correctly.
rubidium
parents:
8423
diff
changeset
|
394 |
* the 'subdirectory' must be 'removed'. */ |
e2e4f0c44da9
(svn r11569) -Fix [FS#1480]: full paths sometimes did not work correctly.
rubidium
parents:
8423
diff
changeset
|
395 |
if (f == NULL && subdir != NO_DIRECTORY) { |
e2e4f0c44da9
(svn r11569) -Fix [FS#1480]: full paths sometimes did not work correctly.
rubidium
parents:
8423
diff
changeset
|
396 |
f = FioFOpenFile(filename, mode, NO_DIRECTORY, filesize); |
e2e4f0c44da9
(svn r11569) -Fix [FS#1480]: full paths sometimes did not work correctly.
rubidium
parents:
8423
diff
changeset
|
397 |
} |
e2e4f0c44da9
(svn r11569) -Fix [FS#1480]: full paths sometimes did not work correctly.
rubidium
parents:
8423
diff
changeset
|
398 |
|
2736
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
399 |
return f; |
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
400 |
} |
1ea068235989
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
bjarni
parents:
2548
diff
changeset
|
401 |
|
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
402 |
/** |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
403 |
* Create a directory with the given name |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
404 |
* @param name the new name of the directory |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
405 |
*/ |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
406 |
void FioCreateDirectory(const char *name) |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
407 |
{ |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
408 |
#if defined(WIN32) || defined(WINCE) |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
409 |
CreateDirectory(OTTD2FS(name), NULL); |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
410 |
#elif defined(OS2) && !defined(__INNOTEK_LIBC__) |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
411 |
mkdir(OTTD2FS(name)); |
8407
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
412 |
#elif defined(__MORPHOS__) || defined(__AMIGAOS__) |
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
413 |
char buf[MAX_PATH]; |
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
414 |
ttd_strlcpy(buf, name, MAX_PATH); |
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
415 |
|
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
416 |
size_t len = strlen(name) - 1; |
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
417 |
if (buf[len] == '/') { |
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
418 |
buf[len] = '\0'; // Kill pathsep, so mkdir() will not fail |
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
419 |
} |
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
420 |
|
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
421 |
mkdir(OTTD2FS(buf), 0755); |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
422 |
#else |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
423 |
mkdir(OTTD2FS(name), 0755); |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
424 |
#endif |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
425 |
} |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
426 |
|
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
427 |
/** |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
428 |
* Appends, if necessary, the path separator character to the end of the string. |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
429 |
* It does not add the path separator to zero-sized strings. |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
430 |
* @param buf string to append the separator to |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
431 |
* @param buflen the length of the buf |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
432 |
*/ |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
433 |
void AppendPathSeparator(char *buf, size_t buflen) |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
434 |
{ |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
435 |
size_t s = strlen(buf); |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
436 |
|
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
437 |
/* Length of string + path separator + '\0' */ |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
438 |
if (s != 0 && buf[s - 1] != PATHSEPCHAR && s + 2 < buflen) { |
6625
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
439 |
buf[s] = PATHSEPCHAR; |
3348b52bd823
(svn r9130) -Codechange: move the fileio functions that do open a file into a Fio slot together.
rubidium
parents:
6624
diff
changeset
|
440 |
buf[s + 1] = '\0'; |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
441 |
} |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
442 |
} |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
443 |
|
7330
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
444 |
/** |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
445 |
* Allocates and files a variable with the full path |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
446 |
* based on the given directory. |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
447 |
* @param dir the directory to base the path on |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
448 |
* @return the malloced full path |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
449 |
*/ |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
450 |
char *BuildWithFullPath(const char *dir) |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
451 |
{ |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
452 |
char *dest = MallocT<char>(MAX_PATH); |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
453 |
ttd_strlcpy(dest, dir, MAX_PATH); |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
454 |
|
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
455 |
/* Check if absolute or relative path */ |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
456 |
const char *s = strchr(dest, PATHSEPCHAR); |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
457 |
|
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
458 |
/* Add absolute path */ |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
459 |
if (s == NULL || dest != s) { |
10418
3ac4a89469df
(svn r12960) -Codechange: handle return values of (some) file system related functions.
rubidium
parents:
10401
diff
changeset
|
460 |
if (getcwd(dest, MAX_PATH) == NULL) *dest = '\0'; |
7330
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
461 |
AppendPathSeparator(dest, MAX_PATH); |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
462 |
ttd_strlcat(dest, dir, MAX_PATH); |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
463 |
} |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
464 |
AppendPathSeparator(dest, MAX_PATH); |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
465 |
|
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
466 |
return dest; |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
467 |
} |
577e92774f23
(svn r10073) -Codechange: make the NewGRF paths in the config file without any full paths (again).
rubidium
parents:
7251
diff
changeset
|
468 |
|
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
469 |
/** |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
470 |
* Simplify filenames from tars. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
471 |
* Replace '/' by PATHSEPCHAR, and force 'name' to lowercase. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
472 |
* @param name Filename to process. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
473 |
*/ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
474 |
static void SimplifyFileName(char *name) |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
475 |
{ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
476 |
/* Force lowercase */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
477 |
strtolower(name); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
478 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
479 |
/* Tar-files always have '/' path-seperator, but we want our PATHSEPCHAR */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
480 |
#if (PATHSEPCHAR != '/') |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
481 |
for (char *n = name; *n != '\0'; n++) if (*n == '/') *n = PATHSEPCHAR; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
482 |
#endif |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
483 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
484 |
|
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
485 |
static bool TarListAddFile(const char *filename) |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
486 |
{ |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
487 |
/* The TAR-header, repeated for every file */ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
488 |
typedef struct TarHeader { |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
489 |
char name[100]; ///< Name of the file |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
490 |
char mode[8]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
491 |
char uid[8]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
492 |
char gid[8]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
493 |
char size[12]; ///< Size of the file, in ASCII |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
494 |
char mtime[12]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
495 |
char chksum[8]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
496 |
char typeflag; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
497 |
char linkname[100]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
498 |
char magic[6]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
499 |
char version[2]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
500 |
char uname[32]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
501 |
char gname[32]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
502 |
char devmajor[8]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
503 |
char devminor[8]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
504 |
char prefix[155]; ///< Path of the file |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
505 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
506 |
char unused[12]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
507 |
} TarHeader; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
508 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
509 |
/* Check if we already seen this file */ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
510 |
TarList::iterator it = _tar_list.find(filename); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
511 |
if (it != _tar_list.end()) return false; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
512 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
513 |
FILE *f = fopen(filename, "rb"); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
514 |
assert(f != NULL); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
515 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
516 |
TarListEntry *tar_entry = MallocT<TarListEntry>(1); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
517 |
tar_entry->filename = strdup(filename); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
518 |
_tar_list.insert(TarList::value_type(filename, tar_entry)); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
519 |
|
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
520 |
TarLinkList links; ///< Temporary list to collect links |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
521 |
|
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
522 |
TarHeader th; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
523 |
char buf[sizeof(th.name) + 1], *end; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
524 |
char name[sizeof(th.prefix) + 1 + sizeof(th.name) + 1]; |
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
525 |
char link[sizeof(th.linkname) + 1]; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
526 |
char dest[sizeof(th.prefix) + 1 + sizeof(th.name) + 1 + 1 + sizeof(th.linkname) + 1]; |
10465
0c68afe3d725
(svn r13008) -Fix [FS#1997]: silence some MSVC x64 warnings
glx
parents:
10421
diff
changeset
|
527 |
size_t num = 0, pos = 0; |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
528 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
529 |
/* Make a char of 512 empty bytes */ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
530 |
char empty[512]; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
531 |
memset(&empty[0], 0, sizeof(empty)); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
532 |
|
11135
6c703d2da75b
(svn r13693) -Fix (r11106, r11117): Do not rely on .tar files always ending with a block of zeros.
frosch
parents:
11061
diff
changeset
|
533 |
for (;;) { // Note: feof() always returns 'false' after 'fseek()'. Cool, isn't it? |
6c703d2da75b
(svn r13693) -Fix (r11106, r11117): Do not rely on .tar files always ending with a block of zeros.
frosch
parents:
11061
diff
changeset
|
534 |
size_t num_bytes_read = fread(&th, 1, 512, f); |
6c703d2da75b
(svn r13693) -Fix (r11106, r11117): Do not rely on .tar files always ending with a block of zeros.
frosch
parents:
11061
diff
changeset
|
535 |
if (num_bytes_read != 512) break; |
6c703d2da75b
(svn r13693) -Fix (r11106, r11117): Do not rely on .tar files always ending with a block of zeros.
frosch
parents:
11061
diff
changeset
|
536 |
pos += num_bytes_read; |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
537 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
538 |
/* Check if we have the new tar-format (ustar) or the old one (a lot of zeros after 'link' field) */ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
539 |
if (strncmp(th.magic, "ustar", 5) != 0 && memcmp(&th.magic, &empty[0], 512 - offsetof(TarHeader, magic)) != 0) { |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
540 |
/* If we have only zeros in the block, it can be an end-of-file indicator */ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
541 |
if (memcmp(&th, &empty[0], 512) == 0) continue; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
542 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
543 |
DEBUG(misc, 0, "The file '%s' isn't a valid tar-file", filename); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
544 |
return false; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
545 |
} |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
546 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
547 |
name[0] = '\0'; |
10465
0c68afe3d725
(svn r13008) -Fix [FS#1997]: silence some MSVC x64 warnings
glx
parents:
10421
diff
changeset
|
548 |
size_t len = 0; |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
549 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
550 |
/* The prefix contains the directory-name */ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
551 |
if (th.prefix[0] != '\0') { |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
552 |
memcpy(name, th.prefix, sizeof(th.prefix)); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
553 |
name[sizeof(th.prefix)] = '\0'; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
554 |
len = strlen(name); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
555 |
name[len] = PATHSEPCHAR; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
556 |
len++; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
557 |
} |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
558 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
559 |
/* Copy the name of the file in a safe way at the end of 'name' */ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
560 |
memcpy(&name[len], th.name, sizeof(th.name)); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
561 |
name[len + sizeof(th.name)] = '\0'; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
562 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
563 |
/* Calculate the size of the file.. for some strange reason this is stored as a string */ |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
564 |
memcpy(buf, th.size, sizeof(th.size)); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
565 |
buf[sizeof(th.size)] = '\0'; |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
566 |
int skip = strtol(buf, &end, 8); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
567 |
|
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
568 |
switch (th.typeflag) { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
569 |
case '\0': |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
570 |
case '0': { // regular file |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
571 |
/* Ignore empty files */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
572 |
if (skip == 0) break; |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
573 |
|
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
574 |
if (strlen(name) == 0) break; |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
575 |
|
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
576 |
/* Store this entry in the list */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
577 |
TarFileListEntry entry; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
578 |
entry.tar = tar_entry; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
579 |
entry.size = skip; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
580 |
entry.position = pos; |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
581 |
|
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
582 |
/* Convert to lowercase and our PATHSEPCHAR */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
583 |
SimplifyFileName(name); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
584 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
585 |
DEBUG(misc, 6, "Found file in tar: %s (%d bytes, %d offset)", name, skip, pos); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
586 |
if (_tar_filelist.insert(TarFileList::value_type(name, entry)).second) num++; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
587 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
588 |
break; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
589 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
590 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
591 |
case '1': // hard links |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
592 |
case '2': { // symbolic links |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
593 |
/* Copy the destination of the link in a safe way at the end of 'linkname' */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
594 |
memcpy(link, th.linkname, sizeof(th.linkname)); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
595 |
link[sizeof(th.linkname)] = '\0'; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
596 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
597 |
if (strlen(name) == 0 || strlen(link) == 0) break; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
598 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
599 |
/* Convert to lowercase and our PATHSEPCHAR */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
600 |
SimplifyFileName(name); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
601 |
SimplifyFileName(link); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
602 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
603 |
/* Only allow relative links */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
604 |
if (link[0] == PATHSEPCHAR) { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
605 |
DEBUG(misc, 1, "Ignoring absolute link in tar: %s -> %s", name, link); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
606 |
break; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
607 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
608 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
609 |
/* Process relative path. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
610 |
* Note: The destination of links must not contain any directory-links. */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
611 |
strcpy(dest, name); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
612 |
char *destpos = strrchr(dest, PATHSEPCHAR); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
613 |
if (destpos == NULL) destpos = dest; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
614 |
*destpos = '\0'; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
615 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
616 |
char *pos = link; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
617 |
while (*pos != '\0') { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
618 |
char *next = strchr(link, PATHSEPCHAR); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
619 |
if (next == NULL) next = pos + strlen(pos); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
620 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
621 |
/* Skip '.' (current dir) */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
622 |
if (next != pos + 1 || pos[0] != '.') { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
623 |
if (next == pos + 2 && pos[0] == '.' && pos[1] == '.') { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
624 |
/* level up */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
625 |
if (dest[0] == '\0') { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
626 |
DEBUG(misc, 1, "Ignoring link pointing outside of data directory: %s -> %s", name, link); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
627 |
break; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
628 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
629 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
630 |
/* Truncate 'dest' after last PATHSEPCHAR. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
631 |
* This assumes, that the truncated part is a real directory and not a link */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
632 |
destpos = strrchr(dest, PATHSEPCHAR); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
633 |
if (destpos == NULL) destpos = dest; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
634 |
} else { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
635 |
/* Append at end of 'dest' */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
636 |
if (destpos != dest) *(destpos++) = PATHSEPCHAR; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
637 |
strncpy(destpos, pos, next - pos); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
638 |
destpos += next - pos; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
639 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
640 |
*destpos = '\0'; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
641 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
642 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
643 |
pos = next; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
644 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
645 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
646 |
/* Store links in temporary list */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
647 |
DEBUG(misc, 6, "Found link in tar: %s -> %s", name, dest); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
648 |
links.insert(TarLinkList::value_type(name, dest)); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
649 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
650 |
break; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
651 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
652 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
653 |
default: |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
654 |
/* Ignore other types */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
655 |
break; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
656 |
} |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
657 |
|
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
658 |
/* Skip to the next block.. */ |
8423
8453e9a0f0b5
(svn r11480) -Codechange: Rename the function ALIGN fitting to the naming style
skidd13
parents:
8407
diff
changeset
|
659 |
skip = Align(skip, 512); |
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
660 |
fseek(f, skip, SEEK_CUR); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
661 |
pos += skip; |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
662 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
663 |
|
8088
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
664 |
DEBUG(misc, 1, "Found tar '%s' with %d new files", filename, num); |
7c1a4dd586ae
(svn r11119) -Codechange: analyze .tar files upon loading, remembering their files and offsets, which speeds up .tar handling with a big factor
truelight
parents:
8086
diff
changeset
|
665 |
fclose(f); |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
666 |
|
11139
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
667 |
/* Resolve file links and store directory links. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
668 |
* We restrict usage of links to two cases: |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
669 |
* 1) Links to directories: |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
670 |
* Both the source path and the destination path must NOT contain any further links. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
671 |
* When resolving files at most one directory link is resolved. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
672 |
* 2) Links to files: |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
673 |
* The destination path must NOT contain any links. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
674 |
* The source path may contain one directory link. |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
675 |
*/ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
676 |
for (TarLinkList::iterator link = links.begin(); link != links.end(); link++) { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
677 |
const std::string &src = link->first; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
678 |
const std::string &dest = link->second; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
679 |
|
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
680 |
TarFileList::iterator dest_file = _tar_filelist.find(dest); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
681 |
if (dest_file != _tar_filelist.end()) { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
682 |
/* Link to file. Process the link like the destination file. */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
683 |
_tar_filelist.insert(TarFileList::value_type(src, dest_file->second)); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
684 |
} else { |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
685 |
/* Destination file not found. Assume 'link to directory' */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
686 |
/* Append PATHSEPCHAR to 'src' and 'dest' */ |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
687 |
const std::string src_path = src + PATHSEPCHAR; |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
688 |
const std::string dst_path = (dest.length() == 0 ? "" : dest + PATHSEPCHAR); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
689 |
_tar_linklist.insert(TarLinkList::value_type(src_path, dst_path)); |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
690 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
691 |
} |
3a72578d7811
(svn r13697) -Feature: Add some support for symbolic links in .tar files.
frosch
parents:
11135
diff
changeset
|
692 |
|
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
693 |
return true; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
694 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
695 |
|
10465
0c68afe3d725
(svn r13008) -Fix [FS#1997]: silence some MSVC x64 warnings
glx
parents:
10421
diff
changeset
|
696 |
static int ScanPathForTarFiles(const char *path, size_t basepath_length) |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
697 |
{ |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
698 |
extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
699 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
700 |
uint num = 0; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
701 |
struct stat sb; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
702 |
struct dirent *dirent; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
703 |
DIR *dir; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
704 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
705 |
if (path == NULL || (dir = ttd_opendir(path)) == NULL) return 0; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
706 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
707 |
while ((dirent = readdir(dir)) != NULL) { |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
708 |
const char *d_name = FS2OTTD(dirent->d_name); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
709 |
char filename[MAX_PATH]; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
710 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
711 |
if (!FiosIsValidFile(path, dirent, &sb)) continue; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
712 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
713 |
snprintf(filename, lengthof(filename), "%s%s", path, d_name); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
714 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
715 |
if (sb.st_mode & S_IFDIR) { |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
716 |
/* Directory */ |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
717 |
if (strcmp(d_name, ".") == 0 || strcmp(d_name, "..") == 0) continue; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
718 |
AppendPathSeparator(filename, lengthof(filename)); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
719 |
num += ScanPathForTarFiles(filename, basepath_length); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
720 |
} else if (sb.st_mode & S_IFREG) { |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
721 |
/* File */ |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
722 |
char *ext = strrchr(filename, '.'); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
723 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
724 |
/* If no extension or extension isn't .tar, skip the file */ |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
725 |
if (ext == NULL) continue; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
726 |
if (strcasecmp(ext, ".tar") != 0) continue; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
727 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
728 |
if (TarListAddFile(filename)) num++; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
729 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
730 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
731 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
732 |
closedir(dir); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
733 |
return num; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
734 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
735 |
|
8085
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
736 |
void ScanForTarFiles() |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
737 |
{ |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
738 |
Searchpath sp; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
739 |
char path[MAX_PATH]; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
740 |
uint num = 0; |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
741 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
742 |
DEBUG(misc, 1, "Scanning for tars"); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
743 |
FOR_ALL_SEARCHPATHS(sp) { |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
744 |
FioAppendDirectory(path, MAX_PATH, sp, DATA_DIR); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
745 |
num += ScanPathForTarFiles(path, strlen(path)); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
746 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
747 |
DEBUG(misc, 1, "Scan complete, found %d files", num); |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
748 |
} |
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
749 |
|
8085
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
750 |
#if defined(WIN32) || defined(WINCE) |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
751 |
/** |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
752 |
* Determine the base (personal dir and game data dir) paths |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
753 |
* @param exe the path from the current path to the executable |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
754 |
* @note defined in the OS related files (os2.cpp, win32.cpp, unix.cpp etc) |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
755 |
*/ |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
756 |
extern void DetermineBasePaths(const char *exe); |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
757 |
#else /* defined(WIN32) || defined(WINCE) */ |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
758 |
|
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
759 |
/** |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
760 |
* Changes the working directory to the path of the give executable. |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
761 |
* For OSX application bundles '.app' is the required extension of the bundle, |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
762 |
* so when we crop the path to there, when can remove the name of the bundle |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
763 |
* in the same way we remove the name from the executable name. |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
764 |
* @param exe the path to the executable |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
765 |
*/ |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
766 |
void ChangeWorkingDirectory(const char *exe) |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
767 |
{ |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
768 |
#ifdef WITH_COCOA |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
769 |
char *app_bundle = strchr(exe, '.'); |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
770 |
while (app_bundle != NULL && strncasecmp(app_bundle, ".app", 4) != 0) app_bundle = strchr(&app_bundle[1], '.'); |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
771 |
|
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
772 |
if (app_bundle != NULL) app_bundle[0] = '\0'; |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
773 |
#endif /* WITH_COCOA */ |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
774 |
char *s = strrchr(exe, PATHSEPCHAR); |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
775 |
if (s != NULL) { |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
776 |
*s = '\0'; |
10418
3ac4a89469df
(svn r12960) -Codechange: handle return values of (some) file system related functions.
rubidium
parents:
10401
diff
changeset
|
777 |
if (chdir(exe) != 0) DEBUG(misc, 0, "Directory with the binary does not exist?"); |
8085
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
778 |
*s = PATHSEPCHAR; |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
779 |
} |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
780 |
#ifdef WITH_COCOA |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
781 |
if (app_bundle != NULL) app_bundle[0] = '.'; |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
782 |
#endif /* WITH_COCOA */ |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
783 |
} |
698efbcb33de
(svn r11116) -Fix (r11106): tar loader was not compiled for WIN32
glx
parents:
8080
diff
changeset
|
784 |
|
6643
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
785 |
/** |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
786 |
* Determine the base (personal dir and game data dir) paths |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
787 |
* @param exe the path to the executable |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
788 |
*/ |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
789 |
void DetermineBasePaths(const char *exe) |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
790 |
{ |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
791 |
char tmp[MAX_PATH]; |
7486
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
792 |
#if defined(__MORPHOS__) || defined(__AMIGA__) || !defined(WITH_PERSONAL_DIR) |
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
793 |
_searchpaths[SP_PERSONAL_DIR] = NULL; |
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
794 |
#else |
6643
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
795 |
const char *homedir = getenv("HOME"); |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
796 |
|
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
797 |
if (homedir == NULL) { |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
798 |
const struct passwd *pw = getpwuid(getuid()); |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
799 |
homedir = (pw == NULL) ? "" : pw->pw_dir; |
6643
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
800 |
} |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
801 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
802 |
snprintf(tmp, MAX_PATH, "%s" PATHSEP "%s", homedir, PERSONAL_DIR); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
803 |
AppendPathSeparator(tmp, MAX_PATH); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
804 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
805 |
_searchpaths[SP_PERSONAL_DIR] = strdup(tmp); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
806 |
#endif |
8769
ee288fa819f6
(svn r11837) -Feature: [OSX] added "/Library/Application Support/OpenTTD" to the search paths (based on patch by pv2b)
bjarni
parents:
8710
diff
changeset
|
807 |
|
ee288fa819f6
(svn r11837) -Feature: [OSX] added "/Library/Application Support/OpenTTD" to the search paths (based on patch by pv2b)
bjarni
parents:
8710
diff
changeset
|
808 |
#if defined(WITH_SHARED_DIR) |
ee288fa819f6
(svn r11837) -Feature: [OSX] added "/Library/Application Support/OpenTTD" to the search paths (based on patch by pv2b)
bjarni
parents:
8710
diff
changeset
|
809 |
snprintf(tmp, MAX_PATH, "%s", SHARED_DIR); |
ee288fa819f6
(svn r11837) -Feature: [OSX] added "/Library/Application Support/OpenTTD" to the search paths (based on patch by pv2b)
bjarni
parents:
8710
diff
changeset
|
810 |
AppendPathSeparator(tmp, MAX_PATH); |
ee288fa819f6
(svn r11837) -Feature: [OSX] added "/Library/Application Support/OpenTTD" to the search paths (based on patch by pv2b)
bjarni
parents:
8710
diff
changeset
|
811 |
_searchpaths[SP_SHARED_DIR] = strdup(tmp); |
ee288fa819f6
(svn r11837) -Feature: [OSX] added "/Library/Application Support/OpenTTD" to the search paths (based on patch by pv2b)
bjarni
parents:
8710
diff
changeset
|
812 |
#else |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
813 |
_searchpaths[SP_SHARED_DIR] = NULL; |
8769
ee288fa819f6
(svn r11837) -Feature: [OSX] added "/Library/Application Support/OpenTTD" to the search paths (based on patch by pv2b)
bjarni
parents:
8710
diff
changeset
|
814 |
#endif |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
815 |
|
7486
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
816 |
#if defined(__MORPHOS__) || defined(__AMIGA__) |
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
817 |
_searchpaths[SP_WORKING_DIR] = NULL; |
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
818 |
#else |
10418
3ac4a89469df
(svn r12960) -Codechange: handle return values of (some) file system related functions.
rubidium
parents:
10401
diff
changeset
|
819 |
if (getcwd(tmp, MAX_PATH) == NULL) *tmp = '\0'; |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
820 |
AppendPathSeparator(tmp, MAX_PATH); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
821 |
_searchpaths[SP_WORKING_DIR] = strdup(tmp); |
7486
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
822 |
#endif |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
823 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
824 |
/* Change the working directory to that one of the executable */ |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
825 |
ChangeWorkingDirectory((char*)exe); |
10418
3ac4a89469df
(svn r12960) -Codechange: handle return values of (some) file system related functions.
rubidium
parents:
10401
diff
changeset
|
826 |
if (getcwd(tmp, MAX_PATH) == NULL) *tmp = '\0'; |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
827 |
AppendPathSeparator(tmp, MAX_PATH); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
828 |
_searchpaths[SP_BINARY_DIR] = strdup(tmp); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
829 |
|
7486
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
830 |
#if defined(__MORPHOS__) || defined(__AMIGA__) |
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
831 |
_searchpaths[SP_INSTALLATION_DIR] = NULL; |
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
832 |
#else |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
833 |
snprintf(tmp, MAX_PATH, "%s", GLOBAL_DATA_DIR); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
834 |
AppendPathSeparator(tmp, MAX_PATH); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
835 |
_searchpaths[SP_INSTALLATION_DIR] = strdup(tmp); |
7486
d130c10f4dab
(svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents:
7437
diff
changeset
|
836 |
#endif |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
837 |
#ifdef WITH_COCOA |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
838 |
extern void cocoaSetApplicationBundleDir(); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
839 |
cocoaSetApplicationBundleDir(); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
840 |
#else |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
841 |
_searchpaths[SP_APPLICATION_BUNDLE_DIR] = NULL; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
842 |
#endif |
8077
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
843 |
|
92edb3688fdf
(svn r11106) -Add: added .tar support; you can pack all files in your data/ dir in how ever many .tar files you like, keeping the dir-structure equal to the unpacked version, and OpenTTD can handle them just like the files were unpacked
truelight
parents:
8071
diff
changeset
|
844 |
ScanForTarFiles(); |
6643
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
845 |
} |
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
846 |
#endif /* defined(WIN32) || defined(WINCE) */ |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
847 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
848 |
char *_personal_dir; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
849 |
|
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
850 |
/** |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
851 |
* Acquire the base paths (personal dir and game data dir), |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
852 |
* fill all other paths (save dir, autosave dir etc) and |
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
853 |
* make the save and scenario directories. |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
854 |
* @param exe the path from the current path to the executable |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
855 |
*/ |
6643
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
856 |
void DeterminePaths(const char *exe) |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
857 |
{ |
6643
7fad81bde617
(svn r9266) -Codechange: unify the retrieval of the base paths a little more.
rubidium
parents:
6625
diff
changeset
|
858 |
DetermineBasePaths(exe); |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
859 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
860 |
Searchpath sp; |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
861 |
FOR_ALL_SEARCHPATHS(sp) DEBUG(misc, 4, "%s added as search path", _searchpaths[sp]); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
862 |
|
7437
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
863 |
if (_config_file != NULL) { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
864 |
_personal_dir = strdup(_config_file); |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
865 |
char *end = strrchr(_personal_dir , PATHSEPCHAR); |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
866 |
if (end == NULL) { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
867 |
_personal_dir[0] = '\0'; |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
868 |
} else { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
869 |
end[1] = '\0'; |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
870 |
} |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
871 |
} else { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
872 |
char personal_dir[MAX_PATH]; |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
873 |
FioFindFullPath(personal_dir, lengthof(personal_dir), BASE_DIR, "openttd.cfg"); |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
874 |
|
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
875 |
if (FileExists(personal_dir)) { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
876 |
char *end = strrchr(personal_dir, PATHSEPCHAR); |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
877 |
if (end != NULL) end[1] = '\0'; |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
878 |
_personal_dir = strdup(personal_dir); |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
879 |
_config_file = str_fmt("%sopenttd.cfg", _personal_dir); |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
880 |
} else { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
881 |
static const Searchpath new_openttd_cfg_order[] = { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
882 |
SP_PERSONAL_DIR, SP_BINARY_DIR, SP_WORKING_DIR, SP_SHARED_DIR, SP_INSTALLATION_DIR |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
883 |
}; |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
884 |
|
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
885 |
for (uint i = 0; i < lengthof(new_openttd_cfg_order); i++) { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
886 |
if (IsValidSearchPath(new_openttd_cfg_order[i])) { |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
887 |
_personal_dir = strdup(_searchpaths[new_openttd_cfg_order[i]]); |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
888 |
_config_file = str_fmt("%sopenttd.cfg", _personal_dir); |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
889 |
break; |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
890 |
} |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
891 |
} |
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
892 |
} |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
893 |
} |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
894 |
|
7437
3479a4c141b5
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
rubidium
parents:
7431
diff
changeset
|
895 |
DEBUG(misc, 3, "%s found as personal directory", _personal_dir); |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
896 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
897 |
_highscore_file = str_fmt("%shs.dat", _personal_dir); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
898 |
_log_file = str_fmt("%sopenttd.log", _personal_dir); |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
899 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
900 |
char *save_dir = str_fmt("%s%s", _personal_dir, FioGetSubdirectory(SAVE_DIR)); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
901 |
char *autosave_dir = str_fmt("%s%s", _personal_dir, FioGetSubdirectory(AUTOSAVE_DIR)); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
902 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
903 |
/* Make the necessary folders */ |
8407
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
904 |
#if !defined(__MORPHOS__) && !defined(__AMIGA__) && defined(WITH_PERSONAL_DIR) |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
905 |
FioCreateDirectory(_personal_dir); |
8407
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
906 |
#endif |
f2f6dae6b6d3
(svn r11464) -Fix: some issue that made OpenTTD on MorphOS seriously unplayable.
rubidium
parents:
8301
diff
changeset
|
907 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
908 |
FioCreateDirectory(save_dir); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
909 |
FioCreateDirectory(autosave_dir); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
910 |
|
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
911 |
free(save_dir); |
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7392
diff
changeset
|
912 |
free(autosave_dir); |
6624
554e5aee6c3f
(svn r9129) -Codechange: unify parts of DeterminePaths.
rubidium
parents:
6574
diff
changeset
|
913 |
} |
7371
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
914 |
|
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
915 |
/** |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
916 |
* Sanitizes a filename, i.e. removes all illegal characters from it. |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
917 |
* @param filename the "\0" terminated filename |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
918 |
*/ |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
919 |
void SanitizeFilename(char *filename) |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
920 |
{ |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
921 |
for (; *filename != '\0'; filename++) { |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
922 |
switch (*filename) { |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
923 |
/* The following characters are not allowed in filenames |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
924 |
* on at least one of the supported operating systems: */ |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
925 |
case ':': case '\\': case '*': case '?': case '/': |
7512
7889a88184c0
(svn r10272) -Fix (FS#916): remove more invalid characters from savegame names
glx
parents:
7486
diff
changeset
|
926 |
case '<': case '>': case '|': case '"': |
7371
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
927 |
*filename = '_'; |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
928 |
break; |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
929 |
} |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
930 |
} |
b86b05214afe
(svn r10116) -Fix [FS#850]: remove invalid characters (for the file system) from savegame names. Based on a patch by TheJosh.
rubidium
parents:
7330
diff
changeset
|
931 |
} |
8627
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
932 |
|
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
933 |
void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize) |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
934 |
{ |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
935 |
FILE *in; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
936 |
byte *mem; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
937 |
size_t len; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
938 |
|
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
939 |
in = fopen(filename, "rb"); |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
940 |
if (in == NULL) return NULL; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
941 |
|
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
942 |
fseek(in, 0, SEEK_END); |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
943 |
len = ftell(in); |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
944 |
fseek(in, 0, SEEK_SET); |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
945 |
if (len > maxsize || (mem = MallocT<byte>(len + 1)) == NULL) { |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
946 |
fclose(in); |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
947 |
return NULL; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
948 |
} |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
949 |
mem[len] = 0; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
950 |
if (fread(mem, len, 1, in) != 1) { |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
951 |
fclose(in); |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
952 |
free(mem); |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
953 |
return NULL; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
954 |
} |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
955 |
fclose(in); |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
956 |
|
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
957 |
*lenp = len; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
958 |
return mem; |
448ebf3a8291
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8626
diff
changeset
|
959 |
} |