Mercurial > hg > early-roguelike
comparison urogue/mdport.c @ 256:c495a4f288c6
Import UltraRogue from the Roguelike Restoration Project (r1490)
| author | John "Elwin" Edwards |
|---|---|
| date | Tue, 31 Jan 2017 19:56:04 -0500 |
| parents | |
| children | 7a96fede6cc8 |
comparison
equal
deleted
inserted
replaced
| 253:d9badb9c0179 | 256:c495a4f288c6 |
|---|---|
| 1 /* | |
| 2 mdport.c - Machine Dependent Code for Porting Unix/Curses games | |
| 3 | |
| 4 Copyright (C) 2005 Nicholas J. Kisseberth | |
| 5 All rights reserved. | |
| 6 | |
| 7 Redistribution and use in source and binary forms, with or without | |
| 8 modification, are permitted provided that the following conditions | |
| 9 are met: | |
| 10 1. Redistributions of source code must retain the above copyright | |
| 11 notice, this list of conditions and the following disclaimer. | |
| 12 2. Redistributions in binary form must reproduce the above copyright | |
| 13 notice, this list of conditions and the following disclaimer in the | |
| 14 documentation and/or other materials provided with the distribution. | |
| 15 3. Neither the name(s) of the author(s) nor the names of other contributors | |
| 16 may be used to endorse or promote products derived from this software | |
| 17 without specific prior written permission. | |
| 18 | |
| 19 THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS ``AS IS'' AND | |
| 20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 22 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE | |
| 23 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 24 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| 25 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| 26 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| 27 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 28 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 29 SUCH DAMAGE. | |
| 30 */ | |
| 31 | |
| 32 #if defined(_WIN32) | |
| 33 #include <Windows.h> | |
| 34 #include <Lmcons.h> | |
| 35 #include <process.h> | |
| 36 #pragma warning( disable: 4201 ) | |
| 37 #include <shlobj.h> | |
| 38 #pragma warning( default: 4201 ) | |
| 39 #include <conio.h> | |
| 40 #include <sys/types.h> | |
| 41 #include <io.h> | |
| 42 #undef MOUSE_MOVED | |
| 43 #elif defined(__DJGPP__) | |
| 44 #include <process.h> | |
| 45 #else | |
| 46 #include <pwd.h> | |
| 47 #include <sys/utsname.h> | |
| 48 #include <unistd.h> | |
| 49 #include <utmpx.h> | |
| 50 #endif | |
| 51 | |
| 52 #include <stdlib.h> | |
| 53 #include <string.h> | |
| 54 | |
| 55 #if defined(_WIN32) && !defined(__MINGW32__) | |
| 56 #define PATH_MAX MAX_PATH | |
| 57 #endif | |
| 58 | |
| 59 #include <curses.h> | |
| 60 | |
| 61 #if defined(__INTERIX) || defined(__MSYS__) | |
| 62 #include <term.h> | |
| 63 #else | |
| 64 #ifdef NCURSES_VERSION | |
| 65 #include <ncurses/term.h> | |
| 66 #endif | |
| 67 #endif | |
| 68 | |
| 69 #include <stdio.h> | |
| 70 #include <fcntl.h> | |
| 71 #include <limits.h> | |
| 72 #include <sys/stat.h> | |
| 73 #include <signal.h> | |
| 74 | |
| 75 #define MOD_MOVE(c) (toupper(c) ) | |
| 76 | |
| 77 void | |
| 78 md_init() | |
| 79 { | |
| 80 #ifdef __INTERIX | |
| 81 char *term; | |
| 82 | |
| 83 term = getenv("TERM"); | |
| 84 | |
| 85 if (term == NULL) | |
| 86 setenv("TERM","interix"); | |
| 87 #endif | |
| 88 #if defined(__DJGPP__) || defined(_WIN32) | |
| 89 _fmode = _O_BINARY; | |
| 90 #endif | |
| 91 #if defined(__CYGWIN__) || defined(__MSYS__) | |
| 92 ESCDELAY=250; | |
| 93 #endif | |
| 94 } | |
| 95 | |
| 96 int | |
| 97 md_hasclreol() | |
| 98 { | |
| 99 #ifndef attron | |
| 100 return(!CE); | |
| 101 #elif !defined(__PDCURSES__) | |
| 102 return(clr_eol != NULL); | |
| 103 #else | |
| 104 return(TRUE); | |
| 105 #endif | |
| 106 } | |
| 107 | |
| 108 #ifdef attron | |
| 109 # define _puts(s) tputs(s, 0, md_putchar); | |
| 110 # define SO enter_standout_mode | |
| 111 # define SE exit_standout_mode | |
| 112 #endif | |
| 113 | |
| 114 void | |
| 115 md_putchar(int c) | |
| 116 { | |
| 117 putchar(c); | |
| 118 } | |
| 119 | |
| 120 static int md_standout_mode = 0; | |
| 121 | |
| 122 void | |
| 123 md_raw_standout() | |
| 124 { | |
| 125 #ifdef _WIN32 | |
| 126 CONSOLE_SCREEN_BUFFER_INFO csbiInfo; | |
| 127 HANDLE hStdout; | |
| 128 WORD fgattr,bgattr; | |
| 129 | |
| 130 if (md_standout_mode == 0) | |
| 131 { | |
| 132 hStdout = GetStdHandle(STD_OUTPUT_HANDLE); | |
| 133 GetConsoleScreenBufferInfo(hStdout, &csbiInfo); | |
| 134 fgattr = (csbiInfo.wAttributes & 0xF); | |
| 135 bgattr = (csbiInfo.wAttributes & 0xF0); | |
| 136 SetConsoleTextAttribute(hStdout,(fgattr << 4) | (bgattr >> 4)); | |
| 137 md_standout_mode = 1; | |
| 138 } | |
| 139 #elif !defined(__PDCURSES__) | |
| 140 _puts(SO); | |
| 141 fflush(stdout); | |
| 142 #endif | |
| 143 } | |
| 144 | |
| 145 void | |
| 146 md_raw_standend() | |
| 147 { | |
| 148 #ifdef _WIN32 | |
| 149 CONSOLE_SCREEN_BUFFER_INFO csbiInfo; | |
| 150 HANDLE hStdout; | |
| 151 WORD fgattr,bgattr; | |
| 152 | |
| 153 if (md_standout_mode == 1) | |
| 154 { | |
| 155 hStdout = GetStdHandle(STD_OUTPUT_HANDLE); | |
| 156 GetConsoleScreenBufferInfo(hStdout, &csbiInfo); | |
| 157 fgattr = (csbiInfo.wAttributes & 0xF); | |
| 158 bgattr = (csbiInfo.wAttributes & 0xF0); | |
| 159 SetConsoleTextAttribute(hStdout,(fgattr << 4) | (bgattr >> 4)); | |
| 160 md_standout_mode = 0; | |
| 161 } | |
| 162 #elif !defined(__PDCURSES__) | |
| 163 _puts(SE); | |
| 164 fflush(stdout); | |
| 165 #endif | |
| 166 } | |
| 167 | |
| 168 int | |
| 169 md_unlink_open_file(char *file, int inf) | |
| 170 { | |
| 171 #ifdef _WIN32 | |
| 172 _close(inf); | |
| 173 _chmod(file, 0600); | |
| 174 return( _unlink(file) ); | |
| 175 #else | |
| 176 return(unlink(file)); | |
| 177 #endif | |
| 178 } | |
| 179 | |
| 180 int | |
| 181 md_unlink(char *file) | |
| 182 { | |
| 183 #ifdef _WIN32 | |
| 184 _chmod(file, 0600); | |
| 185 return( _unlink(file) ); | |
| 186 #else | |
| 187 return(unlink(file)); | |
| 188 #endif | |
| 189 } | |
| 190 | |
| 191 int | |
| 192 md_creat(char *file, int mode) | |
| 193 { | |
| 194 int fd; | |
| 195 #ifdef _WIN32 | |
| 196 mode = _S_IREAD | _S_IWRITE; | |
| 197 fd = _open(file,O_CREAT | O_EXCL | O_WRONLY, mode); | |
| 198 #else | |
| 199 fd = open(file,O_CREAT | O_EXCL | O_WRONLY, mode); | |
| 200 #endif | |
| 201 | |
| 202 return(fd); | |
| 203 } | |
| 204 | |
| 205 | |
| 206 void | |
| 207 md_normaluser() | |
| 208 { | |
| 209 #ifndef _WIN32 | |
| 210 setuid(getuid()); | |
| 211 setgid(getgid()); | |
| 212 #endif | |
| 213 } | |
| 214 | |
| 215 int | |
| 216 md_getuid() | |
| 217 { | |
| 218 #ifndef _WIN32 | |
| 219 return( getuid() ); | |
| 220 #else | |
| 221 return(42); | |
| 222 #endif | |
| 223 } | |
| 224 | |
| 225 char * | |
| 226 md_getusername(int uid) | |
| 227 { | |
| 228 static char login[80]; | |
| 229 char *l = NULL; | |
| 230 #ifdef _WIN32 | |
| 231 LPSTR mybuffer; | |
| 232 DWORD size = UNLEN + 1; | |
| 233 TCHAR buffer[UNLEN + 1]; | |
| 234 | |
| 235 mybuffer = buffer; | |
| 236 if (uid != md_getuid()) | |
| 237 strcpy(mybuffer, "someone"); | |
| 238 else | |
| 239 GetUserName(mybuffer,&size); | |
| 240 l = mybuffer; | |
| 241 #endif | |
| 242 #if !defined(_WIN32) && !defined(DJGPP) | |
| 243 struct passwd *pw; | |
| 244 | |
| 245 pw = getpwuid(getuid()); | |
| 246 | |
| 247 l = pw->pw_name; | |
| 248 #endif | |
| 249 | |
| 250 if ((l == NULL) || (*l == '\0')) | |
| 251 if ( (l = getenv("USERNAME")) == NULL ) | |
| 252 if ( (l = getenv("LOGNAME")) == NULL ) | |
| 253 if ( (l = getenv("USER")) == NULL ) | |
| 254 l = "nobody"; | |
| 255 | |
| 256 strncpy(login,l,80); | |
| 257 login[79] = 0; | |
| 258 | |
| 259 return(login); | |
| 260 } | |
| 261 | |
| 262 char * | |
| 263 md_gethomedir() | |
| 264 { | |
| 265 static char homedir[PATH_MAX]; | |
| 266 char *h = NULL; | |
| 267 size_t len; | |
| 268 #if defined(_WIN32) | |
| 269 TCHAR szPath[PATH_MAX]; | |
| 270 #endif | |
| 271 #if defined(_WIN32) || defined(DJGPP) | |
| 272 char slash = '\\'; | |
| 273 #else | |
| 274 char slash = '/'; | |
| 275 struct passwd *pw; | |
| 276 pw = getpwuid(getuid()); | |
| 277 | |
| 278 h = pw->pw_dir; | |
| 279 | |
| 280 if (strcmp(h,"/") == 0) | |
| 281 h = NULL; | |
| 282 #endif | |
| 283 homedir[0] = 0; | |
| 284 #ifdef _WIN32 | |
| 285 if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, szPath))) | |
| 286 h = szPath; | |
| 287 #endif | |
| 288 | |
| 289 if ( (h == NULL) || (*h == '\0') ) | |
| 290 if ( (h = getenv("HOME")) == NULL ) | |
| 291 if ( (h = getenv("HOMEDRIVE")) == NULL) | |
| 292 h = ""; | |
| 293 else | |
| 294 { | |
| 295 strncpy(homedir,h,PATH_MAX-1); | |
| 296 homedir[PATH_MAX-1] = 0; | |
| 297 | |
| 298 if ( (h = getenv("HOMEPATH")) == NULL) | |
| 299 h = ""; | |
| 300 } | |
| 301 | |
| 302 | |
| 303 len = strlen(homedir); | |
| 304 strncat(homedir,h,PATH_MAX-len-1); | |
| 305 len = strlen(homedir); | |
| 306 | |
| 307 if ((len > 0) && (homedir[len-1] != slash)) { | |
| 308 homedir[len] = slash; | |
| 309 homedir[len+1] = 0; | |
| 310 } | |
| 311 | |
| 312 return(homedir); | |
| 313 } | |
| 314 | |
| 315 void | |
| 316 md_sleep(int s) | |
| 317 { | |
| 318 #ifdef _WIN32 | |
| 319 Sleep(s); | |
| 320 #else | |
| 321 sleep(s); | |
| 322 #endif | |
| 323 } | |
| 324 | |
| 325 char * | |
| 326 md_getshell() | |
| 327 { | |
| 328 static char shell[PATH_MAX]; | |
| 329 char *s = NULL; | |
| 330 #ifdef _WIN32 | |
| 331 char *def = "C:\\WINDOWS\\SYSTEM32\\CMD.EXE"; | |
| 332 #elif defined(__DJGPP__) | |
| 333 char *def = "C:\\COMMAND.COM"; | |
| 334 #else | |
| 335 char *def = "/bin/sh"; | |
| 336 struct passwd *pw; | |
| 337 pw = getpwuid(getuid()); | |
| 338 s = pw->pw_shell; | |
| 339 #endif | |
| 340 if ((s == NULL) || (*s == '\0')) | |
| 341 if ( (s = getenv("COMSPEC")) == NULL) | |
| 342 if ( (s = getenv("SHELL")) == NULL) | |
| 343 if ( (s = getenv("SystemRoot")) == NULL) | |
| 344 s = def; | |
| 345 | |
| 346 strncpy(shell,s,PATH_MAX); | |
| 347 shell[PATH_MAX-1] = 0; | |
| 348 | |
| 349 return(shell); | |
| 350 } | |
| 351 | |
| 352 int | |
| 353 md_shellescape() | |
| 354 { | |
| 355 #if (!defined(_WIN32) && !defined(__DJGPP__)) | |
| 356 int ret_status; | |
| 357 int pid; | |
| 358 void (*myquit)(int); | |
| 359 void (*myend)(int); | |
| 360 #endif | |
| 361 char *sh; | |
| 362 | |
| 363 sh = md_getshell(); | |
| 364 | |
| 365 #if defined(_WIN32) | |
| 366 return((int)_spawnl(_P_WAIT,sh,"shell",NULL,0)); | |
| 367 #elif defined(__DJGPP__) | |
| 368 return ( spawnl(P_WAIT,sh,"shell",NULL,0) ); | |
| 369 #else | |
| 370 while((pid = fork()) < 0) | |
| 371 sleep(1); | |
| 372 | |
| 373 if (pid == 0) /* Shell Process */ | |
| 374 { | |
| 375 /* | |
| 376 * Set back to original user, just in case | |
| 377 */ | |
| 378 setuid(getuid()); | |
| 379 setgid(getgid()); | |
| 380 execl(sh == NULL ? "/bin/sh" : sh, "shell", "-i", 0); | |
| 381 perror("No shelly"); | |
| 382 _exit(-1); | |
| 383 } | |
| 384 else /* Application */ | |
