Index: head/games/openbor/files/patch-openbor.c =================================================================== --- head/games/openbor/files/patch-openbor.c (revision 474048) +++ head/games/openbor/files/patch-openbor.c (revision 474049) @@ -1,65 +1,65 @@ Fix potential crashes found by ASan/Clang/GCC Fix an infinite loop in lcmScriptDeleteMain() ---- openbor.c.orig 2017-04-22 14:20:08 UTC +--- openbor.c.orig 2018-07-06 15:13:16 UTC +++ openbor.c -@@ -5747,17 +5747,17 @@ s_collision_attack *collision_alloc_attack_instance(s_ +@@ -6259,17 +6259,17 @@ s_collision_attack *collision_alloc_attack_instance(s_ // // Allocate an empty collision attack list. s_collision_attack **collision_alloc_attack_list() { s_collision_attack **result; size_t alloc_size; // Get amount of memory we'll need. - alloc_size = sizeof(*result); + alloc_size = max_collisons * sizeof(*result); // Allocate memory and get pointer. result = malloc(alloc_size); // Make sure the list is blank. memset(result, 0, alloc_size); // return result. -@@ -5796,17 +5796,17 @@ s_collision_body *collision_alloc_body_instance(s_coll +@@ -6308,17 +6308,17 @@ s_collision_body *collision_alloc_body_instance(s_coll // // Allocate an empty collision attack list. s_collision_body **collision_alloc_body_list() { s_collision_body **result; size_t alloc_size; // Get amount of memory we'll need. - alloc_size = sizeof(*result); + alloc_size = max_collisons * sizeof(*result); // Allocate memory and get pointer. result = malloc(alloc_size); // Make sure the list is blank. memset(result, 0, alloc_size); // return result. -@@ -8204,7 +8204,8 @@ size_t lcmScriptCopyBuffer(ArgList *argl +@@ -8743,7 +8743,8 @@ size_t lcmScriptCopyBuffer(ArgList *arglist, char *buf size_t lcmScriptDeleteMain(char **buf) { - size_t len = 0, i = 0; + size_t len = 0; + long i = 0; ptrdiff_t pos = 0; char *newbuf = NULL; -@@ -15210,6 +15210,11 @@ void bar(int x, int y, int value, int ma +@@ -15920,6 +15921,11 @@ void bar(int x, int y, int value, int maxvalue, s_bars + else + { return; - } - ++ } ++ + if (value < 0) + { + value = 0; -+ } -+ + } + if (value > maxvalue) - { - value = maxvalue; Index: head/games/openbor/files/patch-sdl_menu.c =================================================================== --- head/games/openbor/files/patch-sdl_menu.c (revision 474048) +++ head/games/openbor/files/patch-sdl_menu.c (revision 474049) @@ -1,13 +1,13 @@ Don't crash with empty Paks/ directory. ---- sdl/menu.c.orig 2015-04-18 21:21:56 UTC +--- sdl/menu.c.orig 2018-07-06 15:13:16 UTC +++ sdl/menu.c -@@ -747,7 +747,7 @@ void Menu() +@@ -753,7 +753,7 @@ void Menu() } freeAllLogs(); termMenu(); - if(ctrl == 2) + if(dListTotal == 0 || ctrl == 2) { if (filelist) { Index: head/games/openbor/files/patch-sdl_sdlport.c =================================================================== --- head/games/openbor/files/patch-sdl_sdlport.c (revision 474048) +++ head/games/openbor/files/patch-sdl_sdlport.c (revision 474049) @@ -1,30 +1,30 @@ Store settings under ~/.openbor instead of current directory ---- sdl/sdlport.c.orig 2015-04-18 21:21:56 UTC +--- sdl/sdlport.c.orig 2018-07-06 15:13:16 UTC +++ sdl/sdlport.c @@ -11,6 +11,8 @@ #include "ram.h" #include "video.h" #include "menu.h" +#include +#include #include #include -@@ -103,6 +105,16 @@ int main(int argc, char *argv[]) - #ifdef ANDROID +@@ -135,6 +137,16 @@ int main(int argc, char *argv[]) + } dirExists(rootDir, 1); chdir(rootDir); +#else + if(!getenv("OPENBOR_USE_CURDIR")) + { + if (chdir(getenv("HOME")) != 0) + err(1, "cannot cd to $HOME"); + if (mkdir(".openbor", 0755) != 0 && errno != EEXIST) + err(1, "cannot mkdir $HOME/.openbor"); + if (chdir(".openbor") != 0) + err(1, "cannot cd to $HOME/.openbor"); + } #endif + dirExists(paksDir, 1); - dirExists(savesDir, 1); Index: head/games/openbor/files/patch-source_gamelib_packfile.c =================================================================== --- head/games/openbor/files/patch-source_gamelib_packfile.c (revision 474048) +++ head/games/openbor/files/patch-source_gamelib_packfile.c (revision 474049) @@ -1,23 +1,23 @@ Reset seek position for BGM with more than 128 tracks Don't crash with more than 256 tracks. ---- source/gamelib/packfile.c.orig 2018-02-19 15:02:50 UTC +--- source/gamelib/packfile.c.orig 2018-07-06 15:13:16 UTC +++ source/gamelib/packfile.c -@@ -1408,7 +1408,7 @@ void packfile_music_read(fileliststruct *filelist, int +@@ -1407,7 +1407,7 @@ void packfile_music_read(fileliststruct *filelist, int getBasePath(packfile, filelist[i].filename, 1); if(stristr(packfile, ".pak")) { - memset(filelist[i].bgmTracks, 0, PACKFILE_PATH_MAX); + memset(filelist[i].bgmTracks, 0, sizeof(filelist[i].bgmTracks)); filelist[i].nTracks = 0; fd = fopen(packfile, "rb"); if(fd == NULL) -@@ -1440,7 +1440,7 @@ void packfile_music_read(fileliststruct *filelist, int +@@ -1439,7 +1439,7 @@ void packfile_music_read(fileliststruct *filelist, int { goto nextpak; } - if(filelist[i].nTracks < PACKFILE_PATH_MAX) + if(filelist[i].nTracks < 256) { packfile_get_titlename(pn.namebuf, filelist[i].bgmFileName[filelist[i].nTracks]); filelist[i].bgmTracks[filelist[i].nTracks] = off; Index: head/games/openbor/files/patch-source_ramlib_ram.c =================================================================== --- head/games/openbor/files/patch-source_ramlib_ram.c (revision 474048) +++ head/games/openbor/files/patch-source_ramlib_ram.c (revision 474049) @@ -1,189 +1,189 @@ Implement Linux-like memory stats for BSDs ---- source/ramlib/ram.c.orig 2017-04-22 14:20:08 UTC +--- source/ramlib/ram.c.orig 2018-07-06 15:13:16 UTC +++ source/ramlib/ram.c @@ -25,6 +25,21 @@ #include #include #include +#elif defined(__DragonFly__) || defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) +#include +#include +#include +# if defined(__DragonFly__) +#include // struct kinfo_proc +#include // struct vmstats +# elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#include // struct kinfo_proc +# elif defined(__NetBSD__) +#include // struct uvmexp_sysctl +# elif defined(__OpenBSD__) +#include // struct uvmexp +# endif #elif LINUX #include #include @@ -48,7 +63,10 @@ static u64 systemRam = 0x00000000; -#if !(defined(WIN) || defined(LINUX) || defined(DARWIN)) +#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || \ + defined(__DragonFly__) || defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || defined(__NetBSD__) || \ + defined(__OpenBSD__)) static unsigned long elfOffset = 0x00000000; static unsigned long stackSize = 0x00000000; #endif -@@ -56,7 +74,10 @@ static unsigned long stackSize = 0x00000 +@@ -56,7 +74,10 @@ static unsigned long stackSize = 0x00000000; ///////////////////////////////////////////////////////////////////////////// // Symbols -#if !(defined(WIN) || defined(LINUX) || defined(DARWIN)) +#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || \ + defined(__DragonFly__) || defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || defined(__NetBSD__) || \ + defined(__OpenBSD__)) #if (__GNUC__ > 3) extern unsigned long _end; extern unsigned long _start; @@ -93,6 +114,48 @@ u64 getFreeRam(int byte_size) return 0; } return (u64)(((vms.inactive_count + vms.free_count) * size) / byte_size); +#elif defined(__DragonFly__) + struct vmstats vms; + size_t sz = sizeof(vms); + if (sysctlbyname("vm.vmstats", &vms, &sz, NULL, 0)) + { + return 0; + } + return (u64)((vms.v_free_count + vms.v_inactive_count + + vms.v_cache_count) * getpagesize()) / byte_size; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + u_int v_free_count = 0, v_inactive_count = 0, v_cache_count = 0; + size_t sz = sizeof(u_int); + sysctlbyname("vm.stats.vm.v_free_count", + &v_free_count, &sz, NULL, 0); + sysctlbyname("vm.stats.vm.v_inactive_count", + &v_inactive_count, &sz, NULL, 0); + sysctlbyname("vm.stats.vm.v_cache_count", + &v_cache_count, &sz, NULL, 0); + return (u64)((v_free_count + v_inactive_count + v_cache_count) + * getpagesize()) / byte_size; +#elif defined(__NetBSD__) || defined(__OpenBSD__) +# if defined(__NetBSD__) +#undef VM_UVMEXP +#define VM_UVMEXP VM_UVMEXP2 +#define uvmexp uvmexp_sysctl +# else +#define filepages vnodepages +#define execpages vtextpages +# endif + int mib[] = { + CTL_VM, + VM_UVMEXP, + }; + u_int miblen = sizeof(mib) / sizeof(mib[0]); + struct uvmexp uvmexp; + size_t sz = sizeof(uvmexp); + if (sysctl(mib, miblen, &uvmexp, &sz, NULL, 0)) + { + return 0; + } + return (u64)((uvmexp.free + uvmexp.inactive + uvmexp.filepages + + uvmexp.execpages) * uvmexp.pagesize) / byte_size; #elif LINUX struct sysinfo info; sysinfo(&info); -@@ -133,11 +197,29 @@ void setSystemRam() +@@ -133,11 +196,29 @@ void setSystemRam() stat.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&stat); systemRam = stat.ullTotalPhys; -#elif DARWIN - u64 mem; - size_t len = sizeof(mem); - sysctlbyname("hw.memsize", &mem, &len, NULL, 0); - systemRam = mem; +#elif defined(DARWIN) || defined(__DragonFly__) || defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) +# if defined(HW_MEMSIZE) || defined(HW_PHYSMEM64) + uint64_t physmem; +# else + u_long physmem; +# endif + int mib[] = { + CTL_HW, +# if defined(HW_MEMSIZE) + HW_MEMSIZE, +# elif defined(HW_PHYSMEM64) + HW_PHYSMEM64, +# else + HW_PHYSMEM, +# endif + }; + size_t sz = sizeof(physmem); + if (sysctl(mib, 2, &physmem, &sz, NULL, 0)) + { + physmem = 0; + } + systemRam = physmem; #elif LINUX struct sysinfo info; sysinfo(&info); -@@ -183,7 +265,10 @@ void setSystemRam() +@@ -183,7 +264,10 @@ void setSystemRam() stackSize = 0x00000000; systemRam = getFreeRam(BYTES); #endif -#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || defined(SYMBIAN) || defined(VITA)) +#if !(defined(WIN) || defined(LINUX) || defined(DARWIN) || defined(SYMBIAN) || defined(VITA) || \ + defined(__DragonFly__) || defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || defined(__NetBSD__) || \ + defined(__OpenBSD__)) stackSize = (int)&_end - (int)&_start + ((int)&_start - elfOffset); #endif getRamStatus(BYTES); -@@ -212,6 +297,42 @@ u64 getUsedRam(int byte_size) +@@ -215,6 +299,42 @@ u64 getUsedRam(int byte_size) return 0; } return info.resident_size / byte_size; +#elif defined(__DragonFly__) || defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) +# if defined(__NetBSD__) +#undef KERN_PROC +#define KERN_PROC KERN_PROC2 +#define KINFO_PROC struct kinfo_proc2 +# else +#define KINFO_PROC struct kinfo_proc +# endif +# if defined(__DragonFly__) +#define KP_RSS(kp) (kp.kp_vm_rssize * getpagesize()) +# elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#define KP_RSS(kp) (kp.ki_rssize * getpagesize()) +# elif defined(__NetBSD__) +#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize()) +# elif defined(__OpenBSD__) +#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize()) +# endif + int mib[] = { + CTL_KERN, + KERN_PROC, + KERN_PROC_PID, + getpid(), +# if defined(__NetBSD__) || defined(__OpenBSD__) + sizeof(KINFO_PROC), + 1, +# endif + }; + u_int miblen = sizeof(mib) / sizeof(mib[0]); + KINFO_PROC kp; + size_t sz = sizeof(KINFO_PROC); + if (sysctl(mib, miblen, &kp, &sz, NULL, 0)) + { + return 0; + } + return (u64)KP_RSS(kp) / byte_size; #elif LINUX unsigned long vm = 0; FILE *file = fopen("/proc/self/statm", "r"); Index: head/games/openbor/files/patch-source_utils.c =================================================================== --- head/games/openbor/files/patch-source_utils.c (revision 474048) +++ head/games/openbor/files/patch-source_utils.c (revision 474049) @@ -1,19 +1,19 @@ source/utils.c:303:54: error: implicit declaration of function 'mallinfo' is invalid in C99 [-Werror,-Wimplicit-function-declaration] writeToLogFile("Memory usage at exit: %u\n", mallinfo().arena); ^ source/utils.c:303:64: error: member reference base type 'int' is not a structure or union writeToLogFile("Memory usage at exit: %u\n", mallinfo().arena); ~~~~~~~~~~^~~~~~ ---- source/utils.c.orig 2017-04-22 14:20:08 UTC +--- source/utils.c.orig 2018-07-06 15:13:16 UTC +++ source/utils.c -@@ -299,7 +299,7 @@ void *checkAlloc(void *ptr, size_t size, const char *f +@@ -303,7 +303,7 @@ void *checkAlloc(void *ptr, size_t size, const char *f "\n* Shutting Down *\n\n"); writeToLogFile("Out of memory!\n"); writeToLogFile("Allocation of size %i failed in function '%s' at %s:%i.\n", size, func, file, line); -#ifndef WIN +#if defined(__GLIBC__) || defined(ANDROID) || defined(VITA) writeToLogFile("Memory usage at exit: %u\n", mallinfo().arena); #endif - exit(2); + borExit(2);