pak = FS_LoadPackPAK (pakfile);
else if(!strcasecmp(ext, "pk3"))
pak = FS_LoadPackPK3 (pakfile);
+ else if(!strcasecmp(ext, "obb")) // android apk expansion
+ pak = FS_LoadPackPK3 (pakfile);
else
Con_Printf("\"%s\" does not have a pack extension\n", pakfile);
// add any PK3 package in the directory
for (i = 0;i < list.numstrings;i++)
{
- if (!strcasecmp(FS_FileExtension(list.strings[i]), "pk3") || !strcasecmp(FS_FileExtension(list.strings[i]), "pk3dir"))
+ if (!strcasecmp(FS_FileExtension(list.strings[i]), "pk3") || !strcasecmp(FS_FileExtension(list.strings[i]), "obb") || !strcasecmp(FS_FileExtension(list.strings[i]), "pk3dir"))
{
FS_AddPack_Fullpath(list.strings[i], list.strings[i] + strlen(dir), NULL, false);
}
{
// fs_basedir is "" by default, to utilize this you can simply add your gamedir to the Resources in xcode
// fs_userdir stores configurations to the Documents folder of the app
- strlcpy(userdir, maxlength, "../Documents/");
+ strlcpy(userdir, "../Documents/", MAX_OSPATH);
return 1;
}
return -1;
#endif
+#if !defined(__IPHONEOS__)
+
#ifdef WIN32
// historical behavior...
if (userdirmode == USERDIRMODE_NOHOME && strcmp(gamedirname1, "id1"))
else
return 0; // probably good - failed to write but maybe we need to create path
}
+#endif
}
/*
// If the base directory is explicitly defined by the compilation process
#ifdef DP_FS_BASEDIR
strlcpy(fs_basedir, DP_FS_BASEDIR, sizeof(fs_basedir));
+#elif defined(__ANDROID__)
+ dpsnprintf(fs_basedir, sizeof(fs_basedir), "/sdcard/%s/", gameuserdirname);
#elif defined(MACOSX)
// FIXME: is there a better way to find the directory outside the .app, without using Objective-C?
if (strstr(com_argv[0], ".app/"))
if (path[0] == '/')
return 2; // attempt to go outside the game directory
- // all: don't allow . characters before the last slash (it should only be used in filenames, not path elements), this catches all imaginable cases of ./, ../, .../, etc
- if (strchr(path, '.'))
- {
- if (isgamedir)
- {
- // gamedir is entirely path elements, so simply forbid . entirely
- return 2;
- }
- if (strchr(path, '.') < strrchr(path, '/'))
- return 2; // possible attempt to go outside the game directory
- }
+ // all: don't allow . character immediately before a slash, this catches all imaginable cases of ./, ../, .../, etc
+ if (strstr(path, "./"))
+ return 2; // possible attempt to go outside the game directory
// all: forbid trailing slash on gamedir
if (isgamedir && path[strlen(path)-1] == '/')
*/
fs_offset_t FS_Write (qfile_t* file, const void* data, size_t datasize)
{
- fs_offset_t result;
+ fs_offset_t written = 0;
// If necessary, seek to the exact file position we're supposed to be
if (file->buff_ind != file->buff_len)
FS_Purge (file);
// Write the buffer and update the position
- result = write (file->handle, data, (fs_offset_t)datasize);
+ // LordHavoc: to hush a warning about passing size_t to an unsigned int parameter on Win64 we do this as multiple writes if the size would be too big for an integer (we never write that big in one go, but it's a theory)
+ while (written < (fs_offset_t)datasize)
+ {
+ // figure out how much to write in one chunk
+ fs_offset_t maxchunk = 1<<30; // 1 GiB
+ int chunk = (int)min((fs_offset_t)datasize - written, maxchunk);
+ int result = (int)write (file->handle, (const unsigned char *)data + written, chunk);
+ // if at least some was written, add it to our accumulator
+ if (result > 0)
+ written += result;
+ // if the result is not what we expected, consider the write to be incomplete
+ if (result != chunk)
+ break;
+ }
file->position = lseek (file->handle, 0, SEEK_CUR);
if (file->real_length < file->position)
file->real_length = file->position;
- if (result < 0)
- return 0;
-
- return result;
+ // note that this will never be less than 0 even if the write failed
+ return written;
}
searchpath_t *sp = FS_FindFile(filename, &index, true);
if(sp && sp->pack)
return sp->pack->shortname;
+ else if(sp)
+ return "";
else
return 0;
}
}
strm.next_in = (unsigned char*)data;
- strm.avail_in = size;
+ strm.avail_in = (unsigned int)size;
tmp = (unsigned char *) Mem_Alloc(tempmempool, size);
if(!tmp)
}
strm.next_out = tmp;
- strm.avail_out = size;
+ strm.avail_out = (unsigned int)size;
if(qz_deflate(&strm, Z_FINISH) != Z_STREAM_END)
{
}
strm.next_in = (unsigned char*)data;
- strm.avail_in = size;
+ strm.avail_in = (unsigned int)size;
do
{