1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc. 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful, 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details. 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Based on sys_linux.c 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <unistd.h> 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <signal.h> 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <stdlib.h> 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <limits.h> 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/time.h> 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/types.h> 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <unistd.h> 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <fcntl.h> 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <stdarg.h> 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <stdio.h> 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// #include <sys/ipc.h> 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// #include <sys/shm.h> 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/stat.h> 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <string.h> 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <ctype.h> 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/wait.h> 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/mman.h> 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <errno.h> 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h" 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint noconinput = 0; 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint nostdout = 0; 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *basedir = "/sdcard/data/quake"; 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *cachedir = "/tmp"; 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t sys_linerefresh = CVAR2("sys_linerefresh","0");// set for entity display 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// ======================================================================= 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// General routines 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// ======================================================================= 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_DebugNumber(int y, int val) 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Printf (char *fmt, ...) 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_list argptr; 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char text[1024]; 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_start (argptr,fmt); 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vsprintf (text,fmt,argptr); 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_end (argptr); 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fprintf(stderr, "%s", text); 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Print (text); 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Printf (char *fmt, ...) 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_list argptr; 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char text[1024], *t_p; 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int l, r; 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (nostdout) 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_start (argptr,fmt); 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vsprintf (text,fmt,argptr); 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_end (argptr); 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich l = strlen(text); 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t_p = text; 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// make sure everything goes through, even though we are non-blocking 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich while (l) 93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r = write (1, text, l); 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (r != l) 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sleep (0); 97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (r > 0) 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t_p += r; 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich l -= r; 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Printf (char *fmt, ...) 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_list argptr; 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char text[2048]; 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char *p; 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_start (argptr,fmt); 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vsprintf (text,fmt,argptr); 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_end (argptr); 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (strlen(text) > sizeof(text)) 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error("memory overwrite in Sys_Printf"); 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (nostdout) 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (p = (unsigned char *)text; *p; p++) 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ((*p > 128 || *p < 32) && *p != 10 && *p != 13 && *p != 9) 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich printf("[%02x]", *p); 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich putc(*p, stdout); 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Quit (void) 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Host_Shutdown(); 133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich printf("Sys_Quit - exiting."); 134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); 135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich exit(0); 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Init(void) 139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if id386 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_SetFPCW(); 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Error (char *error, ...) 146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_list argptr; 148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char string[1024]; 149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// change stdin to non blocking 151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_start (argptr,error); 154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vsprintf (string,error,argptr); 155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_end (argptr); 156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fprintf(stderr, "Error: %s\n", string); 157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Host_Shutdown (); 159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich printf("Sys_Error - exiting."); 160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich exit (1); 161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Warn (char *warning, ...) 165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_list argptr; 167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char string[1024]; 168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_start (argptr,warning); 170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vsprintf (string,warning,argptr); 171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_end (argptr); 172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fprintf(stderr, "Warning: %s", string); 173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSys_FileTime 178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturns -1 if not present 180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileTime (char *path) 183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich struct stat buf; 185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (stat (path,&buf) == -1) 187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return buf.st_mtime; 190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_mkdir (char *path) 194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mkdir (path, 0777); 196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileOpenRead (char *path, int *handle) 199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int h; 201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich struct stat fileinfo; 202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich h = open (path, O_RDONLY, 0666); 205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *handle = h; 206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (h == -1) 207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return -1; 208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (fstat (h,&fileinfo) == -1) 210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("Error fstating %s", path); 211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return fileinfo.st_size; 213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileOpenWrite (char *path) 216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int handle; 218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich umask (0); 220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich handle = open(path,O_RDWR | O_CREAT | O_TRUNC 222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich , 0666); 223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (handle == -1) 225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("Error opening %s: %s", path,strerror(errno)); 226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return handle; 228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileWrite (int handle, void *src, int count) 231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return write (handle, src, count); 233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_FileClose (int handle) 236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich close (handle); 238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_FileSeek (int handle, int position) 241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich lseek (handle, position, SEEK_SET); 243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileRead (int handle, void *dest, int count) 246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return read (handle, dest, count); 248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_DebugLog(char *file, char *fmt, ...) 251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_list argptr; 253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static char data[1024]; 254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int fd; 255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_start(argptr, fmt); 257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vsprintf(data, fmt, argptr); 258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich va_end(argptr); 259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// fd = open(file, O_WRONLY | O_BINARY | O_CREAT | O_APPEND, 0666); 260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fd = open(file, O_WRONLY | O_CREAT | O_APPEND, 0666); 261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich write(fd, data, strlen(data)); 262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich close(fd); 263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_EditFile(char *filename) 266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char cmd[256]; 269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *term; 270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char *editor; 271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich term = getenv("TERM"); 273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (term && !strcmp(term, "xterm")) 274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich editor = getenv("VISUAL"); 276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!editor) 277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich editor = getenv("EDITOR"); 278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!editor) 279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich editor = getenv("EDIT"); 280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!editor) 281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich editor = "vi"; 282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf(cmd, "xterm -e %s %s", editor, filename); 283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich system(cmd); 284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdouble Sys_DoubleTime (void) 289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich struct timeval tp; 291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich struct timezone tzp; 292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static int secbase; 293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich gettimeofday(&tp, &tzp); 295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!secbase) 297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich secbase = tp.tv_sec; 299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return tp.tv_usec/1000000.0; 300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0; 303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// ======================================================================= 306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Sleeps for microseconds 307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// ======================================================================= 308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic volatile int oktogo; 310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid alarm_handler(int x) 312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich oktogo=1; 314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_LineRefresh(void) 317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid floating_point_exception_handler(int whatever) 321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Sys_Warn("floating point exception\n"); 323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich signal(SIGFPE, floating_point_exception_handler); 324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *Sys_ConsoleInput(void) 327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static char text[256]; 330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int len; 331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (cls.state == ca_dedicated) { 333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich len = read (0, text, sizeof(text)); 334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (len < 1) 335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich text[len-1] = 0; // rip off the /n and terminate 337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return text; 339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if !id386 345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_HighFPPrecision (void) 346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_LowFPPrecision (void) 350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint skipframes; 355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// The following APIs are called from the Java activity 357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint gAndroidQuitting = 0; 359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdouble g_oldtime; 361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern int scr_width; 363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern int scr_height; 364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid AndroidInit(int width, int height) 366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich quakeparms_t parms; 368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int j; 369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int c = 0; 370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char* v[] = {"quake", (char*) 0}; 371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich scr_width = width; 373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich scr_height = height; 374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// static char cwd[1024]; 376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// signal(SIGFPE, floating_point_exception_handler); 378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// signal(SIGFPE, SIG_IGN); 379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memset(&parms, 0, sizeof(parms)); 381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich COM_InitArgv(c, v); 383cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich parms.argc = com_argc; 384cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich parms.argv = com_argv; 385cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 386cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich parms.memsize = 16*1024*1024; 387cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 388cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich j = COM_CheckParm("-mem"); 389cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (j) 390cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich parms.memsize = (int) (Q_atof(com_argv[j+1]) * 1024 * 1024); 391cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich parms.membase = malloc (parms.memsize); 392cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich parms.basedir = basedir; 394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// caching is disabled by default, use -cachedir to enable 395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// parms.cachedir = cachedir; 396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 // FNDELAY not implemented 398cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich noconinput = COM_CheckParm("-noconinput"); 399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!noconinput) 400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); 401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (COM_CheckParm("-nostdout")) 404cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich nostdout = 1; 405cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 406cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Init(); 407cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Host_Init(&parms); 409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich g_oldtime = Sys_DoubleTime (); 411cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 413cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid AndroidStep() 414cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 415cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich double time, newtime; 416cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // find time spent rendering last frame 417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newtime = Sys_DoubleTime (); 418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich time = newtime - g_oldtime; 419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Host_Frame(time); 421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich g_oldtime = newtime; 422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidQuiting() 425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return gAndroidQuitting; 427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 428