It kind of works now. However, we must beware the static buffers that we made

before. They might no longer be enough.


git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@83 db0b04b0-f4d1-0310-9a6d-de3e77497b0e
This commit is contained in:
Joshua Kwan 2004-01-05 01:55:08 +00:00
parent 6901a281a0
commit 4f6bec9c0a
3 changed files with 55 additions and 32 deletions

View File

@ -50,6 +50,7 @@ KeyPair: KeyType '=' TYPE_VALUE {
switch ($1) switch ($1)
{ {
case TYPE_SGROUP: case TYPE_SGROUP:
myconfig->shed_group = strdup($3);
if ((gr = getgrnam($3)) != NULL) if ((gr = getgrnam($3)) != NULL)
myconfig->shed_gid = gr->gr_gid; myconfig->shed_gid = gr->gr_gid;
else else
@ -57,6 +58,7 @@ KeyPair: KeyType '=' TYPE_VALUE {
break; break;
case TYPE_SUSER: case TYPE_SUSER:
myconfig->shed_user = strdup($3);
if ((usr = getpwnam($3)) != NULL) if ((usr = getpwnam($3)) != NULL)
myconfig->shed_uid = usr->pw_uid; myconfig->shed_uid = usr->pw_uid;
else else

View File

@ -219,7 +219,7 @@ gen_inprogress_lock (pid_t pid)
fl.l_start = 0; fl.l_start = 0;
fl.l_len = 0; fl.l_len = 0;
snprintf (lockfile, 130, "%s%s:%s", LOC_INPROGRESSDIR, snprintf (lockfile, 130, "%sinprogress/%s:%s", myconfig->dglroot,
me->username, ttyrec_filename); me->username, ttyrec_filename);
fd = open (lockfile, O_WRONLY | O_CREAT, 0644); fd = open (lockfile, O_WRONLY | O_CREAT, 0644);
@ -253,18 +253,19 @@ loadbanner (struct dg_banner *ban)
memset (buf, 0, 80); memset (buf, 0, 80);
bannerfile = fopen (LOC_BANNER, "r"); bannerfile = fopen (myconfig->banner, "r");
if (!bannerfile) if (!bannerfile)
{ {
size_t len;
ban->len = 2; ban->len = 2;
ban->lines = malloc (sizeof (char *)); ban->lines = malloc (sizeof (char *));
ban->lines[0] = ban->lines[0] =
strdup ("### dgamelaunch " VERSION strdup ("### dgamelaunch " VERSION
" - network console game launcher"); " - network console game launcher");
ban->lines[1] = len = strlen(myconfig->banner) + ARRAY_SIZE("### NOTE: administrator has not installed a file");
strdup ban->lines[1] = malloc(len);
("### NOTE: administrator has not installed a " LOC_BANNER " file"); snprintf(ban->lines[1], len, "### NOTE: administrator has not installed a %s file", myconfig->banner);
return; return;
} }
@ -341,9 +342,10 @@ populate_games (int *l)
struct dirent *pdirent; struct dirent *pdirent;
struct stat pstat; struct stat pstat;
char fullname[130], ttyrecname[130]; char fullname[130], ttyrecname[130];
char *replacestr; char *replacestr, *dir;
struct dg_game **games = NULL; struct dg_game **games = NULL;
struct flock fl = { 0 }; struct flock fl = { 0 };
size_t slen;
fl.l_type = F_WRLCK; fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET; fl.l_whence = SEEK_SET;
@ -352,7 +354,11 @@ populate_games (int *l)
len = 0; len = 0;
if (!(pdir = opendir (LOC_INPROGRESSDIR))) slen = strlen(myconfig->dglroot) + ARRAY_SIZE("inprogress/") + 1;
dir = malloc(slen);
snprintf(dir, slen, "%sinprogress/", myconfig->dglroot);
if (!(pdir = opendir (dir)))
graceful_exit (140); graceful_exit (140);
while ((pdirent = readdir (pdir))) while ((pdirent = readdir (pdir)))
@ -360,7 +366,7 @@ populate_games (int *l)
if (!strcmp (pdirent->d_name, ".") || !strcmp (pdirent->d_name, "..")) if (!strcmp (pdirent->d_name, ".") || !strcmp (pdirent->d_name, ".."))
continue; continue;
snprintf (fullname, 130, "%s%s", LOC_INPROGRESSDIR, pdirent->d_name); snprintf (fullname, 130, "%sinprogress/%s", myconfig->dglroot, pdirent->d_name);
fd = 0; fd = 0;
/* O_RDWR here should be O_RDONLY, but we need to test for /* O_RDWR here should be O_RDONLY, but we need to test for
@ -370,7 +376,7 @@ populate_games (int *l)
{ {
/* stat to check idle status */ /* stat to check idle status */
snprintf (ttyrecname, 130, "%s%s", LOC_TTYRECDIR, pdirent->d_name); snprintf (ttyrecname, 130, "%sttyrec/%s", myconfig->dglroot, pdirent->d_name);
replacestr = strchr (ttyrecname, ':'); replacestr = strchr (ttyrecname, ':');
if (!replacestr) if (!replacestr)
graceful_exit (145); graceful_exit (145);
@ -482,7 +488,7 @@ inprogressmenu ()
if ((menuchoice - 97) >= 0 && (menuchoice - 97) < i) if ((menuchoice - 97) >= 0 && (menuchoice - 97) < i)
{ {
/* valid choice has been made */ /* valid choice has been made */
snprintf (ttyrecname, 130, "%s%s", LOC_TTYRECDIR, snprintf (ttyrecname, 130, "%sttyrec/%s", myconfig->dglroot,
games[menuchoice - 97]->ttyrec_fn); games[menuchoice - 97]->ttyrec_fn);
chosen_name = strdup (games[menuchoice - 97 + offset]->name); chosen_name = strdup (games[menuchoice - 97 + offset]->name);
@ -591,10 +597,10 @@ domailuser (char *username)
assert (loggedin); assert (loggedin);
len = ARRAY_SIZE (LOC_SPOOLDIR) + strlen (username) + 1; len = strlen(myconfig->spool) + strlen (username) + 1;
spool_fn = malloc (len + 1); spool_fn = malloc (len + 1);
time (&now); time (&now);
snprintf (spool_fn, len, "%s/%s", LOC_SPOOLDIR, username); snprintf (spool_fn, len, "%s/%s", myconfig->spool, username);
/* print the enter your message line */ /* print the enter your message line */
clear (); clear ();
@ -806,7 +812,7 @@ loginprompt ()
if (passwordgood (pw_buf)) if (passwordgood (pw_buf))
{ {
loggedin = 1; loggedin = 1;
snprintf (rcfilename, 80, "%s%s.nethackrc", LOC_DGLDIR, me->username); snprintf (rcfilename, 80, "%srcfiles/%s.nethackrc", myconfig->dglroot, me->username);
} }
} }
@ -916,7 +922,7 @@ newuser ()
loggedin = 1; loggedin = 1;
snprintf (rcfilename, 80, "%s%s.nethackrc", LOC_DGLDIR, me->username); snprintf (rcfilename, 80, "%srcfiles/%s.nethackrc", myconfig->dglroot, me->username);
write_canned_rcfile (rcfilename); write_canned_rcfile (rcfilename);
writefile (1); writefile (1);
@ -1068,8 +1074,12 @@ void
write_canned_rcfile (char *target) write_canned_rcfile (char *target)
{ {
FILE *canned, *newfile; FILE *canned, *newfile;
char buf[1024]; char buf[1024], *rfn;
size_t bytes; size_t bytes, len;
len = strlen(myconfig->dglroot) + strlen(myconfig->rcfile) + 1;
rfn = malloc(len);
snprintf (rfn, len, "%s%s", myconfig->dglroot, myconfig->rcfile);
if (!(newfile = fopen (target, "w"))) if (!(newfile = fopen (target, "w")))
{ {
@ -1081,9 +1091,11 @@ write_canned_rcfile (char *target)
return; return;
} }
if (!(canned = fopen (LOC_CANNED, "r"))) if (!(canned = fopen (rfn, "r")))
goto bail; goto bail;
free(rfn);
while ((bytes = fread (buf, 1, 1024, canned)) > 0) while ((bytes = fread (buf, 1, 1024, canned)) > 0)
{ {
if (fwrite (buf, 1, bytes, newfile) != bytes) if (fwrite (buf, 1, bytes, newfile) != bytes)
@ -1213,10 +1225,19 @@ purge_stale_locks (void)
{ {
DIR *pdir; DIR *pdir;
struct dirent *dent; struct dirent *dent;
char* dir;
size_t len;
if (!(pdir = opendir (LOC_INPROGRESSDIR))) len = strlen(myconfig->dglroot) + ARRAY_SIZE("inprogress/") + 1;
dir = malloc(len);
snprintf(dir, len, "%sinprogress/", myconfig->dglroot);
if (!(pdir = opendir (dir)))
graceful_exit (200); graceful_exit (200);
free(dir);
while ((dent = readdir (pdir)) != NULL) while ((dent = readdir (pdir)) != NULL)
{ {
FILE *ipfile; FILE *ipfile;
@ -1237,10 +1258,10 @@ purge_stale_locks (void)
if (strncmp (dent->d_name, me->username, colon - dent->d_name)) if (strncmp (dent->d_name, me->username, colon - dent->d_name))
continue; continue;
len = strlen (dent->d_name) + ARRAY_SIZE (LOC_INPROGRESSDIR) + 1; len = strlen (dent->d_name) + strlen(myconfig->dglroot) + 12;
fn = malloc (len); fn = malloc (len);
snprintf (fn, len, "%s%s", LOC_INPROGRESSDIR, dent->d_name); snprintf (fn, len, "%sinprogress/%s", myconfig->dglroot, dent->d_name);
if (!(ipfile = fopen (fn, "r"))) if (!(ipfile = fopen (fn, "r")))
graceful_exit (202); graceful_exit (202);
@ -1300,14 +1321,14 @@ int
main (void) main (void)
{ {
/* for chroot and program execution */ /* for chroot and program execution */
uid_t newuid = SHED_UID;
gid_t newgid = SHED_GID;
char atrcfilename[81], *spool; char atrcfilename[81], *spool;
unsigned int len; unsigned int len;
struct rlimit rl = { RLIM_INFINITY, RLIM_INFINITY }; struct rlimit rl = { RLIM_INFINITY, RLIM_INFINITY };
int userchoice = 0; int userchoice = 0;
create_config();
/* coredumper */ /* coredumper */
setrlimit (RLIMIT_CORE, &rl); setrlimit (RLIMIT_CORE, &rl);
@ -1327,7 +1348,7 @@ main (void)
/* chroot */ /* chroot */
if (chroot (LOC_CHROOT)) if (chroot (myconfig->chroot))
{ {
perror ("cannot change root directory"); perror ("cannot change root directory");
graceful_exit (1); graceful_exit (1);
@ -1340,19 +1361,19 @@ main (void)
} }
/* shed privs. this is done immediately after chroot. */ /* shed privs. this is done immediately after chroot. */
if (setgroups (1, &newgid) == -1) if (setgroups (1, &myconfig->shed_gid) == -1)
{ {
perror ("setgroups"); perror ("setgroups");
graceful_exit (1); graceful_exit (1);
} }
if (setgid (newgid) == -1) if (setgid (myconfig->shed_gid) == -1)
{ {
perror ("setgid"); perror ("setgid");
graceful_exit (1); graceful_exit (1);
} }
if (setuid (newuid) == -1) if (setuid (myconfig->shed_uid) == -1)
{ {
perror ("setuid"); perror ("setuid");
graceful_exit (1); graceful_exit (1);
@ -1404,9 +1425,9 @@ main (void)
/* environment */ /* environment */
snprintf (atrcfilename, 81, "@%s", rcfilename); snprintf (atrcfilename, 81, "@%s", rcfilename);
len = ARRAY_SIZE (LOC_SPOOLDIR) + strlen (me->username) + 1; len = strlen(myconfig->spool) + strlen (me->username) + 1;
spool = malloc (len + 1); spool = malloc (len + 1);
snprintf (spool, len, "%s/%s", LOC_SPOOLDIR, me->username); snprintf (spool, len, "%s/%s", myconfig->spool, me->username);
setenv ("NETHACKOPTIONS", atrcfilename, 1); setenv ("NETHACKOPTIONS", atrcfilename, 1);
setenv ("MAIL", spool, 1); setenv ("MAIL", spool, 1);

View File

@ -109,12 +109,12 @@ ttyrec_main (char *username)
void finish (); void finish ();
char dirname[100]; char dirname[100];
snprintf (dirname, 100, "%s%s", LOC_TTYRECDIR, username); snprintf (dirname, 100, "%sttyrec/%s", myconfig->dglroot, username);
if (access (dirname, F_OK) != 0) if (access (dirname, F_OK) != 0)
mkdir (dirname, 0755); mkdir (dirname, 0755);
snprintf (dirname, 100, "%s%s/%s", LOC_TTYRECDIR, username, snprintf (dirname, 100, "%sttyrec/%s/%s", myconfig->dglroot, username,
ttyrec_filename); ttyrec_filename);
if ((fscript = fopen (dirname, "w")) == NULL) if ((fscript = fopen (dirname, "w")) == NULL)
@ -291,7 +291,7 @@ dooutput ()
void void
doshell (char *username) doshell (char *username)
{ {
char *argv1 = LOC_NETHACK; char *argv1 = myconfig->nethack;
char *argv2 = "-u"; char *argv2 = "-u";
char *myargv[10]; char *myargv[10];
@ -308,7 +308,7 @@ doshell (char *username)
myargv[2] = username; myargv[2] = username;
myargv[3] = 0; myargv[3] = 0;
execvp (LOC_NETHACK, myargv); execvp (myconfig->nethack, myargv);
fail (); fail ();
} }