Linux fixes:

* zero out file_list in set_file_list if opendir fails
* don't spam perror in file_time_stamp, because it is called with
  files like "*compilation*" that don't exist occasionally, (is this a bug?)
* fix potential bug with opening 0-length files
* clean up some printfs, and make errors go to stderr
This commit is contained in:
insofaras 2016-03-20 21:04:32 +00:00
parent 320874461e
commit 4bdd20f36d
1 changed files with 38 additions and 35 deletions

View File

@ -283,22 +283,19 @@ LinuxStringDup(String* str, void* data, size_t size){
Sys_File_Time_Stamp_Sig(system_file_time_stamp){ Sys_File_Time_Stamp_Sig(system_file_time_stamp){
struct stat info = {}; struct stat info = {};
u64 microsecond_timestamp; u64 microsecond_timestamp = 0;
if(stat(filename, &info) == -1){
perror("system_file_time: stat");
return 0;
}
if(stat(filename, &info) == 0){
#if OLD_STAT_NANO_TIME #if OLD_STAT_NANO_TIME
microsecond_timestamp = microsecond_timestamp =
(info.st_mtime * UINT64_C(1000000)) + (info.st_mtime * UINT64_C(1000000)) +
(info.st_mtimensec / UINT64_C(1000)); (info.st_mtimensec / UINT64_C(1000));
#else #else
microsecond_timestamp = microsecond_timestamp =
(info.st_mtim.tv_sec * UINT64_C(1000000)) + (info.st_mtim.tv_sec * UINT64_C(1000000)) +
(info.st_mtim.tv_nsec / UINT64_C(1000)); (info.st_mtim.tv_nsec / UINT64_C(1000));
#endif #endif
}
LINUX_FN_DEBUG("%s = %" PRIu64, filename, microsecond_timestamp); LINUX_FN_DEBUG("%s = %" PRIu64, filename, microsecond_timestamp);
@ -404,6 +401,12 @@ Sys_Set_File_List_Sig(system_set_file_list){
file_list->count = file_count; file_list->count = file_count;
closedir(d); closedir(d);
} else {
system_free_memory(file_list->block);
file_list->block = 0;
file_list->block_size = 0;
file_list->infos = 0;
file_list->count = 0;
} }
} }
@ -568,7 +571,6 @@ Sys_CLI_Call_Sig(system_cli_call){
exit(1); exit(1);
}; };
//TODO(inso): do spaces in script_name signify multiple args?
char* argv[] = { "sh", "-c", script_name, NULL }; char* argv[] = { "sh", "-c", script_name, NULL };
if(execv("/bin/sh", argv) == -1){ if(execv("/bin/sh", argv) == -1){
@ -822,7 +824,7 @@ FILE_EXISTS_SIG(system_file_exists){
char buff[PATH_MAX] = {}; char buff[PATH_MAX] = {};
if(len + 1 > PATH_MAX){ if(len + 1 > PATH_MAX){
fprintf(stderr, "system_directory_has_file: path too long"); fputs("system_directory_has_file: path too long\n", stderr);
} else { } else {
memcpy(buff, filename, len); memcpy(buff, filename, len);
buff[len] = 0; buff[len] = 0;
@ -894,24 +896,27 @@ Sys_Load_File_Sig(system_load_file){
fd = open(filename, O_RDONLY); fd = open(filename, O_RDONLY);
if(fd < 0){ if(fd < 0){
perror("sys_open_file: open"); fprintf(stderr, "sys_open_file: open '%s': %s\n", filename, strerror(errno));
goto out; goto out;
} }
if(fstat(fd, &info) < 0){ if(fstat(fd, &info) < 0){
perror("sys_open_file: stat"); fprintf(stderr, "sys_open_file: stat '%s': %s\n", filename, strerror(errno));
goto out; goto out;
} }
if(info.st_size <= 0){ if(info.st_size < 0){
printf("st_size < 0: %ld\n", info.st_size); fprintf(stderr, "sys_open_file: st_size < 0: %ld\n", info.st_size);
goto out; goto out;
} }
ptr = (u8*)LinuxGetMemory(info.st_size); // NOTE(inso): add 1 extra byte since malloc(0) can return NULL
ptr = (u8*)LinuxGetMemory(info.st_size + 1);
if(!ptr){ if(!ptr){
puts("null pointer from LGM"); fputs("sys_open_file: null pointer from LGM", stderr);
goto out; goto out;
} }
// NOTE(inso): might as well null terminate with the extra byte
ptr[info.st_size] = 0;
read_ptr = ptr; read_ptr = ptr;
bytes_to_read = info.st_size; bytes_to_read = info.st_size;
@ -948,7 +953,7 @@ Sys_Save_File_Sig(system_save_file){
LINUX_FN_DEBUG("%s %d", filename, size); LINUX_FN_DEBUG("%s %d", filename, size);
if(fd < 0){ if(fd < 0){
perror("system_save_file: open"); fprintf(stderr, "system_save_file: open '%s': %s\n", filename, strerror(errno));
} else { } else {
do { do {
ssize_t written = write(fd, data, size); ssize_t written = write(fd, data, size);
@ -1055,10 +1060,6 @@ LinuxFontConfigGetName(char* approx_name, double pts){
return result; return result;
} }
#endif #endif
// TODO(allen): Implement this. Also where is this
// macro define? Let's try to organize these functions
// a little better now that they're starting to settle
// into their places.
#include "system_shared.cpp" #include "system_shared.cpp"
#include "4ed_rendering.cpp" #include "4ed_rendering.cpp"
@ -1105,7 +1106,7 @@ Font_Load_Sig(system_draw_font_load){
if(success){ if(success){
break; break;
} else { } else {
printf("draw_font_load failed, %d\n", linuxvars.fnt.part.max); fprintf(stderr, "draw_font_load failed, %d\n", linuxvars.fnt.part.max);
LinuxScratchPartitionDouble(&linuxvars.fnt.part); LinuxScratchPartitionDouble(&linuxvars.fnt.part);
} }
} }
@ -1130,13 +1131,13 @@ Sys_To_Binary_Path(system_to_binary_path){
i32 max = out_filename->memory_size; i32 max = out_filename->memory_size;
i32 size = readlink("/proc/self/exe", out_filename->str, max); i32 size = readlink("/proc/self/exe", out_filename->str, max);
LINUX_FN_DEBUG(); LINUX_FN_DEBUG("%d, %d", max, size);
if (size > 0 && size < max-1){ if (size > 0 && size < max-1){
out_filename->size = size; out_filename->size = size;
remove_last_folder(out_filename); remove_last_folder(out_filename);
if (append(out_filename, filename) && terminate_with_null(out_filename)){ if (append(out_filename, filename) && terminate_with_null(out_filename)){
LINUX_FN_DEBUG("%s", out_filename->str); LINUX_FN_DEBUG("%.*s", out_filename->size, out_filename->str);
translate_success = 1; translate_success = 1;
} }
} }
@ -1152,6 +1153,8 @@ LinuxLoadAppCode(){
if (linuxvars.app_code){ if (linuxvars.app_code){
get_funcs = (App_Get_Functions*) get_funcs = (App_Get_Functions*)
dlsym(linuxvars.app_code, "app_get_functions"); dlsym(linuxvars.app_code, "app_get_functions");
} else {
fprintf(stderr, "dlopen failed: %s\n", dlerror());
} }
if (get_funcs){ if (get_funcs){
@ -1367,7 +1370,7 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
char *Renderer = (char *)glGetString(GL_RENDERER); char *Renderer = (char *)glGetString(GL_RENDERER);
char *Version = (char *)glGetString(GL_VERSION); char *Version = (char *)glGetString(GL_VERSION);
//TODO(inso): glGetStringi is required if the GL version is >= 3.0 //TODO(inso): glGetStringi is required in core profile if the GL version is >= 3.0
char *Extensions = (char *)glGetString(GL_EXTENSIONS); char *Extensions = (char *)glGetString(GL_EXTENSIONS);
printf("GL_VENDOR: %s\n", Vendor); printf("GL_VENDOR: %s\n", Vendor);
@ -1375,7 +1378,7 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
printf("GL_VERSION: %s\n", Version); printf("GL_VERSION: %s\n", Version);
// printf("GL_EXTENSIONS: %s\n", Extensions); // printf("GL_EXTENSIONS: %s\n", Extensions);
//TODO(inso): enable vsync if available. this should probably be optional //NOTE(inso): enable vsync if available. this should probably be optional
if(strstr(glxExts, "GLX_EXT_swap_control ")){ if(strstr(glxExts, "GLX_EXT_swap_control ")){
PFNGLXSWAPINTERVALEXTPROC glx_swap_interval_ext = PFNGLXSWAPINTERVALEXTPROC glx_swap_interval_ext =
(PFNGLXSWAPINTERVALEXTPROC) glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalEXT"); (PFNGLXSWAPINTERVALEXTPROC) glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalEXT");
@ -1386,7 +1389,7 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
unsigned int swap_val = 0; unsigned int swap_val = 0;
glXQueryDrawable(XDisplay, XWindow, GLX_SWAP_INTERVAL_EXT, &swap_val); glXQueryDrawable(XDisplay, XWindow, GLX_SWAP_INTERVAL_EXT, &swap_val);
linuxvars.vsync = swap_val == 1; linuxvars.vsync = swap_val == 1;
printf("VSync enabled? %d\n", linuxvars.vsync); printf("VSync enabled? %s.\n", linuxvars.vsync ? "Yes" : "No");
} }
} else if(strstr(glxExts, "GLX_MESA_swap_control ")){ } else if(strstr(glxExts, "GLX_MESA_swap_control ")){
PFNGLXSWAPINTERVALMESAPROC glx_swap_interval_mesa = PFNGLXSWAPINTERVALMESAPROC glx_swap_interval_mesa =
@ -1399,7 +1402,7 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
glx_swap_interval_mesa(1); glx_swap_interval_mesa(1);
if(glx_get_swap_interval_mesa){ if(glx_get_swap_interval_mesa){
linuxvars.vsync = glx_get_swap_interval_mesa(); linuxvars.vsync = glx_get_swap_interval_mesa();
printf("VSync enabled? %d (MESA)\n", linuxvars.vsync); printf("VSync enabled? %s (MESA)\n", linuxvars.vsync ? "Yes" : "No");
} else { } else {
// NOTE(inso): assume it worked? // NOTE(inso): assume it worked?
linuxvars.vsync = 1; linuxvars.vsync = 1;
@ -1653,7 +1656,7 @@ InitializeXInput(Display *dpy, Window XWindow)
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
XSetLocaleModifiers(""); XSetLocaleModifiers("");
printf("is current locale supported?: %d\n", XSupportsLocale()); printf("Supported locale?: %s.\n", XSupportsLocale() ? "Yes" : "No");
// TODO(inso): handle the case where it isn't supported somehow? // TODO(inso): handle the case where it isn't supported somehow?
XSelectInput( XSelectInput(
@ -1858,7 +1861,7 @@ main(int argc, char **argv)
linuxvars.XDisplay = XOpenDisplay(0); linuxvars.XDisplay = XOpenDisplay(0);
if(!linuxvars.XDisplay){ if(!linuxvars.XDisplay){
fprintf(stderr, "Can't open display!"); fprintf(stderr, "Can't open display!\n");
return 1; return 1;
} }
@ -2010,7 +2013,7 @@ main(int argc, char **argv)
} }
if (!window_setup_success){ if (!window_setup_success){
fprintf(stderr, "Error creating window."); fprintf(stderr, "Error creating window.\n");
exit(1); exit(1);
} }