Mercurial > hg > early-roguelike
annotate srogue/mdport.c @ 191:fb25a62680c7
srogue: clean up configuration in mdport.c.
curses.h is already included in rogue.h and doesn't need to be included
twice more in mdport.c.
Also set flags for some features when they are present.
author | John "Elwin" Edwards |
---|---|
date | Mon, 03 Aug 2015 17:16:42 -0400 |
parents | f4f6734771e0 |
children | 3d4252fa2ed3 |
rev | line source |
---|---|
86 | 1 /* |
2 mdport.c - Machine Dependent Code | |
3 | |
4 Copyright (C) 2005-2008 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 #include <stdlib.h> | |
33 #include <string.h> | |
34 | |
35 #if defined(_WIN32) | |
36 #include <Windows.h> | |
37 #include <Lmcons.h> | |
38 #include <io.h> | |
39 #include <conio.h> | |
40 #pragma warning( disable: 4201 ) | |
41 #include <shlobj.h> | |
42 #pragma warning( default: 4201 ) | |
43 #include <Shlwapi.h> | |
44 #undef MOUSE_MOVED | |
191
fb25a62680c7
srogue: clean up configuration in mdport.c.
John "Elwin" Edwards
parents:
190
diff
changeset
|
45 #define HAVE_PROCESS_H |
86 | 46 #endif |
47 | |
118 | 48 #include "rogue.h" |
49 | |
50 #if defined(HAVE_SYS_TYPES) | |
86 | 51 #include <sys/types.h> |
118 | 52 #endif |
53 | |
54 #if defined(HAVE_PROCESS_H) | |
55 #include <process.h> | |
56 #endif | |
57 | |
58 #if defined(HAVE_PWD_H) | |
59 #include <pwd.h> | |
60 #endif | |
61 | |
62 #if defined(HAVE_SYS_UTSNAME) | |
63 #include <sys/utsname.h> | |
64 #endif | |
65 | |
66 #if defined(HAVE_ARPA_INET_H) | |
67 #include <arpa/inet.h> /* Solaris 2.8 required this for htonl() and ntohl() */ | |
68 #endif | |
69 | |
70 #if defined(HAVE_TERMIOS_H) | |
71 #include <termios.h> | |
72 #endif | |
73 | |
74 #if defined(HAVE_UNISTD_H) | |
75 #ifndef __USE_GNU | |
76 #define __USE_GNU | |
77 #include <unistd.h> | |
78 #undef __USE_GNU | |
79 #else | |
80 #include <unistd.h> | |
81 #endif | |
82 #endif | |
86 | 83 |
118 | 84 #if defined(HAVE_TERM_H) |
85 #include <term.h> | |
86 #elif defined(HAVE_NCURSES_TERM_H) | |
87 #include <ncurses/term.h> | |
88 #endif | |
89 | |
90 #if defined(HAVE_WORKING_FORK) | |
91 #include <sys/wait.h> | |
92 #endif | |
93 | |
86 | 94 #include <ctype.h> |
118 | 95 #include <fcntl.h> |
96 #include <limits.h> | |
97 #include <sys/stat.h> | |
98 #include <signal.h> | |
99 | |
100 #if !defined(PATH_MAX) && defined(_MAX_PATH) | |
101 #define PATH_MAX _MAX_PATH | |
102 #endif | |
103 | |
104 #if !defined(PATH_MAX) && defined(_PATH_MAX) | |
105 #define PATH_MAX _PATH_MAX | |
106 #endif | |
107 | |
108 #define NOOP(x) (x += 0) | |
109 | |
110 void | |
111 md_init(void) | |
112 { | |
113 #if defined(__INTERIX) | |
114 char *term; | |
115 | |
116 term = getenv("TERM"); | |
117 | |
118 if (term == NULL) | |
119 setenv("TERM","interix"); | |
120 #elif defined(__DJGPP__) | |
121 _fmode = _O_BINARY; | |
122 #elif defined(_WIN32) | |
123 _fmode = _O_BINARY; | |
124 #endif | |
125 | |
126 #if defined(HAVE_ESCDELAY) || defined(NCURSES_VERSION) | |
127 ESCDELAY=64; | |
128 #endif | |
129 | |
130 #if defined(DUMP) | |
131 md_onsignal_default(); | |
132 #else | |
133 md_onsignal_exit(); | |
134 #endif | |
135 } | |
136 | |
137 void | |
138 md_onsignal_default(void) | |
139 { | |
140 #ifdef SIGHUP | |
141 signal(SIGHUP, SIG_DFL); | |
142 #endif | |
143 #ifdef SIGQUIT | |
144 signal(SIGQUIT, SIG_DFL); | |
145 #endif | |
146 #ifdef SIGILL | |
147 signal(SIGILL, SIG_DFL); | |
148 #endif | |
149 #ifdef SIGTRAP | |
150 signal(SIGTRAP, SIG_DFL); | |
151 #endif | |
152 #ifdef SIGIOT | |
153 signal(SIGIOT, SIG_DFL); | |
154 #endif | |
155 #ifdef SIGEMT | |
156 signal(SIGEMT, SIG_DFL); | |
157 #endif | |
158 #ifdef SIGFPE | |
159 signal(SIGFPE, SIG_DFL); | |
160 #endif | |
161 #ifdef SIGBUS | |
162 signal(SIGBUS, SIG_DFL); | |
163 #endif | |
164 #ifdef SIGSEGV | |
165 signal(SIGSEGV, SIG_DFL); | |
166 #endif | |
167 #ifdef SIGSYS | |
168 signal(SIGSYS, SIG_DFL); | |
169 #endif | |
170 #ifdef SIGTERM | |
171 signal(SIGTERM, SIG_DFL); | |
172 #endif | |
173 } | |
174 | |
175 void | |
176 md_onsignal_exit(void) | |
177 { | |
178 #ifdef SIGHUP | |
179 signal(SIGHUP, SIG_DFL); | |
180 #endif | |
181 #ifdef SIGQUIT | |
182 signal(SIGQUIT, exit); | |
183 #endif | |
184 #ifdef SIGILL | |
185 signal(SIGILL, exit); | |
186 #endif | |
187 #ifdef SIGTRAP | |
188 signal(SIGTRAP, exit); | |
189 #endif | |
190 #ifdef SIGIOT | |
191 signal(SIGIOT, exit); | |
192 #endif | |
193 #ifdef SIGEMT | |
194 signal(SIGEMT, exit); | |
195 #endif | |
196 #ifdef SIGFPE | |
197 signal(SIGFPE, exit); | |
198 #endif | |
199 #ifdef SIGBUS | |
200 signal(SIGBUS, exit); | |
201 #endif | |
202 #ifdef SIGSEGV | |
203 signal(SIGSEGV, exit); | |
204 #endif | |
205 #ifdef SIGSYS | |
206 signal(SIGSYS, exit); | |
207 #endif | |
208 #ifdef SIGTERM | |
209 signal(SIGTERM, exit); | |
210 #endif | |
119 | 211 #ifdef SIGINT |
212 signal(SIGINT, exit); | |
213 #endif | |
118 | 214 } |
215 | |
216 extern void auto_save(int sig); | |
217 extern void endit(int sig); | |
218 extern void quit(int sig); | |
219 | |
220 void | |
221 md_onsignal_autosave(void) | |
222 { | |
223 | |
224 #ifdef SIGHUP | |
225 signal(SIGHUP, auto_save); | |
226 #endif | |
227 #ifdef SIGQUIT | |
228 signal(SIGQUIT, endit); | |
229 #endif | |
230 #ifdef SIGILL | |
231 signal(SIGILL, auto_save); | |
232 #endif | |
233 #ifdef SIGTRAP | |
234 signal(SIGTRAP, auto_save); | |
235 #endif | |
236 #ifdef SIGIOT | |
237 signal(SIGIOT, auto_save); | |
238 #endif | |
239 #ifdef SIGEMT | |
240 signal(SIGEMT, auto_save); | |
241 #endif | |
242 #ifdef SIGFPE | |
243 signal(SIGFPE, auto_save); | |
244 #endif | |
245 #ifdef SIGBUS | |
246 signal(SIGBUS, auto_save); | |
247 #endif | |
248 #ifdef SIGSEGV | |
249 signal(SIGSEGV, auto_save); | |
250 #endif | |
251 #ifdef SIGSYS | |
252 signal(SIGSYS, auto_save); | |
253 #endif | |
254 #ifdef SIGTERM | |
255 signal(SIGTERM, auto_save); | |
256 #endif | |
257 #ifdef SIGINT | |
258 signal(SIGINT, quit); | |
259 #endif | |
260 } | |
261 | |
262 int | |
263 md_hasclreol(void) | |
264 { | |
265 #if defined(clr_eol) | |
266 #ifdef NCURSES_VERSION | |
267 if (cur_term == NULL) | |
268 return(0); | |
269 if (cur_term->type.Strings == NULL) | |
270 return(0); | |
271 #endif | |
272 return((clr_eol != NULL) && (*clr_eol != 0)); | |
273 #elif defined(__PDCURSES__) | |
274 return(TRUE); | |
275 #else | |
276 return((CE != NULL) && (*CE != 0)); | |
277 #endif | |
278 } | |
279 | |
280 void | |
281 md_putchar(int c) | |
282 { | |
283 putchar(c); | |
284 } | |
285 | |
286 #ifdef _WIN32 | |
287 static int md_standout_mode = 0; | |
288 #endif | |
289 | |
290 void | |
291 md_raw_standout(void) | |
292 { | |
293 #ifdef _WIN32 | |
294 CONSOLE_SCREEN_BUFFER_INFO csbiInfo; | |
295 HANDLE hStdout; | |
296 WORD fgattr,bgattr; | |
297 | |
298 if (md_standout_mode == 0) | |
299 { | |
300 hStdout = GetStdHandle(STD_OUTPUT_HANDLE); | |
301 GetConsoleScreenBufferInfo(hStdout, &csbiInfo); | |
302 fgattr = (csbiInfo.wAttributes & 0xF); | |
303 bgattr = (csbiInfo.wAttributes & 0xF0); | |
304 SetConsoleTextAttribute(hStdout,(fgattr << 4) | (bgattr >> 4)); | |
305 md_standout_mode = 1; | |
306 } | |
307 #elif defined(SO) | |
308 tputs(SO,0,md_putchar); | |
309 fflush(stdout); | |
310 #endif | |
311 } | |
312 | |
313 void | |
314 md_raw_standend(void) | |
315 { | |
316 #ifdef _WIN32 | |
317 CONSOLE_SCREEN_BUFFER_INFO csbiInfo; | |
318 HANDLE hStdout; | |
319 WORD fgattr,bgattr; | |
320 | |
321 if (md_standout_mode == 1) | |
322 { | |
323 hStdout = GetStdHandle(STD_OUTPUT_HANDLE); | |
324 GetConsoleScreenBufferInfo(hStdout, &csbiInfo); | |
325 fgattr = (csbiInfo.wAttributes & 0xF); | |
326 bgattr = (csbiInfo.wAttributes & 0xF0); | |
327 SetConsoleTextAttribute(hStdout,(fgattr << 4) | (bgattr >> 4)); | |
328 md_standout_mode = 0; | |
329 } | |
330 #elif defined(SE) | |
331 tputs(SE,0,md_putchar); | |
332 fflush(stdout); | |
333 #endif | |
334 } | |
335 | |
336 int | |
337 md_unlink_open_file(const char *file, FILE *inf) | |
338 { | |
339 #ifdef _WIN32 | |
340 fclose(inf); | |
341 (void) _chmod(file, 0600); | |
342 return( _unlink(file) ); | |
343 #else | |
344 return(unlink(file)); | |
345 #endif | |
346 } | |
347 | |
348 int | |
349 md_unlink(char *file) | |
350 { | |
351 #ifdef _WIN32 | |
352 (void) _chmod(file, 0600); | |
353 return( _unlink(file) ); | |
354 #else | |
355 return(unlink(file)); | |
356 #endif | |
357 } | |
358 | |
190 | 359 FILE * |
360 md_fdopen(int fd, char *mode) | |
361 { | |
362 #ifdef _WIN32 | |
363 return( _fdopen(fd, mode) ); | |
364 #else | |
365 return( fdopen(fd, mode) ); | |
366 #endif | |
367 } | |
368 | |
118 | 369 int |
370 md_chmod(const char *filename, int mode) | |
371 { | |
372 #ifdef _WIN32 | |
373 return( _chmod(filename, mode) ); | |
374 #else | |
375 return( chmod(filename, mode) ); | |
376 #endif | |
377 } | |
378 | |
379 void | |
380 md_normaluser(void) | |
381 { | |
382 #if defined(HAVE_GETGID) && defined(HAVE_GETUID) | |
383 gid_t realgid = getgid(); | |
384 uid_t realuid = getuid(); | |
385 | |
386 #if defined(HAVE_SETRESGID) | |
387 if (setresgid(-1, realgid, realgid) != 0) { | |
388 #elif defined (HAVE_SETREGID) | |
389 if (setregid(realgid, realgid) != 0) { | |
390 #elif defined (HAVE_SETGID) | |
391 if (setgid(realgid) != 0) { | |
392 #else | |
393 if (0) { | |
394 #endif | |
395 perror("Could not drop setgid privileges. Aborting."); | |
396 exit(1); | |
397 } | |
398 | |
399 #if defined(HAVE_SETRESUID) | |
400 if (setresuid(-1, realuid, realuid) != 0) { | |
401 #elif defined(HAVE_SETREUID) | |
402 if (setreuid(realuid, realuid) != 0) { | |
403 #elif defined(HAVE_SETUID) | |
404 if (setuid(realuid) != 0) { | |
405 #else | |
406 if (0) { | |
407 #endif | |
408 perror("Could not drop setuid privileges. Aborting."); | |
409 exit(1); | |
410 } | |
411 #endif | |
412 } | |
413 | |
414 uid_t | |
415 md_getuid(void) | |
416 { | |
417 #ifdef HAVE_GETUID | |
418 return( getuid() ); | |
419 #else | |
420 return(42); | |
421 #endif | |
422 } | |
423 | |
120
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
424 gid_t |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
425 md_getgid(void) |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
426 { |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
427 #ifdef HAVE_GETGID |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
428 return( getgid() ); |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
429 #else |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
430 return(42); |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
431 #endif |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
432 } |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
433 |
118 | 434 pid_t |
435 md_getpid(void) | |
436 { | |
437 #ifdef _WIN32 | |
438 return( _getpid() ); | |
439 #else | |
440 return( getpid() ); | |
441 #endif | |
442 } | |
443 | |
444 char * | |
445 md_getusername(void) | |
446 { | |
447 static char login[80]; | |
448 char *l = NULL; | |
449 | |
450 /* POSIX Shell has priority, then O/S specific methods */ | |
451 if ( (l = getenv("LOGNAME")) != NULL ) | |
452 { | |
453 strncpy(login,l,80); | |
454 login[79] = 0; | |
455 return(login); | |
456 } | |
457 | |
458 #ifdef _WIN32 | |
459 LPSTR mybuffer; | |
460 DWORD size = UNLEN + 1; | |
461 TCHAR buffer[UNLEN + 1]; | |
462 | |
463 mybuffer = buffer; | |
464 GetUserName(mybuffer,&size); | |
465 l = mybuffer; | |
466 #elif defined(HAVE_GETPWUID)&& !defined(__DJGPP__) | |
467 struct passwd *pw; | |
468 | |
469 pw = getpwuid(getuid()); | |
470 | |
471 if (pw != NULL) | |
472 l = pw->pw_name; | |
473 else | |
474 l = NULL; | |
475 #endif | |
476 | |
477 if ((l == NULL) || (*l == '\0')) | |
478 if ( (l = getenv("USERNAME")) == NULL ) | |
479 if ( (l = getenv("LOGNAME")) == NULL ) | |
480 if ( (l = getenv("USER")) == NULL ) | |
481 l = "nobody"; | |
482 | |
483 strncpy(login,l,80); | |
484 login[79] = 0; | |
485 | |
486 return(login); | |
487 } | |
488 | |
489 char * | |
490 md_gethomedir(void) | |
491 { | |
492 static char homedir[PATH_MAX]; | |
493 char *h = NULL; | |
494 size_t len; | |
495 #if defined(_WIN32) | |
496 TCHAR szPath[PATH_MAX]; | |
497 #endif | |
498 #if defined(_WIN32) || defined(DJGPP) | |
499 char slash = '\\'; | |
500 #else | |
501 char slash = '/'; | |
502 struct passwd *pw; | |
503 pw = getpwuid(getuid()); | |
504 | |
505 if (pw != NULL) | |
506 h = pw->pw_dir; | |
507 else | |
508 h = ""; | |
509 | |
510 if (strcmp(h,"/") == 0) | |
511 h = ""; | |
512 #endif | |
513 homedir[0] = 0; | |
514 #ifdef _WIN32 | |
515 if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, szPath))) | |
516 h = szPath; | |
517 #endif | |
518 | |
519 if ( (h == NULL) || (*h == '\0') ) | |
520 { | |
521 if ( (h = getenv("HOME")) == NULL ) | |
522 { | |
523 if ( (h = getenv("HOMEDRIVE")) == NULL) | |
524 h = ""; | |
525 else | |
526 { | |
527 strncpy(homedir,h,PATH_MAX-1); | |
528 homedir[PATH_MAX-1] = 0; | |
529 | |
530 if ( (h = getenv("HOMEPATH")) == NULL) | |
531 h = ""; | |
532 } | |
533 } | |
534 } | |
535 | |
536 | |
537 len = strlen(homedir); | |
538 strncat(homedir,h,PATH_MAX-len-1); | |
539 len = strlen(homedir); | |
540 | |
541 if ((len > 0) && (homedir[len-1] != slash)) { | |
542 homedir[len] = slash; | |
543 homedir[len+1] = 0; | |
544 } | |
545 | |
546 return(homedir); | |
547 } | |
548 | |
549 void | |
550 md_sleep(int s) | |
551 { | |
552 #ifdef _WIN32 | |
553 Sleep(s); | |
554 #else | |
555 sleep(s); | |
556 #endif | |
557 } | |
558 | |
559 char * | |
560 md_getshell(void) | |
561 { | |
562 static char shell[PATH_MAX]; | |
563 char *s = NULL; | |
564 #ifdef _WIN32 | |
565 char *def = "C:\\WINDOWS\\SYSTEM32\\CMD.EXE"; | |
566 #elif defined(__DJGPP__) | |
567 char *def = "C:\\COMMAND.COM"; | |
568 #else | |
569 char *def = "/bin/sh"; | |
570 struct passwd *pw; | |
571 pw = getpwuid(getuid()); | |
572 if (pw != NULL) | |
573 s = pw->pw_shell; | |
574 #endif | |
575 if ((s == NULL) || (*s == '\0')) | |
576 if ( (s = getenv("COMSPEC")) == NULL) | |
577 if ( (s = getenv("SHELL")) == NULL) | |
578 if ( (s = getenv("SystemRoot")) == NULL) | |
579 s = def; | |
580 | |
581 strncpy(shell,s,PATH_MAX); | |
582 shell[PATH_MAX-1] = 0; | |
583 | |
584 return(shell); | |
585 } | |
586 | |
587 int | |
588 md_shellescape(void) | |
589 { | |
590 #if defined(HAVE_WORKING_FORK) | |
591 int ret_status; | |
592 int pid; | |
593 void (*myquit)(int); | |
594 void (*myend)(int); | |
595 char *sh; | |
596 | |
597 sh = md_getshell(); | |
598 | |
599 while((pid = fork()) < 0) | |
600 sleep(1); | |
601 | |
602 if (pid == 0) /* Shell Process */ | |
603 { | |
604 /* | |
605 * Set back to original user, just in case | |
606 */ | |
607 md_normaluser(); | |
608 execl(sh == NULL ? "/bin/sh" : sh, "shell", "-i", NULL); | |
609 perror("No shelly"); | |
610 _exit(-1); | |
611 } | |
612 else /* Application */ | |
613 { | |
614 myend = signal(SIGINT, SIG_IGN); | |
615 #ifdef SIGQUIT | |
616 myquit = signal(SIGQUIT, SIG_IGN); | |
617 #endif | |
618 while (wait(&ret_status) != pid) | |
619 continue; | |
620 | |
162
600873555ec0
Don't swap signal handlers in md_shellescape().
John "Elwin" Edwards
parents:
121
diff
changeset
|
621 signal(SIGINT, myend); |
118 | 622 #ifdef SIGQUIT |
162
600873555ec0
Don't swap signal handlers in md_shellescape().
John "Elwin" Edwards
parents:
121
diff
changeset
|
623 signal(SIGQUIT, myquit); |
118 | 624 #endif |
625 } | |
626 return(ret_status); | |
627 #elif defined(HAVE__SPAWNL) | |
628 return((int)_spawnl(_P_WAIT,md_getshell(),"shell",NULL,0)); | |
629 #elif defined(HAVE_SPAWNL) | |
630 return ( spawnl(P_WAIT,md_getshell(),"shell",NULL,0) ); | |
631 #else | |
632 return(0); | |
633 #endif | |
634 } | |
635 | |
636 char * | |
637 md_getrealname(uid_t uid) | |
638 { | |
639 static char uidstr[20]; | |
640 #if !defined(_WIN32) && !defined(DJGPP) | |
641 struct passwd *pp; | |
642 | |
643 if ((pp = getpwuid(uid)) == NULL) | |
644 { | |
645 sprintf(uidstr,"%d", uid); | |
646 return(uidstr); | |
647 } | |
648 else | |
649 return(pp->pw_name); | |
650 #else | |
651 sprintf(uidstr,"%ld", uid); | |
652 return(uidstr); | |
653 #endif | |
654 } | |
655 | |
656 char * | |
657 md_crypt(const char *key, const char *salt) | |
658 { | |
659 return( xcrypt(key,salt) ); | |
660 } | |
661 | |
662 char * | |
663 md_getpass(char *prompt) | |
664 { | |
665 #ifndef HAVE_GETPASS | |
666 static char password_buffer[9]; | |
667 char *p = password_buffer; | |
668 int c, count = 0; | |
669 int max_length = 9; | |
670 | |
671 fflush(stdout); | |
672 /* If we can't prompt, abort */ | |
673 if (fputs(prompt, stderr) < 0) | |
674 { | |
675 *p = '\0'; | |
676 return NULL; | |
677 } | |
678 | |
679 for(;;) | |
680 { | |
681 /* Get a character with no echo */ | |
682 c = _getch(); | |
683 | |
684 /* Exit on interrupt (^c or ^break) */ | |
685 if (c == '\003' || c == 0x100) | |
686 exit(1); | |
687 | |
688 /* Terminate on end of line or file (^j, ^m, ^d, ^z) */ | |
689 if (c == '\r' || c == '\n' || c == '\004' || c == '\032') | |
690 break; | |
691 | |
692 /* Back up on backspace */ | |
693 if (c == '\b') | |
694 { | |
695 if (count) | |
696 count--; | |
697 else if (p > password_buffer) | |
698 p--; | |
699 continue; | |
700 } | |
701 | |
702 /* Ignore DOS extended characters */ | |
703 if ((c & 0xff) != c) | |
704 continue; | |
705 | |
706 /* Add to password if it isn't full */ | |
707 if (p < password_buffer + max_length - 1) | |
708 *p++ = (char) c; | |
709 else | |
710 count++; | |
711 } | |
712 *p = '\0'; | |
713 | |
714 fputc('\n', stderr); | |
715 | |
716 return password_buffer; | |
717 #else | |
718 return( getpass(prompt) ); | |
719 #endif | |
720 } | |
721 | |
722 int | |
723 md_erasechar(void) | |
724 { | |
725 #ifdef HAVE_ERASECHAR | |
726 return( erasechar() ); /* process erase character */ | |
727 #elif defined(VERASE) | |
728 return(_tty.c_cc[VERASE]); /* process erase character */ | |
729 #else | |
730 return(_tty.sg_erase); /* process erase character */ | |
731 #endif | |
732 } | |
733 | |
734 int | |
735 md_killchar(void) | |
736 { | |
737 #ifdef HAVE_KILLCHAR | |
738 return( killchar() ); | |
739 #elif defined(VKILL) | |
740 return(_tty.c_cc[VKILL]); | |
741 #else | |
742 return(_tty.sg_kill); | |
743 #endif | |
744 } | |
745 | |
746 int | |
747 md_dsuspchar(void) | |
748 { | |
749 #if defined(VDSUSP) /* POSIX has priority */ | |
750 struct termios attr; | |
751 tcgetattr(STDIN_FILENO, &attr); | |
752 return( attr.c_cc[VDSUSP] ); | |
753 #elif defined(TIOCGLTC) | |
754 struct ltchars ltc; | |
755 ioctl(1, TIOCGLTC, <c); | |
756 return(ltc.t_dsuspc); | |
757 #elif defined(_POSIX_VDISABLE) | |
758 return(_POSIX_VDISABLE); | |
759 #else | |
760 return(0); | |
761 #endif | |
762 } | |
763 | |
764 int | |
765 md_setdsuspchar(int c) | |
766 { | |
767 #if defined(VDSUSP) /* POSIX has priority */ | |
768 struct termios attr; | |
769 tcgetattr(STDIN_FILENO, &attr); | |
770 attr.c_cc[VDSUSP] = c; | |
771 tcgetattr(STDIN_FILENO, &attr); | |
772 #elif defined(TIOCSLTC) | |
773 struct ltchars ltc; | |
774 ioctl(1, TIOCGLTC, <c); | |
775 ltc.t_dsuspc = c; | |
776 ioctl(1, TIOCSLTC, <c); | |
777 #else | |
778 NOOP(c); | |
779 #endif | |
780 return(0); | |
781 } | |
782 | |
783 int | |
784 md_suspchar(void) | |
785 { | |
786 #if defined(VSUSP) /* POSIX has priority */ | |
787 struct termios attr; | |
788 tcgetattr(STDIN_FILENO, &attr); | |
789 return( attr.c_cc[VSUSP] ); | |
790 #elif defined(TIOCGLTC) | |
791 struct ltchars ltc; | |
792 ioctl(1, TIOCGLTC, <c); | |
793 return(ltc.t_suspc); | |
794 #elif defined(_POSIX_VDISABLE) | |
795 return(_POSIX_VDISABLE); | |
796 #else | |
797 return(0); | |
798 #endif | |
799 } | |
800 | |
801 int | |
802 md_setsuspchar(int c) | |
803 { | |
804 #if defined(VSUSP) /* POSIX has priority */ | |
805 struct termios attr; | |
806 tcgetattr(STDIN_FILENO, &attr); | |
807 attr.c_cc[VSUSP] = c; | |
808 tcgetattr(STDIN_FILENO, &attr); | |
809 #elif defined(TIOCSLTC) | |
810 struct ltchars ltc; | |
811 ioctl(1, TIOCGLTC, <c); | |
812 ltc.t_suspc = c; | |
813 ioctl(1, TIOCSLTC, <c); | |
814 #else | |
815 NOOP(c); | |
816 #endif | |
817 | |
818 return(0); | |
819 } | |
86 | 820 |
821 /* | |
822 Cursor/Keypad Support | |
823 | |
824 Sadly Cursor/Keypad support is less straightforward than it should be. | |
825 | |
826 The various terminal emulators/consoles choose to differentiate the | |
827 cursor and keypad keys (with modifiers) in different ways (if at all!). | |
828 Furthermore they use different code set sequences for each key only | |
829 a subset of which the various curses libraries recognize. Partly due | |
830 to incomplete termcap/terminfo entries and partly due to inherent | |
831 limitations of those terminal capability databases. | |
832 | |
833 I give curses first crack at decoding the sequences. If it fails to decode | |
834 it we check for common ESC-prefixed sequences. | |
835 | |
836 All cursor/keypad results are translated into standard rogue movement | |
837 commands. | |
838 | |
839 Unmodified keys are translated to walk commands: hjklyubn | |
840 Modified (shift,control,alt) are translated to run commands: HJKLYUBN | |
841 | |
842 Console and supported (differentiated) keys | |
843 Interix: Cursor Keys, Keypad, Ctl-Keypad | |
844 Cygwin: Cursor Keys, Keypad, Alt-Cursor Keys | |
845 MSYS: Cursor Keys, Keypad, Ctl-Cursor Keys, Ctl-Keypad | |
846 Win32: Cursor Keys, Keypad, Ctl/Shift/Alt-Cursor Keys, Ctl/Alt-Keypad | |
847 DJGPP: Cursor Keys, Keypad, Ctl/Shift/Alt-Cursor Keys, Ctl/Alt-Keypad | |
848 | |
849 Interix Console (raw, ncurses) | |
850 ============================== | |
851 normal shift ctrl alt | |
852 ESC [D, ESC F^, ESC [D, ESC [D /# Left #/ | |
853 ESC [C, ESC F$, ESC [C, ESC [C /# Right #/ | |
854 ESC [A, ESC F-, local win, ESC [A /# Up #/ | |
855 ESC [B, ESC F+, local win, ESC [B /# Down #/ | |
856 ESC [H, ESC [H, ESC [H, ESC [H /# Home #/ | |
857 ESC [S, local win, ESC [S, ESC [S /# Page Up #/ | |
858 ESC [T, local win, ESC [T, ESC [T /# Page Down #/ | |
859 ESC [U, ESC [U, ESC [U, ESC [U /# End #/ | |
860 ESC [D, ESC F^, ESC [D, O /# Keypad Left #/ | |
861 ESC [C, ESC F$, ESC [C, O /# Keypad Right #/ | |
862 ESC [A, ESC [A, ESC [-1, O /# Keypad Up #/ | |
863 ESC [B, ESC [B, ESC [-2, O /# Keypad Down #/ | |
864 ESC [H, ESC [H, ESC [-263, O /# Keypad Home #/ | |
865 ESC [S, ESC [S, ESC [-19, O /# Keypad PgUp #/ | |
866 ESC [T, ESC [T, ESC [-20, O /# Keypad PgDn #/ | |
867 ESC [U, ESC [U, ESC [-21, O /# Keypad End #/ | |
868 nothing, nothing, nothing, O /# Kaypad 5 #/ | |
869 | |
870 Interix Console (term=interix, ncurses) | |
871 ============================== | |
872 KEY_LEFT, ESC F^, KEY_LEFT, KEY_LEFT /# Left #/ | |
873 KEY_RIGHT, ESC F$, KEY_RIGHT, KEY_RIGHT /# Right #/ | |
874 KEY_UP, 0x146, local win, KEY_UP /# Up #/ | |
875 KEY_DOWN, 0x145, local win, KEY_DOWN /# Down #/ | |
876 ESC [H, ESC [H, ESC [H, ESC [H /# Home #/ | |
877 KEY_PPAGE, local win, KEY_PPAGE, KEY_PPAGE /# Page Up #/ | |
878 KEY_NPAGE, local win, KEY_NPAGE, KEY_NPAGE /# Page Down #/ | |
879 KEY_LL, KEY_LL, KEY_LL, KEY_LL /# End #/ | |
880 KEY_LEFT, ESC F^, ESC [-4, O /# Keypad Left #/ | |
881 KEY_RIGHT, ESC F$, ESC [-3, O /# Keypad Right #/ | |
882 KEY_UP, KEY_UP, ESC [-1, O /# Keypad Up #/ | |
883 KEY_DOWN, KEY_DOWN, ESC [-2, O /# Keypad Down #/ | |
884 ESC [H, ESC [H, ESC [-263, O /# Keypad Home #/ | |
885 KEY_PPAGE, KEY_PPAGE, ESC [-19, O /# Keypad PgUp #/ | |
886 KEY_NPAGE, KEY_NPAGE, ESC [-20, O /# Keypad PgDn #/ | |
887 KEY_LL, KEY_LL, ESC [-21, O /# Keypad End #/ | |
888 nothing, nothing, nothing, O /# Keypad 5 #/ | |
889 | |
890 Cygwin Console (raw, ncurses) | |
891 ============================== | |
892 normal shift ctrl alt | |
893 ESC [D, ESC [D, ESC [D, ESC ESC [D /# Left #/ | |
894 ESC [C, ESC [C, ESC [C, ESC ESC [C /# Rght #/ | |
895 ESC [A, ESC [A, ESC [A, ESC ESC [A /# Up #/ | |
896 ESC [B, ESC [B, ESC [B, ESC ESC [B /# Down #/ | |
897 ESC [1~, ESC [1~, ESC [1~, ESC ESC [1~ /# Home #/ | |
898 ESC [5~, ESC [5~, ESC [5~, ESC ESC [5~ /# Page Up #/ | |
899 ESC [6~, ESC [6~, ESC [6~, ESC ESC [6~ /# Page Down #/ | |
900 ESC [4~, ESC [4~, ESC [4~, ESC ESC [4~ /# End #/ | |
901 ESC [D, ESC [D, ESC [D, ESC ESC [D,O /# Keypad Left #/ | |
902 ESC [C, ESC [C, ESC [C, ESC ESC [C,O /# Keypad Right #/ | |
903 ESC [A, ESC [A, ESC [A, ESC ESC [A,O /# Keypad Up #/ | |
904 ESC [B, ESC [B, ESC [B, ESC ESC [B,O /# Keypad Down #/ | |
905 ESC [1~, ESC [1~, ESC [1~, ESC ESC [1~,O /# Keypad Home #/ | |
906 ESC [5~, ESC [5~, ESC [5~, ESC ESC [5~,O /# Keypad PgUp #/ | |
907 ESC [6~, ESC [6~, ESC [6~, ESC ESC [6~,O /# Keypad PgDn #/ | |
908 ESC [4~, ESC [4~, ESC [4~, ESC ESC [4~,O /# Keypad End #/ | |
909 ESC [-71, nothing, nothing, O /# Keypad 5 #/ | |
910 | |
911 Cygwin Console (term=cygwin, ncurses) | |
912 ============================== | |
913 KEY_LEFT, KEY_LEFT, KEY_LEFT, ESC-260 /# Left #/ | |
914 KEY_RIGHT, KEY_RIGHT, KEY_RIGHT, ESC-261 /# Rght #/ | |
915 KEY_UP, KEY_UP, KEY_UP, ESC-259 /# Up #/ | |
916 KEY_DOWN, KEY_DOWN, KEY_DOWN, ESC-258 /# Down #/ | |
917 KEY_HOME, KEY_HOME, KEY_HOME, ESC-262 /# Home #/ | |
918 KEY_PPAGE, KEY_PPAGE, KEY_PPAGE, ESC-339 /# Page Up #/ | |
919 KEY_NPAGE, KEY_NPAGE, KEY_NPAGE, ESC-338 /# Page Down #/ | |
920 KEY_END, KEY_END, KEY_END, ESC-360 /# End #/ | |
921 KEY_LEFT, KEY_LEFT, KEY_LEFT, ESC-260,O /# Keypad Left #/ | |
922 KEY_RIGHT, KEY_RIGHT, KEY_RIGHT, ESC-261,O /# Keypad Right #/ | |
923 KEY_UP, KEY_UP, KEY_UP, ESC-259,O /# Keypad Up #/ | |
924 KEY_DOWN, KEY_DOWN, KEY_DOWN, ESC-258,O /# Keypad Down #/ | |
925 KEY_HOME, KEY_HOME, KEY_HOME, ESC-262,O /# Keypad Home #/ | |
926 KEY_PPAGE, KEY_PPAGE, KEY_PPAGE, ESC-339,O /# Keypad PgUp #/ | |
927 KEY_NPAGE, KEY_NPAGE, KEY_NPAGE, ESC-338,O /# Keypad PgDn #/ | |
928 KEY_END, KEY_END, KEY_END, ESC-360,O /# Keypad End #/ | |
929 ESC [G, nothing, nothing, O /# Keypad 5 #/ | |
930 | |
931 MSYS Console (raw, ncurses) | |
932 ============================== | |
933 normal shift ctrl alt | |
934 ESC OD, ESC [d, ESC Od nothing /# Left #/ | |
935 ESC OE, ESC [e, ESC Oe, nothing /# Right #/ | |
936 ESC OA, ESC [a, ESC Oa, nothing /# Up #/ | |
937 ESC OB, ESC [b, ESC Ob, nothing /# Down #/ | |
938 ESC [7~, ESC [7$, ESC [7^, nothing /# Home #/ | |
939 ESC [5~, local window, ESC [5^, nothing /# Page Up #/ | |
940 ESC [6~, local window, ESC [6^, nothing /# Page Down #/ | |
941 ESC [8~, ESC [8$, ESC [8^, nothing /# End #/ | |
942 ESC OD, ESC [d, ESC Od O /# Keypad Left #/ | |
943 ESC OE, ESC [c, ESC Oc, O /# Keypad Right #/ | |
944 ESC OA, ESC [a, ESC Oa, O /# Keypad Up #/ | |
945 ESC OB, ESC [b, ESC Ob, O /# Keypad Down #/ | |
946 ESC [7~, ESC [7$, ESC [7^, O /# Keypad Home #/ | |
947 ESC [5~, local window, ESC [5^, O /# Keypad PgUp #/ | |
948 ESC [6~, local window, ESC [6^, O /# Keypad PgDn #/ | |
949 ESC [8~, ESC [8$, ESC [8^, O /# Keypad End #/ | |
950 11, 11, 11, O /# Keypad 5 #/ | |
951 | |
952 MSYS Console (term=rxvt, ncurses) | |
953 ============================== | |
954 normal shift ctrl alt | |
955 KEY_LEFT, KEY_SLEFT, 514 nothing /# Left #/ | |
956 KEY_RIGHT, KEY_SRIGHT, 516, nothing /# Right #/ | |
957 KEY_UP, 518, 519, nothing /# Up #/ | |
958 KEY_DOWN, 511, 512, nothing /# Down #/ | |
959 KEY_HOME, KEY_SHOME, ESC [7^, nothing /# Home #/ | |
960 KEY_PPAGE, local window, ESC [5^, nothing /# Page Up #/ | |
961 KEY_NPAGE, local window, ESC [6^, nothing /# Page Down #/ | |
962 KEY_END, KEY_SEND, KEY_EOL, nothing /# End #/ | |
963 KEY_LEFT, KEY_SLEFT, 514 O /# Keypad Left #/ | |
964 KEY_RIGHT, KEY_SRIGHT, 516, O /# Keypad Right #/ | |
965 KEY_UP, 518, 519, O /# Keypad Up #/ | |
966 KEY_DOWN, 511, 512, O /# Keypad Down #/ | |
967 KEY_HOME, KEY_SHOME, ESC [7^, O /# Keypad Home #/ | |
968 KEY_PPAGE, local window, ESC [5^, O /# Keypad PgUp #/ | |
969 KEY_NPAGE, local window, ESC [6^, O /# Keypad PgDn #/ | |
970 KEY_END, KEY_SEND, KEY_EOL, O /# Keypad End #/ | |
971 11, 11, 11, O /# Keypad 5 #/ | |
972 | |
973 Win32 Console (raw, pdcurses) | |
974 DJGPP Console (raw, pdcurses) | |
975 ============================== | |
976 normal shift ctrl alt | |
977 260, 391, 443, 493 /# Left #/ | |
978 261, 400, 444, 492 /# Right #/ | |
979 259, 547, 480, 490 /# Up #/ | |
980 258, 548, 481, 491 /# Down #/ | |
981 262, 388, 447, 524 /# Home #/ | |
982 339, 396, 445, 526 /# Page Up #/ | |
983 338, 394, 446, 520 /# Page Down #/ | |
984 358, 384, 448, 518 /# End #/ | |
985 452, 52('4'), 511, 521 /# Keypad Left #/ | |
986 454, 54('6'), 513, 523 /# Keypad Right #/ | |
987 450, 56('8'), 515, 525 /# Keypad Up #/ | |
988 456, 50('2'), 509, 519 /# Keypad Down #/ | |
989 449, 55('7'), 514, 524 /# Keypad Home #/ | |
990 451, 57('9'), 516, 526 /# Keypad PgUp #/ | |
991 457, 51('3'), 510, 520 /# Keypad PgDn #/ | |
992 455, 49('1'), 508, 518 /# Keypad End #/ | |
993 453, 53('5'), 512, 522 /# Keypad 5 #/ | |
994 | |
995 Win32 Console (pdcurses, MSVC/MingW32) | |
996 DJGPP Console (pdcurses) | |
997 ============================== | |
998 normal shift ctrl alt | |
999 KEY_LEFT, KEY_SLEFT, CTL_LEFT, ALT_LEFT /# Left #/ | |
1000 KEY_RIGHT, KEY_SRIGHT, CTL_RIGHT, ALT_RIGHT /# Right #/ | |
1001 KEY_UP, KEY_SUP, CTL_UP, ALT_UP /# Up #/ | |
1002 KEY_DOWN, KEY_SDOWN, CTL_DOWN, ALT_DOWN /# Down #/ | |
1003 KEY_HOME, KEY_SHOME, CTL_HOME, ALT_HOME /# Home #/ | |
1004 KEY_PPAGE, KEY_SPREVIOUS, CTL_PGUP, ALT_PGUP /# Page Up #/ | |
1005 KEY_NPAGE, KEY_SNEXTE, CTL_PGDN, ALT_PGDN /# Page Down #/ | |
1006 KEY_END, KEY_SEND, CTL_END, ALT_END /# End #/ | |
1007 KEY_B1, 52('4'), CTL_PAD4, ALT_PAD4 /# Keypad Left #/ | |
1008 KEY_B3, 54('6'), CTL_PAD6, ALT_PAD6 /# Keypad Right #/ | |
1009 KEY_A2, 56('8'), CTL_PAD8, ALT_PAD8 /# Keypad Up #/ | |
1010 KEY_C2, 50('2'), CTL_PAD2, ALT_PAD2 /# Keypad Down #/ | |
1011 KEY_A1, 55('7'), CTL_PAD7, ALT_PAD7 /# Keypad Home #/ | |
1012 KEY_A3, 57('9'), CTL_PAD9, ALT_PAD9 /# Keypad PgUp #/ | |
1013 KEY_C3, 51('3'), CTL_PAD3, ALT_PAD3 /# Keypad PgDn #/ | |
1014 KEY_C1, 49('1'), CTL_PAD1, ALT_PAD1 /# Keypad End #/ | |
1015 KEY_B2, 53('5'), CTL_PAD5, ALT_PAD5 /# Keypad 5 #/ | |
1016 | |
1017 Windows Telnet (raw) | |
1018 ============================== | |
1019 normal shift ctrl alt | |
1020 ESC [D, ESC [D, ESC [D, ESC [D /# Left #/ | |
1021 ESC [C, ESC [C, ESC [C, ESC [C /# Right #/ | |
1022 ESC [A, ESC [A, ESC [A, ESC [A /# Up #/ | |
1023 ESC [B, ESC [B, ESC [B, ESC [B /# Down #/ | |
1024 ESC [1~, ESC [1~, ESC [1~, ESC [1~ /# Home #/ | |
1025 ESC [5~, ESC [5~, ESC [5~, ESC [5~ /# Page Up #/ | |
1026 ESC [6~, ESC [6~, ESC [6~, ESC [6~ /# Page Down #/ | |
1027 ESC [4~, ESC [4~, ESC [4~, ESC [4~ /# End #/ | |
1028 ESC [D, ESC [D, ESC [D, ESC [D /# Keypad Left #/ | |
1029 ESC [C, ESC [C, ESC [C, ESC [C /# Keypad Right #/ | |
1030 ESC [A, ESC [A, ESC [A, ESC [A /# Keypad Up #/ | |
1031 ESC [B, ESC [B, ESC [B, ESC [B /# Keypad Down #/ | |
1032 ESC [1~, ESC [1~, ESC [1~, ESC [1~ /# Keypad Home #/ | |
1033 ESC [5~, ESC [5~, ESC [5~, ESC [5~ /# Keypad PgUp #/ | |
1034 ESC [6~, ESC [6~, ESC [6~, ESC [6~ /# Keypad PgDn #/ | |
1035 ESC [4~, ESC [4~, ESC [4~, ESC [4~ /# Keypad End #/ | |
1036 nothing, nothing, nothing, nothing /# Keypad 5 #/ | |
1037 | |
1038 Windows Telnet (term=xterm) | |
1039 ============================== | |
1040 normal shift ctrl alt | |
1041 KEY_LEFT, KEY_LEFT, KEY_LEFT, KEY_LEFT /# Left #/ | |
1042 KEY_RIGHT, KEY_RIGHT, KEY_RIGHT, KEY_RIGHT /# Right #/ | |
1043 KEY_UP, KEY_UP, KEY_UP, KEY_UP /# Up #/ | |
1044 KEY_DOWN, KEY_DOWN, KEY_DOWN, KEY_DOWN /# Down #/ | |
1045 ESC [1~, ESC [1~, ESC [1~, ESC [1~ /# Home #/ | |
1046 KEY_PPAGE, KEY_PPAGE, KEY_PPAGE, KEY_PPAGE /# Page Up #/ | |
1047 KEY_NPAGE, KEY_NPAGE, KEY_NPAGE, KEY_NPAGE /# Page Down #/ | |
1048 ESC [4~, ESC [4~, ESC [4~, ESC [4~ /# End #/ | |
1049 KEY_LEFT, KEY_LEFT, KEY_LEFT, O /# Keypad Left #/ | |
1050 KEY_RIGHT, KEY_RIGHT, KEY_RIGHT, O /# Keypad Right #/ | |
1051 KEY_UP, KEY_UP, KEY_UP, O /# Keypad Up #/ | |
1052 KEY_DOWN, KEY_DOWN, KEY_DOWN, O /# Keypad Down #/ | |
1053 ESC [1~, ESC [1~, ESC [1~, ESC [1~ /# Keypad Home #/ | |
1054 KEY_PPAGE, KEY_PPAGE, KEY_PPAGE, KEY_PPAGE /# Keypad PgUp #/ | |
1055 KEY_NPAGE, KEY_NPAGE, KEY_NPAGE, KEY_NPAGE /# Keypad PgDn #/ | |
1056 ESC [4~, ESC [4~, ESC [4~, O /# Keypad End #/ | |
1057 ESC [-71, nothing, nothing, O /# Keypad 5 #/ | |
1058 | |
1059 PuTTY | |
1060 ============================== | |
1061 normal shift ctrl alt | |
1062 ESC [D, ESC [D, ESC OD, ESC [D /# Left #/ | |
1063 ESC [C, ESC [C, ESC OC, ESC [C /# Right #/ | |
1064 ESC [A, ESC [A, ESC OA, ESC [A /# Up #/ | |
1065 ESC [B, ESC [B, ESC OB, ESC [B /# Down #/ | |
1066 ESC [1~, ESC [1~, local win, ESC [1~ /# Home #/ | |
1067 ESC [5~, local win, local win, ESC [5~ /# Page Up #/ | |
1068 ESC [6~, local win, local win, ESC [6~ /# Page Down #/ | |
1069 ESC [4~, ESC [4~, local win, ESC [4~ /# End #/ | |
1070 ESC [D, ESC [D, ESC [D, O /# Keypad Left #/ | |
1071 ESC [C, ESC [C, ESC [C, O /# Keypad Right #/ | |
1072 ESC [A, ESC [A, ESC [A, O /# Keypad Up #/ | |
1073 ESC [B, ESC [B, ESC [B, O /# Keypad Down #/ | |
1074 ESC [1~, ESC [1~, ESC [1~, O /# Keypad Home #/ | |
1075 ESC [5~, ESC [5~, ESC [5~, O /# Keypad PgUp #/ | |
1076 ESC [6~, ESC [6~, ESC [6~, O /# Keypad PgDn #/ | |
1077 ESC [4~, ESC [4~, ESC [4~, O /# Keypad End #/ | |
1078 nothing, nothing, nothing, O /# Keypad 5 #/ | |
1079 | |
1080 PuTTY | |
1081 ============================== | |
1082 normal shift ctrl alt | |
1083 KEY_LEFT, KEY_LEFT, ESC OD, ESC KEY_LEFT /# Left #/ | |
1084 KEY_RIGHT KEY_RIGHT, ESC OC, ESC KEY_RIGHT /# Right #/ | |
1085 KEY_UP, KEY_UP, ESC OA, ESC KEY_UP /# Up #/ | |
1086 KEY_DOWN, KEY_DOWN, ESC OB, ESC KEY_DOWN /# Down #/ | |
1087 ESC [1~, ESC [1~, local win, ESC ESC [1~ /# Home #/ | |
1088 KEY_PPAGE local win, local win, ESC KEY_PPAGE /# Page Up #/ | |
1089 KEY_NPAGE local win, local win, ESC KEY_NPAGE /# Page Down #/ | |
1090 ESC [4~, ESC [4~, local win, ESC ESC [4~ /# End #/ | |
1091 ESC Ot, ESC Ot, ESC Ot, O /# Keypad Left #/ | |
1092 ESC Ov, ESC Ov, ESC Ov, O /# Keypad Right #/ | |
1093 ESC Ox, ESC Ox, ESC Ox, O /# Keypad Up #/ | |
1094 ESC Or, ESC Or, ESC Or, O /# Keypad Down #/ | |
1095 ESC Ow, ESC Ow, ESC Ow, O /# Keypad Home #/ | |
1096 ESC Oy, ESC Oy, ESC Oy, O /# Keypad PgUp #/ | |
1097 ESC Os, ESC Os, ESC Os, O /# Keypad PgDn #/ | |
1098 ESC Oq, ESC Oq, ESC Oq, O /# Keypad End #/ | |
1099 ESC Ou, ESC Ou, ESC Ou, O /# Keypad 5 #/ | |
1100 */ | |
1101 | |
1102 #define M_NORMAL 0 | |
1103 #define M_ESC 1 | |
1104 #define M_KEYPAD 2 | |
1105 #define M_TRAIL 3 | |
1106 | |
1107 int undo[5]; | |
1108 int uindex = -1; | |
1109 | |
1110 int | |
1111 reread() | |
1112 { | |
1113 int redo; | |
1114 | |
1115 if (uindex < 0) | |
1116 return 0; | |
1117 | |
1118 redo = undo[0]; | |
1119 undo[0] = undo[1]; | |
1120 undo[1] = undo[2]; | |
1121 undo[2] = undo[3]; | |
1122 undo[3] = undo[4]; | |
1123 uindex--; | |
1124 return redo; | |
1125 } | |
1126 | |
1127 void | |
1128 unread(int c) | |
1129 { | |
1130 if (uindex >= 4) | |
1131 abort(); | |
1132 | |
1133 undo[++uindex] = c; | |
1134 } | |
1135 | |
1136 int | |
1137 md_readchar(WINDOW *win) | |
1138 { | |
1139 int ch = 0; | |
1140 int lastch = 0; | |
1141 int mode = M_NORMAL; | |
1142 int mode2 = M_NORMAL; | |
1143 int nodelayf = 0; | |
1144 int count = 0; | |
1145 | |
1146 for(;;) | |
1147 { | |
1148 if (mode == M_NORMAL && uindex >= 0) | |
1149 { | |
1150 ch = reread(); | |
1151 break; | |
1152 } | |
1153 | |
1154 ch = wgetch(win); | |
1155 | |
1156 if (ch == ERR) /* timed out or error */ | |
1157 { | |
1158 if (nodelayf) /* likely timed out, switch to */ | |
1159 { /* normal mode and block on */ | |
1160 mode = M_NORMAL; /* next read */ | |
1161 nodelayf = 0; | |
1162 nodelay(win,0); | |
1163 } | |
1164 else if (count > 10) /* after 10 errors assume */ | |
1165 auto_save(0); /* input stream is broken and */ | |
1166 else /* auto save and exit */ | |
1167 count++; | |
1168 | |
1169 continue; | |
1170 } | |
1171 | |
1172 count = 0; /* reset input error count */ | |
1173 | |
1174 if (mode == M_TRAIL) | |
1175 { | |
1176 if (ch == '^') /* msys console : 7,5,6,8: modified*/ | |
1177 ch = CTRL( toupper(lastch) ); | |
1178 else if (ch == '~') /* cygwin console: 1,5,6,4: normal */ | |
1179 ch = tolower(lastch); /* windows telnet: 1,5,6,4: normal */ | |
1180 /* msys console : 7,5,6,8: normal */ | |
1181 else if (mode2 == M_ESC) /* cygwin console: 1,5,6,4: modified*/ | |
1182 ch = CTRL( toupper(ch) ); | |
1183 else | |
1184 { | |
1185 mode = M_NORMAL; | |
1186 unread(ch); | |
1187 continue; | |
1188 } | |
1189 | |
1190 break; | |
1191 } | |
1192 | |
1193 if (mode == M_ESC) | |
1194 { | |
1195 if (ch == 27) | |
1196 { | |
1197 mode2 = M_ESC; | |
1198 unread(ch); | |
1199 continue; | |
1200 } | |
1201 | |
1202 if ((ch == 'F') || (ch == 'O') || (ch == '[')) | |
1203 { | |
1204 mode = M_KEYPAD; | |
1205 unread(ch); | |
1206 continue; | |
1207 } | |
1208 | |
1209 | |
1210 switch(ch) | |
1211 { | |
1212 /* Cygwin Console */ | |
1213 /* PuTTY */ | |
1214 case KEY_LEFT : ch = CTRL('H'); break; | |
1215 case KEY_RIGHT: ch = CTRL('L'); break; | |
1216 case KEY_UP : ch = CTRL('K'); break; | |
1217 case KEY_DOWN : ch = CTRL('J'); break; | |
1218 case KEY_HOME : ch = CTRL('Y'); break; | |
1219 case KEY_PPAGE: ch = CTRL('U'); break; | |
1220 case KEY_NPAGE: ch = CTRL('N'); break; | |
1221 case KEY_END : ch = CTRL('B'); break; | |
1222 | |
1223 default: mode = M_NORMAL; | |
1224 mode2 = M_NORMAL; | |
1225 unread(ch); | |
1226 continue; | |
1227 } | |
1228 | |
1229 break; | |
1230 } | |
1231 | |
1232 if (mode == M_KEYPAD) | |
1233 { | |
1234 switch(ch) | |
1235 { | |
1236 /* ESC F - Interix Console codes */ | |
1237 case '^': ch = CTRL('H'); break; /* Shift-Left */ | |
1238 case '$': ch = CTRL('L'); break; /* Shift-Right */ | |
1239 | |
1240 /* ESC [ - Interix Console codes */ | |
1241 case 'H': ch = 'y'; break; /* Home */ | |
1242 case 1: ch = CTRL('K'); break; /* Ctl-Keypad Up */ | |
1243 case 2: ch = CTRL('J'); break; /* Ctl-Keypad Down */ | |
1244 case 3: ch = CTRL('L'); break; /* Ctl-Keypad Right */ | |
1245 case 4: ch = CTRL('H'); break; /* Ctl-Keypad Left */ | |
1246 case 263: ch = CTRL('Y'); break; /* Ctl-Keypad Home */ | |
1247 case 19: ch = CTRL('U'); break; /* Ctl-Keypad PgUp */ | |
1248 case 20: ch = CTRL('N'); break; /* Ctl-Keypad PgDn */ | |
1249 case 21: ch = CTRL('B'); break; /* Ctl-Keypad End */ | |
1250 | |
1251 /* ESC [ - Cygwin Console codes */ | |
1252 case 'G': ch = '.'; break; /* Keypad 5 */ | |
1253 case '7': lastch = 'Y'; mode=M_TRAIL; break; /* Ctl-Home */ | |
1254 case '5': lastch = 'U'; mode=M_TRAIL; break; /* Ctl-PgUp */ | |
1255 case '6': lastch = 'N'; mode=M_TRAIL; break; /* Ctl-PgDn */ | |
1256 | |
1257 /* ESC [ - Win32 Telnet, PuTTY */ | |
1258 case '1': lastch = 'y'; mode=M_TRAIL; break; /* Home */ | |
1259 case '4': lastch = 'b'; mode=M_TRAIL; break; /* End */ | |
1260 | |
1261 /* ESC [ - not understood by screen/tmux */ | |
1262 case 'E': ch = '.'; break; /* Keypad 5 */ | |
1263 | |
1264 /* ESC O - PuTTY */ | |
1265 case 'D': ch = CTRL('H'); break; | |
1266 case 'C': ch = CTRL('L'); break; | |
1267 case 'A': ch = CTRL('K'); break; | |
1268 case 'B': ch = CTRL('J'); break; | |
1269 case 't': ch = 'h'; break; | |
1270 case 'v': ch = 'l'; break; | |
1271 case 'x': ch = 'k'; break; | |
1272 case 'r': ch = 'j'; break; | |
1273 case 'w': ch = 'y'; break; | |
1274 case 'y': ch = 'u'; break; | |
1275 case 's': ch = 'n'; break; | |
1276 case 'q': ch = 'b'; break; | |
1277 case 'u': ch = '.'; break; | |
1278 } | |
1279 | |
1280 if (mode != M_KEYPAD) | |
1281 { | |
1282 unread(ch); | |
1283 continue; | |
1284 } | |
1285 } | |
1286 | |
1287 if (ch == 27) | |
1288 { | |
1289 nodelay(win,1); | |
1290 mode = M_ESC; | |
1291 nodelayf = 1; | |
1292 unread(ch); | |
1293 continue; | |
1294 } | |
1295 | |
1296 switch(ch) | |
1297 { | |
1298 case KEY_LEFT : ch = 'h'; break; | |
1299 case KEY_DOWN : ch = 'j'; break; | |
1300 case KEY_UP : ch = 'k'; break; | |
1301 case KEY_RIGHT : ch = 'l'; break; | |
1302 case KEY_HOME : ch = 'y'; break; | |
1303 case KEY_PPAGE : ch = 'u'; break; | |
1304 case KEY_END : ch = 'b'; break; | |
1305 #ifdef KEY_LL | |
1306 case KEY_LL : ch = 'b'; break; | |
1307 #endif | |
1308 case KEY_NPAGE : ch = 'n'; break; | |
1309 case KEY_BEG : ch = '.'; break; | |
1310 | |
1311 #ifdef KEY_B1 | |
1312 case KEY_B1 : ch = 'h'; break; | |
1313 case KEY_C2 : ch = 'j'; break; | |
1314 case KEY_A2 : ch = 'k'; break; | |
1315 case KEY_B3 : ch = 'l'; break; | |
1316 #endif | |
1317 case KEY_A1 : ch = 'y'; break; | |
1318 case KEY_A3 : ch = 'u'; break; | |
1319 case KEY_C1 : ch = 'b'; break; | |
1320 case KEY_C3 : ch = 'n'; break; | |
1321 case KEY_B2 : ch = '.'; break; | |
1322 | |
1323 #ifdef KEY_SLEFT | |
1324 case KEY_SRIGHT : ch = CTRL('L'); break; | |
1325 case KEY_SLEFT : ch = CTRL('H'); break; | |
1326 #ifdef KEY_SUP | |
1327 case KEY_SUP : ch = CTRL('K'); break; | |
1328 case KEY_SDOWN : ch = CTRL('J'); break; | |
1329 #endif | |
1330 case KEY_SHOME : ch = CTRL('Y'); break; | |
1331 case KEY_SPREVIOUS:ch = CTRL('U'); break; | |
1332 case KEY_SEND : ch = CTRL('B'); break; | |
1333 case KEY_SNEXT : ch = CTRL('N'); break; | |
1334 #endif | |
1335 case 0x146 : ch = CTRL('K'); break; /* Shift-Up */ | |
1336 case 0x145 : ch = CTRL('J'); break; /* Shift-Down */ | |
1337 | |
1338 | |
1339 #ifdef CTL_RIGHT | |
1340 case CTL_RIGHT : ch = CTRL('L'); break; | |
1341 case CTL_LEFT : ch = CTRL('H'); break; | |
1342 case CTL_UP : ch = CTRL('K'); break; | |
1343 case CTL_DOWN : ch = CTRL('J'); break; | |
1344 case CTL_HOME : ch = CTRL('Y'); break; | |
1345 case CTL_PGUP : ch = CTRL('U'); break; | |
1346 case CTL_END : ch = CTRL('B'); break; | |
1347 case CTL_PGDN : ch = CTRL('N'); break; | |
1348 #endif | |
1349 #ifdef KEY_EOL | |
1350 case KEY_EOL : ch = CTRL('B'); break; | |
1351 #endif | |
1352 | |
1353 #ifndef CTL_PAD1 | |
1354 /* MSYS rxvt console */ | |
1355 case 511 : ch = CTRL('J'); break; /* Shift Dn */ | |
1356 case 512 : ch = CTRL('J'); break; /* Ctl Down */ | |
1357 case 514 : ch = CTRL('H'); break; /* Ctl Left */ | |
1358 case 516 : ch = CTRL('L'); break; /* Ctl Right*/ | |
1359 case 518 : ch = CTRL('K'); break; /* Shift Up */ | |
1360 case 519 : ch = CTRL('K'); break; /* Ctl Up */ | |
1361 #endif | |
1362 | |
1363 #ifdef CTL_PAD1 | |
1364 case CTL_PAD1 : ch = CTRL('B'); break; | |
1365 case CTL_PAD2 : ch = CTRL('J'); break; | |
1366 case CTL_PAD3 : ch = CTRL('N'); break; | |
1367 case CTL_PAD4 : ch = CTRL('H'); break; | |
1368 case CTL_PAD5 : ch = '.'; break; | |
1369 case CTL_PAD6 : ch = CTRL('L'); break; | |
1370 case CTL_PAD7 : ch = CTRL('Y'); break; | |
1371 case CTL_PAD8 : ch = CTRL('K'); break; | |
1372 case CTL_PAD9 : ch = CTRL('U'); break; | |
1373 #endif | |
1374 | |
1375 #ifdef ALT_RIGHT | |
1376 case ALT_RIGHT : ch = CTRL('L'); break; | |
1377 case ALT_LEFT : ch = CTRL('H'); break; | |
1378 case ALT_DOWN : ch = CTRL('J'); break; | |
1379 case ALT_HOME : ch = CTRL('Y'); break; | |
1380 case ALT_PGUP : ch = CTRL('U'); break; | |
1381 case ALT_END : ch = CTRL('B'); break; | |
1382 case ALT_PGDN : ch = CTRL('N'); break; | |
1383 #endif | |
1384 | |
1385 #ifdef ALT_PAD1 | |
1386 case ALT_PAD1 : ch = CTRL('B'); break; | |
1387 case ALT_PAD2 : ch = CTRL('J'); break; | |
1388 case ALT_PAD3 : ch = CTRL('N'); break; | |
1389 case ALT_PAD4 : ch = CTRL('H'); break; | |
1390 case ALT_PAD5 : ch = '.'; break; | |
1391 case ALT_PAD6 : ch = CTRL('L'); break; | |
1392 case ALT_PAD7 : ch = CTRL('Y'); break; | |
1393 case ALT_PAD8 : ch = CTRL('K'); break; | |
1394 case ALT_PAD9 : ch = CTRL('U'); break; | |
1395 #endif | |
118 | 1396 #ifdef KEY_BACKSPACE |
1397 case KEY_BACKSPACE: ch = md_erasechar(); break; | |
86 | 1398 #endif |
1399 } | |
1400 | |
1401 break; | |
1402 } | |
1403 | |
1404 if (nodelayf) | |
1405 nodelay(win,0); | |
1406 | |
1407 uindex = -1; | |
1408 | |
1409 return(ch & 0x7F); | |
1410 } | |
118 | 1411 |
1412 #if defined(LOADAV) && defined(HAVE_NLIST_H) && defined(HAVE_NLIST) | |
1413 /* | |
1414 * loadav: | |
1415 * Looking up load average in core (for system where the loadav() | |
1416 * system call isn't defined | |
1417 */ | |
1418 | |
1419 #include <nlist.h> | |
1420 | |
1421 struct nlist avenrun = { | |
1422 "_avenrun" | |
1423 }; | |
1424 | |
1425 void | |
1426 md_loadav(double *avg) | |
1427 { | |
1428 int kmem; | |
1429 | |
1430 if ((kmem = open("/dev/kmem", 0)) < 0) | |
1431 goto bad; | |
1432 nlist(NAMELIST, &avenrun); | |
1433 if (avenrun.n_type == 0) | |
1434 { | |
1435 close(kmem); | |
1436 bad: | |
1437 avg[0] = 0.0; | |
1438 avg[1] = 0.0; | |
1439 avg[2] = 0.0; | |
1440 return; | |
1441 } | |
1442 | |
1443 lseek(kmem, avenrun.n_value, 0); | |
1444 read(kmem, (char *) avg, 3 * sizeof (double)); | |
1445 close(kmem); | |
1446 } | |
1447 #else | |
1448 void | |
1449 md_loadav(double *avg) | |
1450 { | |
1451 #if defined(HAVE_LOADAV) | |
1452 loadav(avg); | |
1453 #elif defined(HAVE_GETLOADAVG) | |
1454 getloadavg(avg,3); | |
1455 #else | |
1456 avg[0] = avg[1] = avg[2] = 0; | |
1457 #endif | |
1458 } | |
1459 #endif | |
1460 | |
1461 #ifndef NSIG | |
1462 #define NSIG 32 | |
1463 #endif | |
1464 | |
1465 void | |
1466 md_ignoreallsignals(void) | |
1467 { | |
1468 int i; | |
1469 | |
1470 for (i = 0; i < NSIG; i++) | |
1471 signal(i, SIG_IGN); | |
1472 } | |
1473 | |
1474 #if 0 | |
1475 /* tstp() isn't ported until I make sure it really works. */ | |
1476 void | |
1477 md_tstphold(void) | |
1478 { | |
1479 #ifdef SIGTSTP | |
1480 /* | |
1481 * If a process can be suspended, this code wouldn't work | |
1482 */ | |
1483 # ifdef SIG_HOLD | |
1484 signal(SIGTSTP, SIG_HOLD); | |
1485 # else | |
1486 signal(SIGTSTP, SIG_IGN); | |
1487 # endif | |
1488 #endif | |
1489 } | |
1490 | |
1491 void | |
1492 md_tstpresume(void) | |
1493 { | |
1494 #ifdef SIGTSTP | |
1495 signal(SIGTSTP, tstp); | |
1496 #endif | |
1497 } | |
1498 | |
1499 void | |
1500 md_tstpsignal(void) | |
1501 { | |
1502 #ifdef SIGTSTP | |
1503 kill(0, SIGTSTP); /* send actual signal and suspend process */ | |
1504 #endif | |
1505 } | |
1506 #endif | |
1507 | |
1508 #if defined(CHECKTIME) | |
1509 void | |
1510 md_start_checkout_timer(int time) | |
1511 { | |
1512 int checkout(); | |
1513 | |
1514 #if defined(HAVE_ALARM) && defined(SIGALRM) | |
1515 signal(SIGALRM, checkout); | |
1516 alarm(time); | |
1517 #endif | |
1518 } | |
1519 | |
1520 void | |
1521 md_stop_checkout_timer(void) | |
1522 { | |
1523 #if defined(SIGALRM) | |
1524 signal(SIGALRM, SIG_IGN); | |
1525 #endif | |
1526 } | |
1527 | |
1528 #endif | |
1529 | |
120
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1530 long |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1531 md_memused(void) |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1532 { |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1533 #ifdef _WIN32 |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1534 MEMORYSTATUS stat; |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1535 |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1536 GlobalMemoryStatus(&stat); |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1537 |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1538 return((long)stat.dwTotalPageFile); |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1539 #else |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1540 return( (long)sbrk(0) ); |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1541 #endif |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1542 } |
d6b7c3fb37ea
srogue: add and use more md_* portable functions.
John "Elwin" Edwards
parents:
119
diff
changeset
|
1543 |
121
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1544 int |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1545 md_random(void) |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1546 { |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1547 #if defined (HAVE_LRAND48) |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1548 return lrand48(); |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1549 #elif defined (HAVE_RANDOM) |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1550 return random(); |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1551 #else |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1552 return rand(); |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1553 #endif |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1554 } |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1555 |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1556 void |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1557 md_srandom(unsigned int seed) |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1558 { |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1559 #if defined (HAVE_SRAND48) |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1560 srand48(seed); |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1561 #elif defined (HAVE_SRANDOM) |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1562 srandom(seed); |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1563 #else |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1564 srand(seed); |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1565 #endif |
e6c8652473fe
srogue: more compatibility improvements.
John "Elwin" Edwards
parents:
120
diff
changeset
|
1566 } |