X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=5b9c14974869ab3565f1c23f0560994b30caa7c4;hb=dd9ceb6ccbca98a08618a61395b7cee97973fe5a;hp=27381f07cc6bbf2a1ca40da9ab354e737d70934a;hpb=7e026612d4326f751e2a80a5c73ce882a6b93ecc;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index 27381f07..5b9c1497 100644 --- a/fs.c +++ b/fs.c @@ -893,6 +893,25 @@ static packfile_t* FS_AddFileToPack (const char* name, pack_t* pack, } +static void FS_mkdir (const char *path) +{ + if(COM_CheckParm("-readonly")) + return; + +#if WIN32 + if (_mkdir (path) == -1) +#else + if (mkdir (path, 0777) == -1) +#endif + { + // No logging for this. The only caller is FS_CreatePath (which + // calls it in ways that will intentionally produce EEXIST), + // and its own callers always use the directory afterwards and + // thus will detect failure that way. + } +} + + /* ============ FS_CreatePath @@ -988,7 +1007,7 @@ static pack_t *FS_LoadPackPAK (const char *packfile) numpackfiles = header.dirlen / sizeof(dpackfile_t); - if (numpackfiles > MAX_FILES_IN_PACK) + if (numpackfiles < 0 || numpackfiles > MAX_FILES_IN_PACK) { Con_Printf ("%s has %i files\n", packfile, numpackfiles); close(packhandle); @@ -1018,6 +1037,9 @@ static pack_t *FS_LoadPackPAK (const char *packfile) fs_offset_t offset = (unsigned int)LittleLong (info[i].filepos); fs_offset_t size = (unsigned int)LittleLong (info[i].filelen); + // Ensure a zero terminated file name (required by format). + info[i].name[sizeof(info[i].name) - 1] = 0; + FS_AddFileToPack (info[i].name, pack, offset, size, size, PACKFILE_FLAG_TRUEOFFS); } @@ -1912,7 +1934,7 @@ static int FS_ChooseUserDir(userdirmode_t userdirmode, char *userdir, size_t use if(access(va(vabuf, sizeof(vabuf), "%s%s/", userdir, gamedirname1), W_OK | X_OK) >= 0) fd = 1; else - fd = 0; + fd = -1; #endif if(fd >= 0) { @@ -2693,7 +2715,15 @@ int FS_Close (qfile_t* file) if (file->filename) { if (file->flags & QFILE_FLAG_REMOVE) - remove(file->filename); + { + if (remove(file->filename) == -1) + { + // No need to report this. If removing a just + // written file failed, this most likely means + // someone else deleted it first - which we + // like. + } + } Mem_Free((void *) file->filename); } @@ -2729,7 +2759,7 @@ fs_offset_t FS_Write (qfile_t* file, const void* data, size_t datasize) { if (lseek (file->handle, file->buff_ind - file->buff_len, SEEK_CUR) == -1) { - Con_Printf("WARNING: could not seek in %s.\n"); + Con_Printf("WARNING: could not seek in %s.\n", file->filename); } } @@ -3415,18 +3445,6 @@ qboolean FS_SysFileExists (const char *path) return FS_SysFileType (path) != FS_FILETYPE_NONE; } -void FS_mkdir (const char *path) -{ - if(COM_CheckParm("-readonly")) - return; - -#if WIN32 - _mkdir (path); -#else - mkdir (path, 0777); -#endif -} - /* =========== FS_Search @@ -3806,7 +3824,7 @@ qboolean FS_IsRegisteredQuakePack(const char *name) int diff; middle = (left + right) / 2; - diff = !strcmp_funct (pak->files[middle].name, "gfx/pop.lmp"); + diff = strcmp_funct (pak->files[middle].name, "gfx/pop.lmp"); // Found it if (!diff) @@ -3917,8 +3935,7 @@ unsigned char *FS_Deflate(const unsigned char *data, size_t size, size_t *deflat return NULL; } - if(deflated_size) - *deflated_size = (size_t)strm.total_out; + *deflated_size = (size_t)strm.total_out; memcpy(out, tmp, strm.total_out); Mem_Free(tmp); @@ -4032,8 +4049,7 @@ unsigned char *FS_Inflate(const unsigned char *data, size_t size, size_t *inflat memcpy(out, outbuf.data, outbuf.cursize); Mem_Free(outbuf.data); - if(inflated_size) - *inflated_size = (size_t)outbuf.cursize; + *inflated_size = (size_t)outbuf.cursize; return out; }