[comp.unix.admin] Problems with execl

yakker@ucrmath.ucr.edu (matt robinson) (03/18/91)

In article <12602@ucrmath.ucr.edu> yakker@ucrmath.ucr.edu writes:
>The problem I'm having is that I need to start up a new /bin/csh from my
>/bin/eggsh, which is designed to keep the user 'guest' out of the machine
>if he is coming from an invalid host (and not from the console.)  The problem
>is in the function startup() in the code included here, which will hang from
>login.  The user with the /bin/eggsh who comes in from a valid host just hangs
>without going into a new /bin/csh.

Well, this was my own article, and I didn't have anyone reply to it (except
for two individuals, whose answers didn't work.)  Can someone out there come
up with any reasonable answer?  Is there any systems administrator willing
to put forth the effort and try this on their machine?

The suggestions given were to try execl("/bin/csh", "-csh", (char *)0),
or execl("/bin/csh", "-", (char *)0), both of which do not work.
I would appreciate your time and patience, and thanks again, NetLand!

--Matt

______________________________________________________________________________
Matt D. Robinson                                 "...if I only had a brain..."
Systems Programming Group, UC Riverside     -- The Scarecrow, The Wizard Of Oz
Internet : yakker@ucrmath.ucr.edu       UUCP : ..!ucsd!ucrmath!{yakker,source}


INCLUDED FILE AGAIN:
--------------------

------------BEGIN INCLUDED CODE------------BEGIN INCLUDED CODE-----------
/*
// Subject : Problems with execl("bin/csh", ...) in my OWN shell from login
*/
#include <stdio.h>
#include <utmp.h>

#define UTMP		"/etc/utmp"
#define ENTRY_MACH	"/etc/disabled"

#ifndef TRUE
#define TRUE		0
#define FALSE		1
#endif

#ifndef BUFSIZ
#define BUFSIZ		1024
#endif

int check_machines(char *host)
{
	FILE *fp;
	char *str;

	if ((fp = fopen(ENTRY_MACH, "r")) == NULL) return FALSE;
	while (!feof(fp))
	{
#ifndef lint
		str = (char *)malloc(BUFSIZ);
#else
		str = NULL;
#endif
		(void)fgets(str, BUFSIZ-1, fp);
		str[strlen(str) - 1] = '\0';
		if (!feof(fp))
		{
			if (!strcmp(host, str))
			{
				(void)fclose(fp); (void)free(str); return TRUE;
			}
		}
		(void)free(str);
	}
	(void)fclose(fp);
	return FALSE;
}

/*
// HERE IS THE PROBLEM.
*/
void startup()
{
	/*
	// Even if I do the execl("/bin/csh", ...) with a "-csh", or a "-",
	// it does not work.  WHY?
	*/
	(void)execl("/bin/csh","-csh",(char *)0); 
}
/*
// END PROBLEM
*/

int main() 
{ 
	FILE *fp;
	struct utmp ut;
	char *console = "console";

	if ((fp = fopen(UTMP, "r")) == NULL) startup();
	while (fread((char *)&ut, sizeof(struct utmp), 1, fp) == 1) 
	{
		if ((!strcmp(ut.ut_name, "guest")) && (strcmp(ut.ut_line, console)))
		{
			if (check_machines(ut.ut_host) == TRUE)
			{
				(void)fclose(fp);
				(void)fprintf(stderr, "No modem logins.\n");
				exit(1);
			}
		}
	}
	(void)fclose(fp);
	fprintf(stderr, "You look okay to me.  You can login.\n");
	startup();
}
-------------END INCLUDED CODE--------------END INCLUDED CODE------------