Mercurial > hg > early-roguelike
comparison srogue/command.c @ 119:458df24e973d
srogue: use functions from mdport.c.
Shell escape, passwd entries, terminal settings, and most signal
handling is now done with the more portable md_* functions.
| author | John "Elwin" Edwards | 
|---|---|
| date | Wed, 30 Apr 2014 14:46:30 -0700 | 
| parents | 1e88eb1942a5 | 
| children | 576cc8154521 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 118:8d1dfc5a912c | 119:458df24e973d | 
|---|---|
| 367 { | 367 { | 
| 368 reg char ch, good; | 368 reg char ch, good; | 
| 369 /* | 369 /* | 
| 370 * Reset the signal in case we got here via an interrupt | 370 * Reset the signal in case we got here via an interrupt | 
| 371 */ | 371 */ | 
| 372 #ifdef SIGINT | |
| 372 if (signal(SIGINT, quit) != quit) | 373 if (signal(SIGINT, quit) != quit) | 
| 373 mpos = 0; | 374 mpos = 0; | 
| 375 #endif | |
| 374 msg("Really quit? [y/n/s]"); | 376 msg("Really quit? [y/n/s]"); | 
| 375 /* ch = tolower(readchar());*/ | 377 /* ch = tolower(readchar());*/ | 
| 376 ch = readchar(); | 378 ch = readchar(); | 
| 377 if (ch == 'y') { | 379 if (ch == 'y') { | 
| 378 clear(); | 380 clear(); | 
| 393 endwin(); | 395 endwin(); | 
| 394 byebye(0); | 396 byebye(0); | 
| 395 } | 397 } | 
| 396 } | 398 } | 
| 397 else { | 399 else { | 
| 400 #ifdef SIGINT | |
| 398 signal(SIGINT, quit); | 401 signal(SIGINT, quit); | 
| 402 #endif | |
| 399 wmove(cw, 0, 0); | 403 wmove(cw, 0, 0); | 
| 400 wclrtoeol(cw); | 404 wclrtoeol(cw); | 
| 401 draw(cw); | 405 draw(cw); | 
| 402 mpos = 0; | 406 mpos = 0; | 
| 403 count = 0; | 407 count = 0; | 
| 635 in_shell = TRUE; | 639 in_shell = TRUE; | 
| 636 fflush(stdout); | 640 fflush(stdout); | 
| 637 /* | 641 /* | 
| 638 * Fork and do a shell | 642 * Fork and do a shell | 
| 639 */ | 643 */ | 
| 640 #ifndef __DJGPP__ | 644 md_shellescape(); | 
| 641 while((pid = fork()) < 0) | 645 printf("\n%s", retstr); | 
| 642 sleep(1); | 646 fflush(stdout); | 
| 643 if (pid == 0) { | 647 nonl(); | 
| 644 setuid(playuid); /* Set back to original user */ | 648 noecho(); | 
| 645 setgid(playgid); | 649 crmode(); | 
| 646 execl(sh == NULL ? "/bin/sh" : sh, "shell", "-i", 0); | 650 in_shell = FALSE; | 
| 647 perror("No shelly"); | 651 wait_for(cw, '\n'); | 
| 648 byebye(-1); | 652 restscr(cw); | 
| 649 } | |
| 650 else { | |
| 651 signal(SIGINT, SIG_IGN); | |
| 652 signal(SIGQUIT, SIG_IGN); | |
| 653 while (wait(&ret_status) != pid) | |
| 654 continue; | |
| 655 signal(SIGINT, quit); | |
| 656 signal(SIGQUIT, endit); | |
| 657 | |
| 658 #else | |
| 659 { | |
| 660 char shell[PATH_MAX]; | |
| 661 | |
| 662 if (sh && *sh) | |
| 663 strncpy(shell,sh,PATH_MAX); | |
| 664 else | |
| 665 sprintf(shell, "%s\\bin\\sh.exe", getenv("DJDIR")); | |
| 666 | |
| 667 if (spawnl(P_WAIT,shell, "shell", "-i", 0) == -1) | |
| 668 msg("No shelly: %s", shell); | |
| 669 | |
| 670 #endif | |
| 671 printf("\n%s", retstr); | |
| 672 fflush(stdout); | |
| 673 nonl(); | |
| 674 noecho(); | |
| 675 crmode(); | |
| 676 in_shell = FALSE; | |
| 677 wait_for(cw, '\n'); | |
| 678 restscr(cw); | |
| 679 } | |
| 680 } | 653 } | 
| 681 | 654 | 
| 682 | 655 | 
| 683 /* | 656 /* | 
| 684 * call: | 657 * call: | 
