# HG changeset patch # User John "Elwin" Edwards # Date 1438532744 14400 # Node ID 7c059ec2a2c7b24651138bc3237b4dc5f4e095f3 # Parent 7f5f5f1ba09ca24ede48ad5badde2e6f0fe078fd# Parent db1c9a21a7c3164c842abed8ac527562fed748b7 Merge Super-Rogue fixes into the MSVC testing branch. diff -r 7f5f5f1ba09c -r 7c059ec2a2c7 srogue/global.c --- a/srogue/global.c Sat Aug 01 21:23:55 2015 -0400 +++ b/srogue/global.c Sun Aug 02 12:25:44 2015 -0400 @@ -54,6 +54,7 @@ int hungry_state = F_OKAY; /* How hungry is he */ int foodlev = 1; /* how fast he eats food */ int ringfood = 0; /* rings affect on food consumption */ +int scorefd = -1; /* Scoreboard file descriptor */ char take; /* Thing the rogue is taking */ char runch; /* Direction player is running */ char curpurch[15]; /* name of item ready to buy */ @@ -101,6 +102,8 @@ char callit[] = { "Call it: " }; char starlist[] = { " (* for a list)" }; +FILE *logfile = NULL; + struct coord oldpos; /* Pos before last look() call */ struct coord delta; /* Change indicated to get_dir() */ struct coord stairs; /* where the stairs are put */ diff -r 7f5f5f1ba09c -r 7c059ec2a2c7 srogue/main.c --- a/srogue/main.c Sat Aug 01 21:23:55 2015 -0400 +++ b/srogue/main.c Sun Aug 02 12:25:44 2015 -0400 @@ -34,6 +34,11 @@ #include "rogue.ext" +void open_records(void); + +extern int scorefd; +extern FILE *logfile; + main(argc, argv, envp) char **argv; char **envp; @@ -64,12 +69,15 @@ scorefile[LINLEN - 1] = '\0'; #else - strcpy(scorefile, homedir); + strncpy(scorefile, homedir, LINLEN-11); + if (scorefile[LINLEN-12] != '\0') + scorefile[0] = '\0'; if (*scorefile) strcat(scorefile,"/"); strcat(scorefile, "srogue.scr"); #endif + open_records(); if(argc >= 2 && strcmp(argv[1], "-s") == 0) { @@ -115,7 +123,7 @@ #endif if (!use_savedir) - md_droppriv(); + md_normaluser(); /* get home and options from environment */ @@ -438,23 +446,25 @@ char * roguehome() { - static char path[1024]; + static char path[LINLEN+16]; char *end,*home; if ( (home = getenv("ROGUEHOME")) != NULL) { if (*home) { - strncpy(path, home, PATH_MAX - 20); - - end = &path[strlen(path)-1]; - + /* LINLEN - 11 is all that will fit into scorefile */ + strncpy(path, home, LINLEN - 11); + if (path[LINLEN - 12] == '\0') + { + end = &path[strlen(path)-1]; + while( (end >= path) && ((*end == '/') || (*end == '\\'))) + *end-- = '\0'; - while( (end >= path) && ((*end == '/') || (*end == '\\'))) - *end-- = '\0'; - - if (directory_exists(path)) - return(path); + if (directory_exists(path)) + return(path); + } + /* Otherwise home was truncated and should be ignored */ } } @@ -472,3 +482,14 @@ return(NULL); } +void +open_records(void) +{ + if (scorefd < 0) + scorefd = open(scorefile, O_RDWR | O_CREAT, 0666); +#ifdef LOGFILE + if (logfile == NULL) + logfile = fopen(LOGFILE, "a"); +#endif +} + diff -r 7f5f5f1ba09c -r 7c059ec2a2c7 srogue/mdport.c --- a/srogue/mdport.c Sat Aug 01 21:23:55 2015 -0400 +++ b/srogue/mdport.c Sun Aug 02 12:25:44 2015 -0400 @@ -1533,41 +1533,6 @@ #endif } -void -md_droppriv(void) -{ -#if defined(HAVE_GETUID) - uid_t realuid = getuid(); - -#if defined(HAVE_SETRESUID) - if (setresuid(-1, realuid, realuid) != 0) { -#elif defined (HAVE_SETREUID) - if (setreuid(realuid, realuid) != 0) { -#elif defined (HAVE_SETUID) - if (setuid(realuid) != 0) { -#else - if (0) { -#endif - printf("Cannot change to effective uid: %d\n", realuid); - exit(1); - } -#endif -} - -extern uid_t playuid; -extern gid_t playgid; - -void -md_resetpriv(void) -{ -#if defined (HAVE_SETUID) - setuid(playuid); -#endif -#if defined (HAVE_SETGID) - setgid(playgid); -#endif -} - int md_random(void) { diff -r 7f5f5f1ba09c -r 7c059ec2a2c7 srogue/rip.c --- a/srogue/rip.c Sat Aug 01 21:23:55 2015 -0400 +++ b/srogue/rip.c Sun Aug 02 12:25:44 2015 -0400 @@ -47,6 +47,9 @@ #define RIP_LINES (sizeof rip / (sizeof (char *))) +extern int scorefd; +extern FILE *logfile; + char *killname(); void writelog(int amount, int aflag, char monst); @@ -140,7 +143,7 @@ /* * Open file and read list */ - if ((fd = open(scorefile, O_RDWR | O_CREAT, 0666)) < 0) + if ((fd = scorefd) < 0) return; outf = (FILE *) fdopen(fd, "w"); for (scp = top_ten; scp <= &top_ten[9]; scp++) { @@ -221,11 +224,12 @@ { char logmessage[220], ltemp[80], mlev[40]; char *killer; - FILE *logfi; if (waswizard) return; #ifdef LOGFILE + if (logfile == NULL) + return; sprintf(logmessage, "%d %d %s %d ", time(NULL), amount, whoami, him->s_lvl); if (amulet) @@ -247,11 +251,8 @@ else return; strcat(logmessage, ltemp); - logfi = fopen(LOGFILE, "a"); - if (logfi == NULL) - return; - fprintf(logfi, "%s", logmessage); - fclose(logfi); + fprintf(logfile, "%s", logmessage); + fclose(logfile); #endif return; } diff -r 7f5f5f1ba09c -r 7c059ec2a2c7 srogue/rogue.h --- a/srogue/rogue.h Sat Aug 01 21:23:55 2015 -0400 +++ b/srogue/rogue.h Sun Aug 02 12:25:44 2015 -0400 @@ -69,8 +69,6 @@ void md_onsignal_default(void); int md_issymlink(char *sp); long md_memused(void); -void md_droppriv(void); -void md_resetpriv(void); int md_random(void); void md_srandom(unsigned int seed); char *xcrypt(const char *key, const char *setting); diff -r 7f5f5f1ba09c -r 7c059ec2a2c7 srogue/save.c --- a/srogue/save.c Sat Aug 01 21:23:55 2015 -0400 +++ b/srogue/save.c Sun Aug 02 12:25:44 2015 -0400 @@ -131,17 +131,13 @@ /* * dosave: - * Set UID back to user and save the game + * Save the game. UID/GID no longer get reset here. */ dosave() { FILE *savef; ignore(); - if (!use_savedir) - { - md_resetpriv(); - } umask(022); if (file_name[0] != '\0') { @@ -287,50 +283,12 @@ #endif if (!wizard) { -#if defined(HAVE_WORKING_FORK) - endwin(); - if (!use_savedir) - { - while((pid = fork()) < 0) - sleep(1); - - /* set id to unlink file */ - if(pid == 0) - { - md_resetpriv(); - unlink(file); - exit(0); - } - /* wait for unlink to finish */ - else - { - while(wait(&ret_status) != pid) - continue; - if (ret_status < 0) - { - printf("Cannot unlink file\n"); - return FALSE; - } - } - } - else - { - /* Don't drop privileges, they're needed - * for the unlink. */ - if (unlink(file) < 0) - { - printf("Cannot unlink file\n"); - return FALSE; - } - } -#else if (unlink(file) < 0) { + endwin(); printf("Cannot unlink file\n"); return FALSE; } -#endif - } if (him->s_hpt <= 0) {