srogue: add and use more md_* portable functions.

Privileges and memory usage checks are now more portable.
This commit is contained in:
John "Elwin" Edwards 2014-05-02 15:06:23 -07:00
parent 791df4324f
commit b9cc9cf3a7
6 changed files with 74 additions and 22 deletions

View file

@ -173,5 +173,5 @@ do_fuses()
activity()
{
msg("Daemons = %d : Memory Items = %d : Memory Used = %d",
demoncnt,total,sbrk(0));
demoncnt,total,md_memused());
}

View file

@ -102,7 +102,7 @@ int size;
register char *space = ALLOC(size);
if (space == NULL) {
sprintf(prbuf,"Rogue ran out of memory (%d).",sbrk(0));
sprintf(prbuf,"Rogue ran out of memory (%d).", md_memused());
fatal(prbuf);
}
total++;

View file

@ -29,8 +29,6 @@
#endif
#ifdef BSD
#define srand48(seed) srandom(seed)
#define lrand48() random()
#include <sys/time.h>
#endif
@ -57,13 +55,8 @@ char **envp;
if (homedir == NULL)
homedir = "";
playuid = getuid();
if (setuid(playuid) < 0) {
printf("Cannot change to effective uid: %d\n", playuid);
exit(1);
}
playgid = getgid();
playuid = md_getuid();
playgid = md_getgid();
/* check for print-score option */
#ifdef SCOREFILE
@ -121,6 +114,9 @@ char **envp;
}
#endif
if (!use_savedir)
md_droppriv();
/* get home and options from environment */
if ((env = getenv("HOME")) != NULL)
@ -177,7 +173,7 @@ char **envp;
fflush(stdout);
seed = dnum;
srand48(seed); /* init rnd number gen */
srandom(seed); /* init rnd number gen */
md_onsignal_exit(); /* just in case */
@ -358,7 +354,7 @@ int range;
if (range == 0)
wh = 0;
else {
wh = lrand48() % range;
wh = random() % range;
wh &= 0x7FFFFFFF;
}
return wh;

View file

@ -413,6 +413,16 @@ md_getuid(void)
#endif
}
gid_t
md_getgid(void)
{
#ifdef HAVE_GETGID
return( getgid() );
#else
return(42);
#endif
}
pid_t
md_getpid(void)
{
@ -1509,3 +1519,51 @@ md_stop_checkout_timer(void)
#endif
long
md_memused(void)
{
#ifdef _WIN32
MEMORYSTATUS stat;
GlobalMemoryStatus(&stat);
return((long)stat.dwTotalPageFile);
#else
return( (long)sbrk(0) );
#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
}

View file

@ -43,6 +43,7 @@ int md_erasechar(void);
char *md_gethomedir(void);
char *md_getusername(void);
uid_t md_getuid(void);
gid_t md_getgid(void);
char *md_getpass(char *prompt);
pid_t md_getpid(void);
char *md_getrealname(uid_t uid);
@ -67,6 +68,9 @@ void md_onsignal_autosave(void);
void md_onsignal_exit(void);
void md_onsignal_default(void);
int md_issymlink(char *sp);
long md_memused(void);
void md_droppriv(void);
void md_resetpriv(void);
char *xcrypt(const char *key, const char *setting);
#define reg register /* register abbr. */

View file

@ -26,10 +26,6 @@
#include "rogue.h"
#include "rogue.ext"
#ifdef BSD
#define srand48(seed) srandom(seed)
#endif
EXTCHAR version[];
EXTCHAR *ctime();
@ -144,8 +140,7 @@ dosave()
ignore();
if (!use_savedir)
{
setuid(playuid);
setgid(playgid);
md_resetpriv();
}
umask(022);
@ -302,8 +297,7 @@ char *file, **envp;
/* set id to unlink file */
if(pid == 0)
{
setuid(playuid);
setgid(playgid);
md_resetpriv();
unlink(file);
exit(0);
}
@ -350,6 +344,6 @@ char *file, **envp;
strcpy(file_name, file);
setup();
restscr(cw);
srand48(getpid());
srandom(getpid());
playit();
}