FTEQW
Documentation of the FTE engine source tree.
fs.h
Go to the documentation of this file.
1#include "hash.h"
2
3/*
4Threading:
5When the main thread will harm the filesystem tree/hash, it will first lock fs_thread_mutex (FIXME: make a proper rwlock).
6Worker threads must thus lock that mutex for any opens (to avoid it changing underneath it), but can unlock it as soon as the open call returns.
7Files may be shared between threads, but not simultaneously.
8The filesystem driver is responsible for closing the pak/pk3 once all files are closed, and must ensure that opens+reads+closes as well as archive closure are thread safe.
9*/
10
11#define FSVER 3
12
13
14#define FF_NOTFOUND (0u) //file wasn't found
15#define FF_FOUND (1u<<0u) //file was found
16#define FF_SYMLINK (1u<<1u) //file contents are the name of a different file (symlink). do a recursive lookup on the name
17#define FF_DIRECTORY (1u<<2u)
18
19typedef struct
20{
22 int depth; /*shallower files will remove deeper files*/
24extern hashtable_t filesystemhash; //this table is the one to build your hash references into
25extern int fs_hash_dups; //for tracking efficiency. no functional use.
26extern int fs_hash_files; //for tracking efficiency. no functional use.
27extern qboolean fs_readonly; //if true, fopen(, "w") should always fail.
28extern void *fs_thread_mutex;
29extern float fs_accessed_time;
30extern cvar_t fs_dlURL;
31
32struct searchpath_s;
34{
35 int fsver;
36 void (QDECL *ClosePath)(searchpathfuncs_t *handle); //removes a reference, kills it when it reaches 0. the package can only actually be killed once all contained files are closed.
37 void (QDECL *AddReference)(searchpathfuncs_t *handle); //adds an extra reference, so we survive closes better.
38
39 void (QDECL *GetPathDetails)(searchpathfuncs_t *handle, char *outdetails, size_t sizeofdetails);
40 void (QDECL *BuildHash)(searchpathfuncs_t *handle, int depth, void (QDECL *FS_AddFileHash)(int depth, const char *fname, fsbucket_t *filehandle, void *pathhandle));
41 unsigned int (QDECL *FindFile)(searchpathfuncs_t *handle, flocation_t *loc, const char *name, void *hashedresult); //true if found (hashedresult can be NULL)
42 //note that if rawfile and offset are set, many Com_FileOpens will read the raw file
43 //otherwise ReadFile will be called instead.
44 void (QDECL *ReadFile)(searchpathfuncs_t *handle, flocation_t *loc, char *buffer); //reads the entire file in one go (size comes from loc, so make sure the loc is valid, this is for performance with compressed archives)
45 int (QDECL *EnumerateFiles)(searchpathfuncs_t *handle, const char *match, int (QDECL *func)(const char *fname, qofs_t fsize, time_t mtime, void *parm, searchpathfuncs_t *spath), void *parm);
46
47 int (QDECL *GeneratePureCRC) (searchpathfuncs_t *handle, int seed, int usepure);
48
50
51 qboolean (QDECL *PollChanges)(searchpathfuncs_t *handle); //returns true if there were changes
52
53 qboolean (QDECL *FileStat)(searchpathfuncs_t *handle, flocation_t *loc, time_t *mtime);
54 qboolean (QDECL *CreateFile)(searchpathfuncs_t *handle, flocation_t *loc, const char *filename); //like FindFile, but returns a usable loc even if the file does not exist yet (may also create requisite directories too)
55 qboolean (QDECL *RenameFile)(searchpathfuncs_t *handle, const char *oldname, const char *newname); //returns true on success, false if source doesn't exist, or if dest does (cached locs may refer to either new or old name).
56 qboolean (QDECL *RemoveFile)(searchpathfuncs_t *handle, const char *filename); //returns true on success, false if it wasn't found or is readonly.
57};
58//searchpathfuncs_t *(QDECL *OpenNew)(vfsfile_t *file, const char *desc); //returns a handle to a new pak/path
59
60//the stdio filesystem is special as that's the starting point of the entire filesystem
61//warning: the handle is known to be a string pointer to the dir name
62extern searchpathfuncs_t *(QDECL VFSOS_OpenPath) (vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix);
63extern searchpathfuncs_t *(QDECL FSZIP_LoadArchive) (vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix);
64extern searchpathfuncs_t *(QDECL FSPAK_LoadArchive) (vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix);
65extern searchpathfuncs_t *(QDECL FSDWD_LoadArchive) (vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix);
66extern searchpathfuncs_t *(QDECL FSDZ_LoadArchive) (vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix);
67vfsfile_t *QDECL VFSOS_Open(const char *osname, const char *mode);
69
70int FS_RegisterFileSystemType(void *module, const char *extension, searchpathfuncs_t *(QDECL *OpenNew)(vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix), qboolean loadscan);
73
74void FS_AddHashedPackage(searchpath_t **oldpaths, const char *parent_pure, const char *parent_logical, searchpath_t *search, unsigned int loadstuff, const char *pakpath, const char *qhash, const char *pakprefix, unsigned int packageflags);
75void PM_LoadPackages(searchpath_t **oldpaths, const char *parent_pure, const char *parent_logical, searchpath_t *search, unsigned int loadstuff, int minpri, int maxpri);
77void *PM_GeneratePackageFromMeta(vfsfile_t *file, char *fname, size_t fnamesize, enum fs_relative *fsroot);
78void PM_FileInstalled(const char *filename, enum fs_relative fsroot, void *metainfo, qboolean enable); //we finished installing a file via some other mechanism (drag+drop or from server. insert it into the updates menu.
79void PM_EnumeratePlugins(void (*callback)(const char *name, qboolean blocked));
81void PM_EnumerateMaps(const char *partial, struct xcommandargcompletioncb_s *ctx);
82void PM_LoadMap(const char *package, const char *map);
83unsigned int PM_IsApplying(void);
84unsigned int PM_MarkUpdates (void); //mark new/updated packages as needing install.
85void PM_ApplyChanges(void); //for -install/-doinstall args
87qboolean PM_FindUpdatedEngine(char *syspath, size_t syspathsize); //names the engine we should be running
89void Menu_Download_Update(void);
90
91typedef struct
92{
94 void (*Update) (const char *url, vfsfile_t *out, qboolean favourcache);
95#define plugupdatesourcefuncs_name "UpdateSource"
98
100{
101 MST_SYSTEM, //found via an fmf installed at system level (eg part of a flatpak app)
102 MST_DEFAULT, //the default.fmf in the working directory
103 MST_BASEDIR, //other fmf files in the basedir
104 MST_HOMEDIR, //other fmf files in the homedir
105 MST_GAMEDIR, //mod found from just looking for gamedirs.
106 MST_INTRINSIC, //knowledge of the mod came one of the games we're hardcoded with.
107
108 MST_UNKNOWN, //forgot where it came from...
109};
110int FS_EnumerateKnownGames(qboolean (*callback)(void *usr, ftemanifest_t *man, enum modsourcetype_e sourcetype), void *usr);
111
113{
116 char *gamedir;
118};
119struct modlist_s *Mods_GetMod(size_t diridx);
120
121#define SPF_REFERENCED 1 //something has been loaded from this path. should filter out client references...
122#define SPF_COPYPROTECTED 2 //downloads are not allowed fom here.
123#define SPF_TEMPORARY 4 //a map-specific path, purged at map change.
124#define SPF_EXPLICIT 8 //a root gamedir (bumps depth on gamedir depth checks).
125#define SPF_UNTRUSTED 16 //has been downloaded from somewhere. configs inside it should never be execed with local access rights.
126#define SPF_PRIVATE 32 //private to the client. ie: the fte dir. name is not networked.
127#define SPF_WRITABLE 64 //safe to write here. lots of weird rules etc.
128#define SPF_BASEPATH 128 //part of the basegames, and not the mod gamedir(s).
129#define SPF_QSHACK 256 //a bit of a hack, allows scanning for $rootdir/quakespasm.pak
130#define SPF_SERVER 512 //a package that was loaded to match the server's packages
131#define SPF_ISDIR 1024 //is an actual directory (not itself a package).
132qboolean FS_LoadPackageFromFile(vfsfile_t *vfs, char *pname, char *localname, int *crc, unsigned int flags);
133
134#ifdef AVAIL_XZDEC
137#endif
138#ifdef AVAIL_GZDEC
139vfsfile_t *FS_GZ_WriteFilter(vfsfile_t *outfile, qboolean autoclosefile, qboolean compress);
140#endif
qboolean
Definition: api_menu.h:34
uint64_t qofs_t
Definition: api_menu.h:49
enum @13::coninfomode_e mode
Definition: com_phys_ode.c:695
void(QDECL *vgui_frame)(void)
void dNearCallback * callback
Definition: com_phys_ode.c:655
fs_relative
Definition: common.h:661
const char * extension
Definition: fs.c:251
qboolean loadscan
Definition: fs.c:253
qboolean PM_AreSourcesNew(qboolean doprompt)
Definition: m_download.c:6493
void PM_ManifestChanged(ftemanifest_t *man)
Definition: m_download.c:2126
vfsfile_t *QDECL VFSOS_Open(const char *osname, const char *mode)
Definition: fs_stdio.c:246
int FS_EnumerateKnownGames(qboolean(*callback)(void *usr, ftemanifest_t *man, enum modsourcetype_e sourcetype), void *usr)
Definition: fs.c:6982
float fs_accessed_time
Definition: fs.c:212
searchpathfuncs_t *QDECL FSZIP_LoadArchive(vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix)
Definition: fs_zip.c:2265
void FS_UnRegisterFileSystemType(int idx)
Definition: fs.c:279
void * PM_GeneratePackageFromMeta(vfsfile_t *file, char *fname, size_t fnamesize, enum fs_relative *fsroot)
Definition: m_download.c:1807
void PM_ApplyChanges(void)
Definition: m_download.c:4258
vfsfile_t * FS_XZ_DecompressWriteFilter(vfsfile_t *infile)
Definition: fs_xz.c:3092
searchpathfuncs_t *QDECL FSDZ_LoadArchive(vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix)
Definition: fs_dzip.c:1355
qboolean FS_LoadPackageFromFile(vfsfile_t *vfs, char *pname, char *localname, int *crc, unsigned int flags)
Definition: fs.c:4612
unsigned int PM_IsApplying(void)
Definition: m_download.c:4239
void PM_EnumerateMaps(const char *partial, struct xcommandargcompletioncb_s *ctx)
Definition: m_download.c:1716
void PM_LoadPackages(searchpath_t **oldpaths, const char *parent_pure, const char *parent_logical, searchpath_t *search, unsigned int loadstuff, int minpri, int maxpri)
Definition: m_download.c:2137
searchpathfuncs_t *QDECL FSPAK_LoadArchive(vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix)
Definition: fs_pak.c:308
void PM_AddManifestPackages(ftemanifest_t *man)
Definition: m_download.c:5118
vfsfile_t * FS_XZ_DecompressReadFilter(vfsfile_t *srcfile)
Definition: fs_xz.c:3128
cvar_t fs_dlURL
Definition: fs.c:223
hashtable_t filesystemhash
Definition: fs.c:204
void * fs_thread_mutex
Definition: fs.c:211
struct modlist_s * Mods_GetMod(size_t diridx)
Definition: fs.c:7360
int fs_hash_dups
Definition: fs.c:460
qboolean PM_FindUpdatedEngine(char *syspath, size_t syspathsize)
Definition: m_download.c:5029
int fs_hash_files
Definition: fs.c:461
searchpathfuncs_t *QDECL VFSOS_OpenPath(vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix)
void PM_FileInstalled(const char *filename, enum fs_relative fsroot, void *metainfo, qboolean enable)
Definition: m_download.c:1943
vfsfile_t * FS_DecompressGZip(vfsfile_t *infile, vfsfile_t *outfile)
Definition: fs_zip.c:149
vfsfile_t * FS_GZ_WriteFilter(vfsfile_t *outfile, qboolean autoclosefile, qboolean compress)
Definition: fs_zip.c:549
searchpathfuncs_t *QDECL FSDWD_LoadArchive(vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix)
void FS_AddHashedPackage(searchpath_t **oldpaths, const char *parent_pure, const char *parent_logical, searchpath_t *search, unsigned int loadstuff, const char *pakpath, const char *qhash, const char *pakprefix, unsigned int packageflags)
Definition: fs.c:3787
int FS_RegisterFileSystemType(void *module, const char *extension, searchpathfuncs_t *(QDECL *OpenNew)(vfsfile_t *file, searchpathfuncs_t *parent, const char *filename, const char *desc, const char *prefix), qboolean loadscan)
Definition: fs.c:256
qboolean fs_readonly
Definition: fs.c:207
void PM_EnumeratePlugins(void(*callback)(const char *name, qboolean blocked))
Definition: m_download.c:1690
qboolean PM_RegisterUpdateSource(void *module, plugupdatesourcefuncs_t *funcs)
Definition: m_download.c:2973
unsigned int PM_MarkUpdates(void)
Definition: m_download.c:2540
modsourcetype_e
Definition: fs.h:100
@ MST_UNKNOWN
Definition: fs.h:108
@ MST_INTRINSIC
Definition: fs.h:106
@ MST_SYSTEM
Definition: fs.h:101
@ MST_HOMEDIR
Definition: fs.h:104
@ MST_GAMEDIR
Definition: fs.h:105
@ MST_BASEDIR
Definition: fs.h:103
@ MST_DEFAULT
Definition: fs.h:102
void PM_LoadMap(const char *package, const char *map)
Definition: m_download.c:4224
void FS_UnRegisterFileSystemModule(void *module)
Definition: fs.c:291
void Menu_Download_Update(void)
Definition: m_download.c:6521
char filename[64]
Definition: generatebuiltin.c:8
static EGLSurface EGLSurface EGLContext ctx
Definition: gl_videgl.c:47
GLenum pname
Definition: glquake.h:151
GLuint GLcharARB * name
Definition: glquake.h:155
void * module
Definition: image.c:236
void * handle
Definition: image.c:4553
plugimageloaderfuncs_t * funcs
Definition: image.c:237
char * map
Definition: m_download.c:203
char * package
Definition: m_download.c:202
char fname[MAX_QPATH]
Definition: m_mp3.c:160
const char * desc
Definition: m_options.c:1101
int idx
Definition: pr_lua.c:221
const char * file
Definition: qcc_pr_lex.c:2518
static SpeexBits spx_int16_t * out
Definition: snd_dma.c:492
Definition: hash.h:11
Definition: cvar.h:59
Definition: common.h:577
Definition: fs.h:20
int depth
Definition: fs.h:22
bucket_t buck
Definition: fs.h:21
Definition: common.h:736
Definition: hash.h:19
Definition: fs.h:113
char * gamedir
Definition: fs.h:116
char * description
Definition: fs.h:117
enum modsourcetype_e sourcetype
Definition: fs.h:115
ftemanifest_t * manifest
Definition: fs.h:114
Definition: fs.h:92
char * description
Definition: fs.h:93
Definition: common.h:562
Definition: fs.h:34
unsigned flocation_t const char * name
Definition: fs.h:41
flocation_t const char * filename
Definition: fs.h:54
unsigned int(QDECL *FindFile)(searchpathfuncs_t *handle
const char * oldname
Definition: fs.h:55
int int usepure
Definition: fs.h:47
flocation_t time_t * mtime
Definition: fs.h:53
const char qofs_t time_t void * parm
Definition: fs.h:45
const char qofs_t time_t void searchpathfuncs_t * spath
Definition: fs.h:45
char * outdetails
Definition: fs.h:39
void(QDECL *ClosePath)(searchpathfuncs_t *handle)
int const char * fname
Definition: fs.h:40
char size_t sizeofdetails
Definition: fs.h:39
vfsfile_t *QDECL * OpenVFS(searchpathfuncs_t *handle, flocation_t *loc, const char *mode)
int const char fsbucket_t * filehandle
Definition: fs.h:40
flocation_t char * buffer
Definition: fs.h:44
const char qofs_t fsize
Definition: fs.h:45
int seed
Definition: fs.h:47
const char qofs_t time_t mtime
Definition: fs.h:45
unsigned flocation_t const char void * hashedresult
Definition: fs.h:41
unsigned flocation_t * loc
Definition: fs.h:41
void(QDECL *AddReference)(searchpathfuncs_t *handle)
int depth
Definition: fs.h:40
int(QDECL *GeneratePureCRC)(searchpathfuncs_t *handle
int fsver
Definition: fs.h:35
const char * filename
Definition: fs.h:56
int const char fsbucket_t void * pathhandle
Definition: fs.h:40
const char const char * newname
Definition: fs.h:55
qboolean(QDECL *PollChanges)(searchpathfuncs_t *handle)
const char * match
Definition: fs.h:45
Definition: cmd.h:135
void * vfsfile_t
Definition: sys_plugfte.h:2
unsigned int flags
Definition: valid.c:313