Subject: Re: how to get an elf system from the 2.0.35 redhat installation?

From: Peter Teichmann <[email-masked]>
Date: Tue, 27 Apr 1999 16:26:19 +0000

In message <[email-masked]>
          Philip Blundell <[email-masked]> wrote:

> >Hm. That works. The kernel now boots (but switchs to 640x480, how can I
> >let it take other video modes?).
> 
> If you're using a NetWinder, see Rod's reply.  If it's a RiscPC (which I'd got 
> the idea it was for some reason), look at acornfb.c not cyber2000fb.c.

Well it is a riscpc, I said it in the very first mail. I also already found
that, and the 12x22 Sun font on 1152x864 pixels looks much nicer ... But it
does not help much if it does not let me login !
 
> >Unfortunately it does not let me login,
> >if I type in the password it writes a line, deletes the screen and shows the
> >login screen again.
> 
> Did you include the FP emulator and all that good stuff?  The old binary module 
> that you used with 2.0 won't work; you should probably compile NWFPE into the kernel 
> instead.
>
> >But I have another problem with the new kernel: It does not want to load
> >the modules, for instance the fpemulator because they have a wrong kernel
> >version. They are 2.0.59 it says, strange.
> 
> You cannot mix modules and kernels freely.  In general it will work most of 
> the time to load modules on a kernel with the same major revision (eg modules 
> >from 2.2.5 would work on a 2.2.6 kernel) but between 2.0 and 2.2 there is 
> basically no hope.  You must install the modules that were built with the 
> new kernel.  If you don't have source and can't get updated binaries you are 
> out of luck.

Well I compiled the kernel and the modules by myself, but I did not know
that I need a new FPEmulator. So I downloaded it from ftp.arm.linux.org.uk.
Now it complains no more about wrong versions, but does not print something
about the fpe module loaded as the old kernel did. It also does not let me
login. I also included nwfpe as module, but it did not help. I also compiled
a kernel with all things included, not as modules, but that had also no
effect. If I tell you that compiling a kernel lasts about 1.5 hours on
my RiscPC you know that I wasted a lot of time for nothing.

Another thing I noticed is that there is no module dependencies file in
/lib/modules/2.2.3 as is in 2.0.35. Can that be the problem? But if yes
how do I get it there?

Another problem is: how do I change the link to the fpe module to the old
fpe module so that I can boot again with my 2.0.35 kernel? My solution was
until now doing an update via ftp.arm.linux.org.uk and the installation
disks, but that also lasts some time.

Perhaps it would be a good idea to tell the people and me how to configure
a kernel that will run on a riscpc. How can I know what is needed?

-- 
Peter Teichmann

----------------------------------------------------------------------------
Email: [email-masked]  WWW: rcswww.urz.tu-dresden.de/~teich-p

unsubscribe: body of `unsubscribe linux-arm' to [email-masked]

---

From: [email-masked]
Date: Tue, 27 Apr 1999 17:59:42 +0100

>login. I also included nwfpe as module, but it did not help. I also compiled

Unless you have a really pressing reason to want the floating point emulator 
as a module, just compile it statically into the kernel.  That way you will 
avoid all sorts of grief associated with loading the right module and having 
enough of an environment available to execute insmod.

>/lib/modules/2.2.3 as is in 2.0.35. Can that be the problem? But if yes

depmod -a

p.

---

From: Peter Danielsson <[email-masked]>
Date: Wed, 28 Apr 1999 07:30:49 +0000

> my RiscPC you know that I wasted a lot of time for nothing.

I recognize this problem! I too had some troubles with login, and it
seemed
impossible to get a working version (I compiled two or three myself,
downloaded
precompiled binaries and nothing helped.) After a while I begun to
supect
glibc for having a bug so I rewrote login to use some other routines for
accessing /etc/passwd. My modified login is attached to this message.
(only the .c file, it is taken from linux-utils-2.9i )

/Peter

/* This program is derived from 4.3 BSD software and is
   subject to the copyright notice below.
   
   The port to HP-UX has been motivated by the incapability
   of 'rlogin'/'rlogind' as per HP-UX 6.5 (and 7.0) to transfer window sizes.
   
   Changes:
   
   - General HP-UX portation. Use of facilities not available
     in HP-UX (e.g. setpriority) has been eliminated.
     Utmp/wtmp handling has been ported.
   
   - The program uses BSD command line options to be used
     in connection with e.g. 'rlogind' i.e. 'new login'.
   
   - HP features left out:          logging of bad login attempts in /etc/btmp,
                                    they are sent to syslog
   
				    password expiry
   
				    '*' as login shell, add it if you need it

   - BSD features left out:         quota checks
   	                            password expiry
				    analysis of terminal type (tset feature)
   
   - BSD features thrown in:        Security logging to syslogd.
                                    This requires you to have a (ported) syslog
				    system -- 7.0 comes with syslog
   
				    'Lastlog' feature.
   
   - A lot of nitty gritty details has been adjusted in favour of
     HP-UX, e.g. /etc/securetty, default paths and the environment
     variables assigned by 'login'.
   
   - We do *nothing* to setup/alter tty state, under HP-UX this is
     to be done by getty/rlogind/telnetd/some one else.
   
   Michael Glad ([email-masked])
   Computer Science Department
   Aarhus University
   Denmark
   
   1990-07-04
   
   1991-09-24 [email-masked]: HP-UX 8.0 port:
   - now explictly sets non-blocking mode on descriptors
   - strcasecmp is now part of HP-UX

   1992-02-05 [email-masked]: Ported the stuff to Linux 0.12
   From 1992 till now (1997) this code for Linux has been maintained at
   ftp.daimi.aau.dk:/pub/linux/poe/
 */

/*
 * Copyright (c) 1980, 1987, 1988 The Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/*
 * login [ name ]
 * login -h hostname	(for telnetd, etc.)
 * login -f name	(for pre-authenticated login: datakit, xterm, etc.)
 */

/* #define TESTING */

#ifdef TESTING
#include "param.h"
#else
#include <sys/param.h>
#endif

#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <getopt.h>
#include <memory.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/file.h>
#include <termios.h>
#include <string.h>
#define index strchr
#define rindex strrchr
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
#include <grp.h>
#include <pwd.h>
#include <utmp.h>
#include <setjmp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/syslog.h>
#include <sys/sysmacros.h>
#include <netdb.h>
#include "my_crypt.h"

#ifdef __linux__
#  include <sys/sysmacros.h>
#  include <linux/major.h>
#endif

#ifdef TESTING
#  include "utmp.h"
#else
#  include <utmp.h>
#endif

#ifdef SHADOW_PWD
#  include <shadow.h>
#endif

#ifdef USE_PAM
#  include <security/pam_appl.h>
#  include <security/pam_misc.h>
#  define PAM_MAX_LOGIN_TRIES	3
#  define PAM_FAIL_CHECK if (retcode != PAM_SUCCESS) { \
       fprintf(stderr,"\n%s\n",pam_strerror(pamh, retcode)); \
       syslog(LOG_ERR,"%s",pam_strerror(pamh, retcode)); \
       pam_end(pamh, retcode); exit(1); \
   }
#  define PAM_END { retcode = pam_close_session(pamh,0); \
		    pam_end(pamh,retcode); }
#endif

#ifndef __linux__
#  include <tzfile.h>
#endif
#include <lastlog.h>

#define SLEEP_EXIT_TIMEOUT 5

#ifdef __linux__
#define DO_PS_FIDDLING
#endif

#ifdef DO_PS_FIDDLING
#include "setproctitle.h"
#endif

#if 0
/* from before we had a lastlog.h file in linux */
struct  lastlog
{ long ll_time;
  char ll_line[12];
  char ll_host[16];
};
#endif

#include "pathnames.h"

#define P_(s) ()
void opentty P_((const char *tty));
void getloginname P_((void));
void timedout P_((void));
int rootterm P_((char *ttyn));
void motd P_((void));
void sigint P_((void));
void checknologin P_((void));
void dolastlog P_((int quiet));
void badlogin P_((const char *name));
char *stypeof P_((char *ttyid));
void checktty P_((char *user, char *tty, struct passwd *pwd));
void sleepexit P_((int eval));
#ifdef CRYPTOCARD
int cryptocard P_((void));
#endif
#undef P_

#ifdef	KERBEROS
#include <kerberos/krb.h>
#include <sys/termios.h>
char	realm[REALM_SZ];
int	kerror = KSUCCESS, notickets = 1;
#endif

#ifdef USE_TTY_GROUP
#  define TTY_MODE 0620
#else
#  define TTY_MODE 0600
#endif

#define	TTYGRPNAME	"tty"		/* name of group to own ttys */
/**#  define TTYGRPNAME      "other" **/

#ifndef MAXPATHLEN
#  define MAXPATHLEN 1024
#endif

/*
 * This bounds the time given to login.  Not a define so it can
 * be patched on machines where it's too small.
 */
#ifndef __linux__
int	timeout = 300;
#else
int     timeout = 60;
#endif

struct	passwd *pwd;
int	failures = 1;
char	term[64], *hostname, *username, *tty;
struct  hostent hostaddress;
char	thishost[100];

#ifndef __linux__
struct	sgttyb sgttyb;
struct	tchars tc = {
    CINTR, CQUIT, CSTART, CSTOP, CEOT, CBRK
  };
struct	ltchars ltc = {
    CSUSP, CDSUSP, CRPRNT, CFLUSH, CWERASE, CLNEXT
  };
#endif

const char *months[] =
{ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
    "Sep", "Oct", "Nov", "Dec" };

/* provided by Linus Torvalds 16-Feb-93 */
void 
opentty(const char * tty)
{
    int i;
    int fd = open(tty, O_RDWR);
    
    for (i = 0 ; i < fd ; i++)
      close(i);
    for (i = 0 ; i < 3 ; i++)
      dup2(fd, i);
    if (fd >= 3)
      close(fd);
}

/* true if the filedescriptor fd is a console tty, very Linux specific */
static int
consoletty(int fd)
{
#ifdef __linux__
    struct stat stb;

    if ((fstat(fd, &stb) >= 0) 
	&& (major(stb.st_rdev) == TTY_MAJOR)
	&& (minor(stb.st_rdev) < 64)) {
	return 1;
    }
#endif
    return 0;
}

#define GETPWNAM my_getpwnam

struct passwd *my_getpwnam(const char *name)
{
	FILE *smurf;
	struct passwd *pwd;
	smurf = fopen("/etc/passwd", "r");
	do{
		pwd = fgetpwent(smurf);
	}while( pwd && strcmp(name, pwd->pw_name));
	fclose(smurf);
	return pwd;
}

int
main(int argc, char **argv)
{
    extern int errno, optind;
    extern char *optarg, **environ;
    struct group *gr;
    register int ch;
    register char *p;
    int ask, fflag, hflag, pflag, cnt;
    int quietlog, passwd_req;
    char *domain, *ttyn;
    char tbuf[MAXPATHLEN + 2], tname[sizeof(_PATH_TTY) + 10];
    char *ctime(), *ttyname(), *stypeof();
    time_t time();
    void timedout();
    char *termenv;
    char vcsn[20], vcsan[20];
    char * childArgv[10];
    char * buff;
    int childArgc = 0;
#ifdef USE_PAM
    int retcode;
    pam_handle_t *pamh = NULL;
    struct pam_conv conv = { misc_conv, NULL };
    pid_t childPid;
    void (*oldSigHandler) ();
#else
    char *salt, *pp;
#endif
#ifndef __linux__
    int ioctlval;
#endif

    signal(SIGALRM, timedout);
    alarm((unsigned int)timeout);
    signal(SIGQUIT, SIG_IGN);
    signal(SIGINT, SIG_IGN);
    
    setpriority(PRIO_PROCESS, 0, 0);
#ifdef HAVE_QUOTA
    quota(Q_SETUID, 0, 0, 0);
#endif
#ifdef DO_PS_FIDDLING
    initproctitle(argc, argv);
#endif
    
    /*
     * -p is used by getty to tell login not to destroy the environment
     * -f is used to skip a second login authentication 
     * -h is used by other servers to pass the name of the remote
     *    host to login so that it may be placed in utmp and wtmp
     */
    gethostname(tbuf, sizeof(tbuf));
    strncpy(thishost, tbuf, sizeof(thishost)-1);
    thishost[sizeof(thishost)-1] = 0;
    domain = index(tbuf, '.');
    
    username = tty = hostname = NULL;
    fflag = hflag = pflag = 0;
    passwd_req = 1;

    while ((ch = getopt(argc, argv, "fh:p")) != EOF)
      switch (ch) {
	case 'f':
	  fflag = 1;
	  break;
	  
	case 'h':
	  if (getuid()) {
	      fprintf(stderr,
		      "login: -h for super-user only.\n");
	      exit(1);
	  }
	  hflag = 1;
	  if (domain && (p = index(optarg, '.')) &&
	      strcasecmp(p, domain) == 0)
	    *p = 0;
	  hostname = optarg;
	  { 
	      struct hostent *he = gethostbyname(hostname);
	      if (he) {
		  memcpy(&hostaddress, he, sizeof(hostaddress));
	      } else {
		  memset(&hostaddress, 0, sizeof(hostaddress));
	      }
	  }
	  break;
	  
	case 'p':
	  pflag = 1;
	  break;

	case '?':
	default:
	  fprintf(stderr,
		  "usage: login [-fp] [username]\n");
	  exit(1);
      }
    argc -= optind;
    argv += optind;
    if (*argv) {
	char *p = *argv;
	username = strdup(p);
	ask = 0;
	/* wipe name - some people mistype their password here */
	/* (of course we are too late, but perhaps this helps a little ..) */
	while(*p)
	    *p++ = ' ';
    } else
      ask = 1;
    
#ifndef __linux__
    #warning wrong code compiled
    ioctlval = 0;
    ioctl(0, TIOCLSET, &ioctlval);
    ioctl(0, TIOCNXCL, 0);
    fcntl(0, F_SETFL, ioctlval);
    ioctl(0, TIOCGETP, &sgttyb);
    sgttyb.sg_erase = CERASE;
    sgttyb.sg_kill = CKILL;
    ioctl(0, TIOCSLTC, &ltc);
    ioctl(0, TIOCSETC, &tc);
    ioctl(0, TIOCSETP, &sgttyb);
    
    /*
     * Be sure that we're in
     * blocking mode!!!
     * This is really for HPUX
     */
    ioctlval = 0;
    ioctl(0, FIOSNBIO, &ioctlval);
#endif /* ! __linux__ */
    
    for (cnt = getdtablesize(); cnt > 2; cnt--)
      close(cnt);
    
    ttyn = ttyname(0);
    if (ttyn == NULL || *ttyn == '\0') {
	/* no snprintf required - see definition of tname */
	sprintf(tname, "%s??", _PATH_TTY);
	ttyn = tname;
    }

    /* find names of Virtual Console devices, for later mode change */
    {
	char *p = ttyn;
	/* find number of tty */
	while (*p && !isdigit(*p)) p++;

	strcpy(vcsn, "/dev/vcs"); strcat(vcsn, p);
	strcpy(vcsan, "/dev/vcsa"); strcat(vcsan, p);
    }

    setpgrp();
    
    {
	struct termios tt, ttt;
	
	tcgetattr(0, &tt);
	ttt = tt;
	ttt.c_cflag &= ~HUPCL;
	
	if((chown(ttyn, 0, 0) == 0) && (chmod(ttyn, 0622) == 0)) {
	    tcsetattr(0,TCSAFLUSH,&ttt);
	    signal(SIGHUP, SIG_IGN); /* so vhangup() wont kill us */
	    vhangup();
	    signal(SIGHUP, SIG_DFL);
	}
	
	setsid();
	
	/* re-open stdin,stdout,stderr after vhangup() closed them */
	/* if it did, after 0.99.5 it doesn't! */
	opentty(ttyn);
	tcsetattr(0,TCSAFLUSH,&tt);
    }
    
    if ((tty = rindex(ttyn, '/')))
      ++tty;
    else
      tty = ttyn;
    
    openlog("login", LOG_ODELAY, LOG_AUTHPRIV);

#ifdef USE_PAM
    #warning pam used
    /* username is initialized to NULL
       and if specified on the command line it is set.
       Therefore, we are safe not setting it to anything
    */

    retcode = pam_start("login",username, &conv, &pamh);
    if(retcode != PAM_SUCCESS) {
	fprintf(stderr,"login: PAM Failure, aborting: %s\n",
	pam_strerror(pamh, retcode));
	syslog(LOG_ERR,"Couldn't initialize PAM: %s", pam_strerror(pamh, retcode));
	exit(99);
    }
    /* hostname & tty are either set to NULL or their correct values,
       depending on how much we know */
    retcode = pam_set_item(pamh, PAM_RHOST, hostname);
    PAM_FAIL_CHECK;
    retcode = pam_set_item(pamh, PAM_TTY, tty);
    PAM_FAIL_CHECK;
    /* if fflag == 1, then the user has already been authenticated */
    if (fflag && (getuid() == 0))
	passwd_req = 0;
    else
	passwd_req = 1;

    if(passwd_req == 1) {
	int failcount=0;

	/* there may be better ways to deal with some of these
	   conditions, but at least this way I don't think we'll
	   be giving away information... */
	/* Perhaps someday we can trust that all PAM modules will
	   pay attention to failure count and get rid of MAX_LOGIN_TRIES? */

	retcode = pam_authenticate(pamh, 0);
	while((failcount++ < PAM_MAX_LOGIN_TRIES) &&
	      ((retcode == PAM_AUTH_ERR) ||
	       (retcode == PAM_USER_UNKNOWN) ||
	       (retcode == PAM_CRED_INSUFFICIENT) ||
	       (retcode == PAM_AUTHINFO_UNAVAIL))) {
	    pam_get_item(pamh, PAM_USER, (const void **) &username);
	    syslog(LOG_NOTICE,"FAILED LOGIN %d FROM %s FOR %s, %s",
	    failcount, hostname, username, pam_strerror(pamh, retcode));
	    fprintf(stderr,"Login incorrect\n\n");
	    pam_set_item(pamh,PAM_USER,NULL);
	    retcode = pam_authenticate(pamh, 0);
	}

	if (retcode != PAM_SUCCESS) {
	    pam_get_item(pamh, PAM_USER, (const void **) &username);

	    if (retcode == PAM_MAXTRIES) 
		syslog(LOG_NOTICE,"TOO MANY LOGIN TRIES (%d) FROM %s FOR "
			"%s, %s", failcount, hostname, username,
			 pam_strerror(pamh, retcode));
	    else
		syslog(LOG_NOTICE,"FAILED LOGIN SESSION FROM %s FOR %s, %s",
			hostname, username, pam_strerror(pamh, retcode));

	    fprintf(stderr,"\nLogin incorrect\n");
	    pam_end(pamh, retcode);
	    exit(0);
	}

	retcode = pam_acct_mgmt(pamh, 0);

	if(retcode == PAM_NEW_AUTHTOK_REQD) {
	    retcode = pam_chauthtok(pamh, PAM_CHANGE_EXPIRED_AUTHTOK);
	}

	PAM_FAIL_CHECK;
    }

    /* Grab the user information out of the password file for future usage
       First get the username that we are actually using, though.
    */
    retcode = pam_get_item(pamh, PAM_USER, (const void **) &username);
    setpwent();
    pwd = GETPWNAM(username);
    if (pwd) initgroups(username, pwd->pw_gid);

    retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED);
    PAM_FAIL_CHECK;

    retcode = pam_open_session(pamh, 0);
    PAM_FAIL_CHECK;

#else /* ! USE_PAM */

    for (cnt = 0;; ask = 1) {
#  ifndef __linux__
	ioctlval = 0;
	ioctl(0, TIOCSETD, &ioctlval);
#  endif
	
	if (ask) {
	    fflag = 0;
	    getloginname();
	}
	
	/* Dirty patch to fix a gigantic security hole when using 
	   yellow pages. This problem should be solved by the
	   libraries, and not by programs, but this must be fixed
	   urgently! If the first char of the username is '+', we 
	   avoid login success.
	   Feb 95 <[email-masked]> */
	
	if (username[0] == '+') {
	    puts("Illegal username");
	    badlogin(username);
	    sleepexit(1);
	}

	/* (void)strcpy(tbuf, username); why was this here? */
	if ((pwd = GETPWNAM(username))) {
#  ifdef SHADOW_PWD
		#warning shadow enabled
	    struct spwd *sp;
	    
	    if ((sp = getspnam(username)))
	      pwd->pw_passwd = sp->sp_pwdp;
#  endif
	    salt = pwd->pw_passwd;
	} else

		if( errno == ENOMEM )
			printf("memory problems\n");
	salt = "xx";
	
	if (pwd) {
	    initgroups(username, pwd->pw_gid);
	    checktty(username, tty, pwd); /* in checktty.c */
	}
	
	/* if user not super-user, check for disabled logins */
	if (pwd == NULL || pwd->pw_uid)
	  checknologin();
	
	/*
	 * Disallow automatic login to root; if not invoked by
	 * root, disallow if the uid's differ.
	 */
	if (fflag && pwd) {
	    int uid = getuid();
	    
	    passwd_req = pwd->pw_uid == 0 ||
	      (uid && uid != pwd->pw_uid);
	}
	
	/*
	 * If trying to log in as root, but with insecure terminal,
	 * refuse the login attempt.
	 */
	if (pwd && pwd->pw_uid == 0 && !rootterm(tty)) {
	    fprintf(stderr,
		    "%s login refused on this terminal.\n",
		    pwd->pw_name);
	    
	    if (hostname)
	      syslog(LOG_NOTICE,
		     "LOGIN %s REFUSED FROM %s ON TTY %s",
		     pwd->pw_name, hostname, tty);
	    else
	      syslog(LOG_NOTICE,
		     "LOGIN %s REFUSED ON TTY %s",
		     pwd->pw_name, tty);
	    continue;
	}
	
	/*
	 * If no pre-authentication and a password exists
	 * for this user, prompt for one and verify it.
	 */
	if (!passwd_req || (pwd && !*pwd->pw_passwd))
	  break;
	
	setpriority(PRIO_PROCESS, 0, -4);
	pp = getpass("Password: ");
	
#  ifdef CRYPTOCARD
	if (strncmp(pp, "CRYPTO", 6) == 0) {
	    if (pwd && cryptocard()) break;
	}
#  endif /* CRYPTOCARD */
	
	p = crypt(pp, salt);
	setpriority(PRIO_PROCESS, 0, 0);

#  ifdef KERBEROS
	/*
	 * If not present in pw file, act as we normally would.
	 * If we aren't Kerberos-authenticated, try the normal
	 * pw file for a password.  If that's ok, log the user
	 * in without issueing any tickets.
	 */
	
	if (pwd && !krb_get_lrealm(realm,1)) {
	    /*
	     * get TGT for local realm; be careful about uid's
	     * here for ticket file ownership
	     */
	    setreuid(geteuid(),pwd->pw_uid);
	    kerror = krb_get_pw_in_tkt(pwd->pw_name, "", realm,
				       "krbtgt", realm, DEFAULT_TKT_LIFE, pp);
	    setuid(0);
	    if (kerror == INTK_OK) {
		memset(pp, 0, strlen(pp));
		notickets = 0;	/* user got ticket */
		break;
	    }
	}
#  endif /* KERBEROS */
	memset(pp, 0, strlen(pp));
	if (pwd && !strcmp(p, pwd->pw_passwd))
	  break;
	
	printf("Login incorrect\n");
	badlogin(username); /* log ALL bad logins */
	failures++;
	
	/* we allow 10 tries, but after 3 we start backing off */
	if (++cnt > 3) {
	    if (cnt >= 10) {
		sleepexit(1);
	    }
	    sleep((unsigned int)((cnt - 3) * 5));
	}
    }
#endif /* !USE_PAM */
    
    /* committed to login -- turn off timeout */
    alarm((unsigned int)0);
    
#ifdef HAVE_QUOTA
    if (quota(Q_SETUID, pwd->pw_uid, 0, 0) < 0 && errno != EINVAL) {
	switch(errno) {
	  case EUSERS:
	    fprintf(stderr,
		    "Too many users logged on already.\nTry again later.\n");
	    break;
	  case EPROCLIM:
	    fprintf(stderr,
		    "You have too many processes running.\n");
	    break;
	  default:
	    perror("quota (Q_SETUID)");
	}
	sleepexit(0);
    }
#endif
    
    /* paranoia... */
#ifdef SHADOW_PWD
    endspent();
#endif
    endpwent();
    
    /* This requires some explanation: As root we may not be able to
       read the directory of the user if it is on an NFS mounted
       filesystem. We temporarily set our effective uid to the user-uid
       making sure that we keep root privs. in the real uid. 
       
       A portable solution would require a fork(), but we rely on Linux
       having the BSD setreuid() */
    
    {
	char tmpstr[MAXPATHLEN];
	uid_t ruid = getuid();
	gid_t egid = getegid();

	/* avoid snprintf - old systems do not have it, or worse,
	   have a libc in which snprintf is the same as sprintf */
	if (strlen(pwd->pw_dir) + sizeof(_PATH_HUSHLOGIN) + 2 > MAXPATHLEN)
		quietlog = 0;
	else {
		sprintf(tmpstr, "%s/%s", pwd->pw_dir, _PATH_HUSHLOGIN);
		setregid(-1, pwd->pw_gid);
		setreuid(0, pwd->pw_uid);
		quietlog = (access(tmpstr, R_OK) == 0);
		setuid(0); /* setreuid doesn't do it alone! */
		setreuid(ruid, 0);
		setregid(-1, egid);
	}
    }
    
#ifndef __linux__
#  ifdef KERBEROS
    if (notickets && !quietlog)
      printf("Warning: no Kerberos tickets issued\n");
#  endif
    
#  ifndef USE_PAM			/* PAM does all of this for us */
#    define TWOWEEKS	(14*24*60*60)
    if (pwd->pw_change || pwd->pw_expire) {
	struct timeval tp;

	gettimeofday(&tp, (struct timezone *)NULL);

	if (pwd->pw_change) {
	    if (tp.tv_sec >= pwd->pw_change) {
		printf("Sorry -- your password has expired.\n");
		sleepexit(1);
	    }
	    else if (tp.tv_sec - pwd->pw_change < TWOWEEKS && !quietlog) {
		struct tm *ttp;
		ttp = localtime(&pwd->pw_change);
		printf("Warning: your password expires on %s %d, %d\n",
		       months[ttp->tm_mon], ttp->tm_mday,
		       TM_YEAR_BASE + ttp->tm_year);
	    }
	}

	if (pwd->pw_expire) {
	    if (tp.tv_sec >= pwd->pw_expire) {
		printf("Sorry -- your account has expired.\n");
		sleepexit(1);
	    }
	    else if (tp.tv_sec - pwd->pw_expire < TWOWEEKS && !quietlog) {
		struct tm *ttp;
		ttp = localtime(&pwd->pw_expire);
		printf("Warning: your account expires on %s %d, %d\n",
		       months[ttp->tm_mon], ttp->tm_mday,
		       TM_YEAR_BASE + ttp->tm_year);
	    }
	}
    }
#  endif /* !USE_PAM */
    
    /* nothing else left to fail -- really log in */
    {
	struct utmp utmp;
	
	memset((char *)&utmp, 0, sizeof(utmp));
	time(&utmp.ut_time);
	strncpy(utmp.ut_name, username, sizeof(utmp.ut_name));
	/* ut_name may legally be non-null-terminated */
	if (hostname) {
	    strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host));
	    utmp.ut_host[sizeof(utmp.ut_host)-1] = 0;
	}
	strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line));
	utmp.ut_line[sizeof(utmp.ut_line)-1] = 0;
	login(&utmp);
    }
#else /* __linux__ defined */
    /* for linux, write entries in utmp and wtmp */
    {
	struct utmp ut;
	int wtmp;
	struct utmp *utp;
	time_t t;
	pid_t mypid = getpid();
	
	utmpname(_PATH_UTMP);
	setutent();

	/* Find mypid in utmp.
login sometimes overwrites the runlevel entry in /var/run/utmp,
confusing sysvinit. I added a test for the entry type, and the problem
was gone. (In a runlevel entry, st_pid is not really a pid but some number
calculated from the previous and current runlevel).
Michael Riepe <[email-masked]>
	*/
	while ((utp = getutent()))
		if (utp->ut_pid == mypid
		    && utp->ut_type >= INIT_PROCESS
		    && utp->ut_type <= DEAD_PROCESS)
			break;
	
	if (utp) {
	    memcpy(&ut, utp, sizeof(ut));
	} else {
	    /* some gettys/telnetds don't initialize utmp... */
	    memset(&ut, 0, sizeof(ut));
	}
	/* endutent(); superfluous, error for glibc */
	
	if (ut.ut_id[0] == 0)
	  strncpy(ut.ut_id, ttyn + 8, sizeof(ut.ut_id));
	
	strncpy(ut.ut_user, username, sizeof(ut.ut_user));
	strncpy(ut.ut_line, ttyn + 5, sizeof(ut.ut_line));
	ut.ut_line[sizeof(ut.ut_line)-1] = 0;
	time(&t);
	ut.ut_time = t;		/* ut_time is not always a time_t */
				/* (we might test #ifdef _HAVE_UT_TV ) */
	ut.ut_type = USER_PROCESS;
	ut.ut_pid = mypid;
	if (hostname) {
	    strncpy(ut.ut_host, hostname, sizeof(ut.ut_host));
	    ut.ut_host[sizeof(ut.ut_host)-1] = 0;
	    if (hostaddress.h_addr_list)
	      memcpy(&ut.ut_addr, hostaddress.h_addr_list[0],
		     sizeof(ut.ut_addr));
	}
	
	pututline(&ut);
	endutent();

#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)
	updwtmp(_PATH_WTMP, &ut);
#else
#if 0
	/* The O_APPEND open() flag should be enough to guarantee
	   atomic writes at end of file. */
	if((wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY)) >= 0) {
		write(wtmp, (char *)&ut, sizeof(ut));
		close(wtmp);
	}
#else
	/* Probably all this locking below is just nonsense,
	   and the short version is OK as well. */
	{ 
	    int lf;
	    if ((lf = open(_PATH_WTMPLOCK, O_CREAT|O_WRONLY, 0660)) >= 0) {
		flock(lf, LOCK_EX);
		if ((wtmp = open(_PATH_WTMP, O_APPEND|O_WRONLY)) >= 0) {
		    write(wtmp, (char *)&ut, sizeof(ut));
		    close(wtmp);
		}
		flock(lf, LOCK_UN);
		close(lf);
	    }
	}
#endif
#endif /* __GLIBC__ */
    }
#endif /* __linux__ */
    
    dolastlog(quietlog);
    
#ifndef __linux__
    if (!hflag) {					/* XXX */
	static struct winsize win = { 0, 0, 0, 0 };
	
	ioctl(0, TIOCSWINSZ, &win);
    }
#endif
    chown(ttyn, pwd->pw_uid,
	  (gr = getgrnam(TTYGRPNAME)) ? gr->gr_gid : pwd->pw_gid);
    chmod(ttyn, TTY_MODE);

    /* if tty is one of the VC's then change owner and mode of the 
       special /dev/vcs devices as well */
    if (consoletty(0)) {
	chown(vcsn, pwd->pw_uid, (gr ? gr->gr_gid : pwd->pw_gid));
	chown(vcsan, pwd->pw_uid, (gr ? gr->gr_gid : pwd->pw_gid));
	chmod(vcsn, TTY_MODE);
	chmod(vcsan, TTY_MODE);
    }

    setgid(pwd->pw_gid);
    
#ifdef HAVE_QUOTA
    quota(Q_DOWARN, pwd->pw_uid, (dev_t)-1, 0);
#endif
    
    if (*pwd->pw_shell == '\0')
      pwd->pw_shell = _PATH_BSHELL;
#ifndef __linux__
    /* turn on new line discipline for the csh */
    else if (!strcmp(pwd->pw_shell, _PATH_CSHELL)) {
	ioctlval = NTTYDISC;
	ioctl(0, TIOCSETD, &ioctlval);
    }
#endif
    
    /* preserve TERM even without -p flag */
    {
	char *ep;
	
	if(!((ep = getenv("TERM")) && (termenv = strdup(ep))))
	  termenv = "dumb";
    }
    
    /* destroy environment unless user has requested preservation */
    if (!pflag)
      {
          environ = (char**)malloc(sizeof(char*));
	  memset(environ, 0, sizeof(char*));
      }
    
#ifndef __linux__
    setenv("HOME", pwd->pw_dir, 1);
    setenv("SHELL", pwd->pw_shell, 1);
    if (term[0] == '\0') {
	strncpy(term, stypeof(tty), sizeof(term));
	term[sizeof(term)-1] = 0;
    }
    setenv("TERM", term, 0);
    setenv("USER", pwd->pw_name, 1);
    setenv("PATH", _PATH_DEFPATH, 0);
#else
    setenv("HOME", pwd->pw_dir, 0);      /* legal to override */
    if(pwd->pw_uid)
      setenv("PATH", _PATH_DEFPATH, 1);
    else
      setenv("PATH", _PATH_DEFPATH_ROOT, 1);
    
    setenv("SHELL", pwd->pw_shell, 1);
    setenv("TERM", termenv, 1);
    
    /* mailx will give a funny error msg if you forget this one */
    {
      char tmp[MAXPATHLEN];
      /* avoid snprintf */
      if (sizeof(_PATH_MAILDIR) + strlen(pwd->pw_name) + 1 < MAXPATHLEN) {
	      sprintf(tmp, "%s/%s", _PATH_MAILDIR, pwd->pw_name);
	      setenv("MAIL",tmp,0);
      }
    }
    
    /* LOGNAME is not documented in login(1) but
       HP-UX 6.5 does it. We'll not allow modifying it.
       */
    setenv("LOGNAME", pwd->pw_name, 1);
#endif

#ifdef USE_PAM
    {
	int i;
	const char * const * env;

	env = (const char * const *)pam_getenvlist(pamh);

	if (env != NULL) {
	    for (i=0; env[i++]; ) {
		putenv(env[i-1]);
		/* D(("env[%d] = %s", i-1,env[i-1])); */
	    }
	}
    }
#endif

#ifdef DO_PS_FIDDLING
    setproctitle("login", username);
#endif
    
    if (tty[sizeof("tty")-1] == 'S')
      syslog(LOG_INFO, "DIALUP AT %s BY %s", tty, pwd->pw_name);
    
    /* allow tracking of good logins.
       -steve philp ([email-masked]) */
    
    if (pwd->pw_uid == 0) {
	if (hostname)
	  syslog(LOG_NOTICE, "ROOT LOGIN ON %s FROM %s",
		 tty, hostname);
	else
	  syslog(LOG_NOTICE, "ROOT LOGIN ON %s", tty);
    } else {
	if (hostname) 
	  syslog(LOG_INFO, "LOGIN ON %s BY %s FROM %s", tty, 
		 pwd->pw_name, hostname);
	else 
	  syslog(LOG_INFO, "LOGIN ON %s BY %s", tty, 
		 pwd->pw_name);
    }
    
    if (!quietlog) {
	struct stat st;
	char *mail;
	
	motd();
	mail = getenv("MAIL");
	if (mail && stat(mail, &st) == 0 && st.st_size != 0) {
		printf("You have %smail.\n",
		       (st.st_mtime > st.st_atime) ? "new " : "");
	}
    }
    
    signal(SIGALRM, SIG_DFL);
    signal(SIGQUIT, SIG_DFL);
    signal(SIGTSTP, SIG_IGN);
    signal(SIGHUP, SIG_DFL);

#ifdef USE_PAM
    /* We must fork before setuid() because we need to call
     * pam_close_session() as root.
     */
    signal(SIGINT, SIG_IGN);
    childPid = fork();
    if (childPid < 0) {
       /* error in fork() */
       fprintf(stderr,"login: failure forking: %s", strerror(errno));
       PAM_END;
       exit(0);
    } else if (childPid) {
       /* parent - wait for child to finish, then cleanup session */
       wait(NULL);
       PAM_END;
       exit(0);
    }
    /* child */
#endif
    signal(SIGINT, SIG_DFL);
    
    /* discard permissions last so can't get killed and drop core */
    if(setuid(pwd->pw_uid) < 0 && pwd->pw_uid) {
	syslog(LOG_ALERT, "setuid() failed");
	exit(1);
    }
    
    /* wait until here to change directory! */
    if (chdir(pwd->pw_dir) < 0) {
	printf("No directory %s!\n", pwd->pw_dir);
	if (chdir("/"))
	  exit(0);
	pwd->pw_dir = "/";
	printf("Logging in with home = \"/\".\n");
    }
    
    /* if the shell field has a space: treat it like a shell script */
    if (strchr(pwd->pw_shell, ' ')) {
	buff = malloc(strlen(pwd->pw_shell) + 6);

	if (!buff) {
	    fprintf(stderr, "login: no memory for shell script.\n");
	    exit(0);
	}

	strcpy(buff, "exec ");
	strcat(buff, pwd->pw_shell);
	childArgv[childArgc++] = "/bin/sh";
	childArgv[childArgc++] = "-sh";
	childArgv[childArgc++] = "-c";
	childArgv[childArgc++] = buff;
    } else {
	tbuf[0] = '-';
	strncpy(tbuf + 1, ((p = rindex(pwd->pw_shell, '/')) ?
			   p + 1 : pwd->pw_shell),
		sizeof(tbuf)-1);
	tbuf[sizeof(tbuf)-1] = 0;
	
	childArgv[childArgc++] = pwd->pw_shell;
	childArgv[childArgc++] = tbuf;
    }

    childArgv[childArgc++] = NULL;

    execvp(childArgv[0], childArgv + 1);

    if (!strcmp(childArgv[0], "/bin/sh")) 
	    fprintf(stderr, "login: couldn't exec shell script: %s.\n",
		    strerror(errno));
    else
	    fprintf(stderr, "login: no shell: %s.\n", strerror(errno));

    exit(0);
}

void
getloginname()
{
    register int ch;
    register char *p;
    static char nbuf[UT_NAMESIZE + 1];
    int cnt, cnt2;
    
    cnt2 = 0;
    for (;;) {
	cnt = 0;
	printf("\n%s login: ", thishost); fflush(stdout);
	for (p = nbuf; (ch = getchar()) != '\n'; ) {
	    if (ch == EOF) {
		badlogin("EOF");
		exit(0);
	    }
	    if (p < nbuf + UT_NAMESIZE)
	      *p++ = ch;
	    
	    cnt++;
	    if (cnt > UT_NAMESIZE + 20) {
		fprintf(stderr, "login name much too long.\n");
		badlogin("NAME too long");
		exit(0);
	    }
	}
	if (p > nbuf) {
	  if (nbuf[0] == '-')
	    fprintf(stderr,
		    "login names may not start with '-'.\n");
	  else {
	      *p = '\0';
	      username = nbuf;
	      break;
	  }
	}
	
	cnt2++;
	if (cnt2 > 50) {
	    fprintf(stderr, "too many bare linefeeds.\n");
	    badlogin("EXCESSIVE linefeeds");
	    exit(0);
	}
    }
}

void
timedout()
{
    struct termio ti;
    
    fprintf(stderr, "Login timed out after %d seconds\n", timeout);
    
    /* reset echo */
    ioctl(0, TCGETA, &ti);
    ti.c_lflag |= ECHO;
    ioctl(0, TCSETA, &ti);
    exit(0);
}

int
rootterm(ttyn)
     char *ttyn;
#ifndef __linux__
{
    struct ttyent *t;
    
    return((t = getttynam(ttyn)) && t->ty_status&TTY_SECURE);
}
#else
{ 
    int fd;
    char buf[100],*p;
    int cnt, more;
    more = 0;
    
    fd = open(SECURETTY, O_RDONLY);
    if(fd < 0) return 1;
    
    /* read each line in /etc/securetty, if a line matches our ttyline
       then root is allowed to login on this tty, and we should return
       true. */
    for(;;) {
	p = buf; cnt = 100;
	while(--cnt >= 0 && (more = read(fd, p, 1)) == 1 && *p != '\n') p++;
	if(more && *p == '\n') {
	    *p = '\0';
	    if(!strcmp(buf, ttyn)) {
		close(fd);
		return 1;
	    } else
	      continue;
  	} else {
	    close(fd);
	    return 0;
  	}
    }
}
#endif

jmp_buf motdinterrupt;

void
motd()
{
    register int fd, nchars;
    void (*oldint)(), sigint();
    char tbuf[8192];
    
    if ((fd = open(_PATH_MOTDFILE, O_RDONLY, 0)) < 0)
      return;
    oldint = signal(SIGINT, sigint);
    if (setjmp(motdinterrupt) == 0)
      while ((nchars = read(fd, tbuf, sizeof(tbuf))) > 0)
	write(fileno(stdout), tbuf, nchars);
    signal(SIGINT, oldint);
    close(fd);
}

void
sigint()
{
    longjmp(motdinterrupt, 1);
}

#ifndef USE_PAM				/* PAM takes care of this */
void
checknologin()
{
    register int fd, nchars;
    char tbuf[8192];
    if ((fd = open(_PATH_NOLOGIN, O_RDONLY, 0)) >= 0) {
	while ((nchars = read(fd, tbuf, sizeof(tbuf))) > 0)
	  write(fileno(stdout), tbuf, nchars);
	sleepexit(0);
    }
}
#endif

void
dolastlog(quiet)
     int quiet;
{
    struct lastlog ll;
    int fd;
    
    if ((fd = open(_PATH_LASTLOG, O_RDWR, 0)) >= 0) {
	lseek(fd, (off_t)pwd->pw_uid * sizeof(ll), SEEK_SET);
	if (!quiet) {
	    if (read(fd, (char *)&ll, sizeof(ll)) == sizeof(ll) &&
		ll.ll_time != 0) {
		printf("Last login: %.*s ",
		       24-5, (char *)ctime(&ll.ll_time));
		
		if (*ll.ll_host != '\0')
		  printf("from %.*s\n",
			 (int)sizeof(ll.ll_host), ll.ll_host);
		else
		  printf("on %.*s\n",
			 (int)sizeof(ll.ll_line), ll.ll_line);
	    }
	    lseek(fd, (off_t)pwd->pw_uid * sizeof(ll), SEEK_SET);
	}
	memset((char *)&ll, 0, sizeof(ll));
	time(&ll.ll_time);
	strncpy(ll.ll_line, tty, sizeof(ll.ll_line));
	ll.ll_line[sizeof(ll.ll_line)-1] = 0;
	if (hostname) {
	    strncpy(ll.ll_host, hostname, sizeof(ll.ll_host));
	    ll.ll_host[sizeof(ll.ll_host)-1] = 0;
	}
	write(fd, (char *)&ll, sizeof(ll));
	close(fd);
    }
}

void
badlogin(const char *name)
{
    if (hostname)
      syslog(LOG_NOTICE, "%d LOGIN FAILURE%s FROM %s, %s",
	     failures, failures > 1 ? "S" : "", hostname, name);
    else
      syslog(LOG_NOTICE, "%d LOGIN FAILURE%s ON %s, %s",
	     failures, failures > 1 ? "S" : "", tty, name);
}

#undef	UNKNOWN
#define	UNKNOWN	"su"

#ifndef __linux__
char *
stypeof(ttyid)
     char *ttyid;
{
    struct ttyent *t;

    return(ttyid && (t = getttynam(ttyid)) ? t->ty_type : UNKNOWN);
}
#endif 

/* should not be called from PAM code... Why? */
void
sleepexit(eval)
     int eval;
{
    sleep(SLEEP_EXIT_TIMEOUT);
    exit(eval);
}

---

From: Philip Blundell <[email-masked]>
Date: Wed, 28 Apr 1999 10:22:48 +0100

>Though I had compiled fp emulation into the kernel, it still tried to load
>the fpe module.

The boot scripts don't know that you have compiled the emulator in.  Just take 
out the call to insmod.

>But it refused to load the etherh module (insmod reported
>that it is no module).

Have you installed a version of insmod that understands ELF files?

>Can't locate module char-major-4
>Out of file handle
>Out of file handle

Sounds like you may need to update your pty devices.  See the kernel 
documentation.

p.

---

From: Peter Teichmann <[email-masked]>
Date: Wed, 28 Apr 1999 09:23:00 +0000

> enough of an environment available to execute insmod.

Well I now compiled again a kernel with all included, no modules. This kernel
did not get very far. When it came to initialize my network card (etherh)
it got stuck and stayed stuck.

So I tried to compile only the network card as a module, to look what will
happen. The following happened:

Though I had compiled fp emulation into the kernel, it still tried to load
the fpe module. But it refused to load the etherh module (insmod reported
that it is no module).

I could login! But I could not start X (OpenConsole: VT_GETSCRINFO failed).
When I started MC, I got the followin messages repeated very often repeated:

Then MC started anyway, but reacted in a very strange way when I pressed
keys: I always had to press 3 keys after each other to make MC recognize
them.

Are these problems normal? What can be done against them? I really need X,
and I need my network card, and I like MC.

-- 
Peter Teichmann

---

From: Paul Koning <[email-masked]>
Date: Wed, 28 Apr 1999 09:53:41 -0400

>>>>> "Peter" == Peter Danielsson <[email-masked]> writes:

 Peter> Peter Teichmann wrote:
 >> Well I compiled the kernel and the modules by myself, but I did
 >> not know that I need a new FPEmulator. So I downloaded it from
 >> ftp.arm.linux.org.uk.  Now it complains no more about wrong
 >> versions, but does not print something about the fpe module loaded
 >> as the old kernel did. It also does not let me login. I also
 >> included nwfpe as module, but it did not help. I also compiled a
 >> kernel with all things included, not as modules, but that had also
 >> no effect. If I tell you that compiling a kernel lasts about 1.5
 >> hours on my RiscPC you know that I wasted a lot of time for
 >> nothing.
 >> 

 Peter> I recognize this problem! I too had some troubles with login,
 Peter> and it seemed impossible to get a working version (I compiled
 Peter> two or three myself, downloaded precompiled binaries and
 Peter> nothing helped.) After a while I begun to supect glibc for
 Peter> having a bug so I rewrote login to use some other routines for
 Peter> accessing /etc/passwd. ...

That rings a bell (it has been ringing in the background for a while,
actually).  

There was a discussion on this list only a week or two ago about a bug 
in the glibc password handling functions -- caused by an invalid
assumption about alignment of data elements in structures.  Solution
was to mark the structure in question "packed".  A scan of the
archives should turn it up soon enough...

I wonder how many other cases like this exist.  It's scary to think of 
the number of source lines that might hide bugs of this kind.  Perhaps 
a solution would be to add a warning feature to the compiler so it
reports any structure declarations where the particular platform is
using padding beyond the minimum.  I don't speak enough gcc to offer
to do it, unfortunately.

	paul

---

From: Russell King - ARM Linux Admin <[email-masked]>
Date: Wed, 28 Apr 1999 15:45:53 +0100 (BST)

> archives should turn it up soon enough...

Ok, this really starts to worry me...

Why would something that reads a textual file require it's structure to
be packed?  I don't get this.

Ok, so adding the stuff to make the structure packed fixed the problem,
but I think someone ought to fix it the 'right way' and find out why
this structure needs to be packed when it shouldn't need to be.
   _____
  |_____| ------------------------------------------------- ---+---+-
  |   |        Russell King       [email-masked]      --- ---
  | | | |  http://www.arm.linux.org.uk/~rmk/armlinux.html    /  /  |
  | +-+-+                                                     --- -+-
  /   |               THE developer of ARM Linux              |+| /|\
 /  | | |                                                     ---  |
    +-+-+ -------------------------------------------------  /\\\  |
unsubscribe: body of `unsubscribe linux-arm' to [email-masked]

---

From: Paul Koning <[email-masked]>
Date: Wed, 28 Apr 1999 11:43:42 -0400

>>>>> "Russell" == Russell King <- ARM Linux Admin <[email-masked]>> writes:

 Russell> Paul Koning writes:
 >> There was a discussion on this list only a week or two ago about a
 >> bug in the glibc password handling functions -- caused by an
 >> invalid assumption about alignment of data elements in structures.
 >> Solution was to mark the structure in question "packed".  A scan
 >> of the archives should turn it up soon enough...

 Russell> Ok, this really starts to worry me...

 Russell> Why would something that reads a textual file require it's
 Russell> structure to be packed?  I don't get this.

 Russell> Ok, so adding the stuff to make the structure packed fixed
 Russell> the problem, but I think someone ought to fix it the 'right
 Russell> way' and find out why this structure needs to be packed when
 Russell> it shouldn't need to be.

I don't remember the specifics, and I don't have the original note
anymore.  I do have one message from that thread.  The subject was
"Patches to glibc...."; Scott Bambrough was one of the others in the
discussion.  Date I have is around April 14th.

>From vague recollection, I think the issue had to do with a data
structure being passed around in which the request for a lookup was
encoded.  Yes of course, the actual final reference is to a text file
but the issue wasn't there.

Nor is it the only place; the one we shifted to in the message I saved 
is the Ethernet header.  Linux is full of protocol headers of all
flavors encoded as structs; many of those are suspect and may be
broken. 

Tried to find an archive of this mailing list but wasn't successful.
The website lists three.  Dejanews doesn't appear to do mailing lists; 
findmail is out of order; and barnet appears to have nothing newer
than mid 1998.
unsubscribe: body of `unsubscribe linux-arm' to [email-masked]

---

From: Peter Teichmann <[email-masked]>
Date: Wed, 28 Apr 1999 15:55:02 +0000

In message <[email-masked]>

> Have you installed a version of insmod that understands ELF files?

Where from? I tried to compile 2.1.121 by myself, but I need to do it with
the new kernel. But the assembler complained about gccs output which looked
for example like this:

.stabs "void:t19=19",128,0,0,0
- - - ident $Id: sys_cm.c,v 1.1 1997/09/10 22:22:37 rth Exp $
.stabs "__long_double_t:t14",128,0,118,0

Why don't you put some more recent modutils on ftp.arm.linux.org uk as you
certainly have one?

But I do not know whether this is my REAL PROBLEM, as etherh did NOT work
when compiled into the kernel. Booting the kernel went to this line and did
not get any further when etherh support was compiled into the kernel:

eth0: etherh 600A found at 8000ae00, IRQ11, ether address ...

> Sounds like you may need to update your pty devices.  See the kernel 

Why don't you put an actual MAKEDEV on ftp.arm.linux.org.uk? I am relative
sure you have one. That is the question at all: Why is there only those
old a.out rubbish there? If you really want to use the arm linux (as
I want) you do not get very far with that. And before people like me who
only want to use linux and have not so much knowledge about the internals
do not manage the step from 2.0.35 a.out to 2.2.X elf all the nice patches
and developments of you guys out there are not very helpful.

Why don't you provide 2.2.X kernels for the RiscPC/A7000/...? It would be
much easier to upgrade to elf then!

[Perhaps I should stay with NetBSD. Slowly I get tired and a bit angry
because nothing seems to work with armlinux if you are not a guru and do
not know all tricks.]

-- 
Peter Teichmann

---

From: Russell King - ARM Linux Admin <[email-masked]>
Date: Wed, 28 Apr 1999 16:57:14 +0100 (BST)

> .stabs "__long_double_t:t14",128,0,118,0

This looks like old GCC which doesn't know about ELF.  Please upgrade your GCC
to 2.8.1 or EGCS.

> Why don't you put some more recent modutils on ftp.arm.linux.org uk as you

Probably because that's not Phil's site!  He doesn't have access to that site
(whereas I do).

> eth0: etherh 600A found at 8000ae00, IRQ11, ether address ...

Which patches did you apply to the stock kernel from Linus?

> sure you have one.

See above, plus, I don't have a later MAKEDEV script (yet).

> That is the question at all: Why is there only those

Yes, thank you.  The a.out is not rubbish, but as far as I know it's still to
this date the only stuff that does work on the RiscPC.  When there is a later
stable distribution (debian maybe), then it'll get updated.

> much easier to upgrade to elf then!

There is a RiscPC kernel there, but it is an old one.  I'm trying to pull
away from doing distributions, since they take up too much of my time that
I just don't have anymore.  However, since I build for each release a
A5000, RiscPC, EBSA110 and EBSA285+Netwinder kernel, I could upload those
I suppose, with their respective modules.
   _____
  |_____| ------------------------------------------------- ---+---+-
  |   |        Russell King       [email-masked]      --- ---
  | | | |  http://www.arm.linux.org.uk/~rmk/armlinux.html    /  /  |
  | +-+-+                                                     --- -+-
  /   |               THE developer of ARM Linux              |+| /|\
 /  | | |                                                     ---  |
    +-+-+ -------------------------------------------------  /\\\  |
unsubscribe: body of `unsubscribe linux-arm' to [email-masked]

---

From: Russell King - ARM Linux Admin <[email-masked]>
Date: Wed, 28 Apr 1999 17:00:31 +0100 (BST)

> flavors encoded as structs; many of those are suspect and may be

I know about the ones in the kernel.  It's the ones in things like glibc,
which IMHO shouldn't be there that I'm worried about.

Yes, ok, it's right to pack a structure if it relates to external data,
but not otherwise.
   _____

---

From: Matthew Wilcox <[email-masked]>
Date: Wed, 28 Apr 1999 18:10:39 +0200

> findmail is out of order; and barnet appears to have nothing newer

Um, me culpa on the barnet front; I left university and got a job and
shifted my email and somehow never got around to updating it.  vger does
not archive linux-arm.  I can try to construct a partial archive out
of what I've saved (there shouldn't be too much missing).  According
to davem, dejanews *does* have it, if you want to try looking again.
I don't have a publically available ftp server here; will people accept
http access only?

Several people once volunteered to htmlify the mail archives, but no-one
ever actually did it.

-- 
Matthew Wilcox <[email-masked]>
"Windows and MacOS are products, contrived by engineers in the service of
specific companies. Unix, by contrast, is not so much a product as it is a
painstakingly compiled oral history of the hacker subculture." - N Stephenson
unsubscribe: body of `unsubscribe linux-arm' to [email-masked]

---

From: Russell King - ARM Linux Admin <[email-masked]>
Date: Wed, 28 Apr 1999 17:29:17 +0100 (BST)

> to davem, dejanews *does* have it, if you want to try looking again.

However, davem's just changed his mind to 'no, dejanews doesn't have it'.
Ok, so time to update the web page I think.
   _____
  |_____| ------------------------------------------------- ---+---+-
  |   |        Russell King       [email-masked]      --- ---
  | | | |  http://www.arm.linux.org.uk/~rmk/armlinux.html    /  /  |
  | +-+-+                                                     --- -+-
  /   |               THE developer of ARM Linux              |+| /|\
 /  | | |                                                     ---  |
    +-+-+ -------------------------------------------------  /\\\  |

---

From: Nicholas Clark <[email-masked]>
Date: Wed, 28 Apr 1999 17:45:39 +0100 (BST)

> I don't have a publically available ftp server here; will people accept

I can cron a wget onto the anonymous ftp server here on plum if that helps.
(I theory I can archive the whole lot. In practice I'm not sure what I'd need
to do)

Nick

---

From: Alex Holden <[email-masked]>
Date: Wed, 28 Apr 1999 18:07:26 +0100 (GMT)

> sure you have one. That is the question at all: Why is there only those

MAKEDEV is a shell script. It is non platform specific. You can just
download the dev package from any recent RedHat redhat and install it.
It isn't even as if it is difficult to do it manually by just looking up
the device numbers in Documentation/devices.txt. 

--------------- Linux- the choice of a GNU generation. --------------
: Alex Holden (M1CJD)- Caver, Programmer, Land Rover nut, Radio Ham :

---

From: Peter Teichmann <[email-masked]>
Date: Wed, 28 Apr 1999 17:09:49 +0000

In message <[email-masked]>

> This looks like old GCC which doesn't know about ELF.  Please upgrade your GCC

Hm. Actually I have the problem that I always do not know exactly whether
to take the old gcc or the elf egcs. I will have a try.

> Probably because that's not Phil's site!  He doesn't have access to that site

Well I did not mean only Phil, I meant the whole arm linux developer
community, I should have made this more clear.

> Which patches did you apply to the stock kernel from Linus?

rmk-2.

I would also try to compile a more recent kernel, but as some people wrote
in the mailing list that they have such a kernel successfully running I took
this.

> See above, plus, I don't have a later MAKEDEV script (yet).

Hm. But I do not have enough knowledge to make the new devices by hand.

> stable distribution (debian maybe), then it'll get updated.

I think I should excuse me for being so unpolite. Yes it is not rubbish,
but if you have some friends with WCs and they have no problems running
kde and using programs which need 100+ MB Ram you do not get the impression
that it is very useful.

> I suppose, with their respective modules.

I think none can expect you doing distributions. But it would be nice if
enough information would be provided how to do it. I certainly spent already
24 hours trying to compile a running kernel! That is not very motivating.

-- 
Peter Teichmann

---

From: Philip Blundell <[email-masked]>
Date: Wed, 28 Apr 1999 19:25:24 +0100

>Where from? I tried to compile 2.1.121 by myself, but I need to do it with

Actually I think you need one of Bjorn's 2.2.x prerelease versions.  I don't think 
2.1.121 will work, though I could be wrong.  However, I'm not 100% sure where 
you can get the latest versions - your best bet may be to search the 
linux-kernel archives.

>Why don't you put some more recent modutils on ftp.arm.linux.org uk as you

I don't have access to that site.  I imagine there are working modutils 
binaries in the Debian distribution, but if not I'll try to make some 
available.

>much easier to upgrade to elf then!

Because nobody with a RiscPC or an A7000 has volunteered to build a kernel and 
make one available.  I have neither of these machines so there is nothing I 
can do about it.

p.

---

From: Philip Blundell <[email-masked]>
Date: Wed, 28 Apr 1999 19:31:36 +0100

>discussion.  Date I have is around April 14th.

If I remember right that discussion was about structures like the TFTP header.
Those do need to be packed because, unfortunately, they are used directly for 
external presentation.  I don't recall ever having seen a detailed explanation 
of this alleged structure packing problem with passwd (though I might well 
have missed it).  

FWIW, my NetWinder runs the standard glibc with no patches and I haven't 
experienced any problems logging in.  Does anybody have a test case for the bug?

p.

---

From: Philip Blundell <[email-masked]>
Date: Wed, 28 Apr 1999 19:34:34 +0100

>which IMHO shouldn't be there that I'm worried about.

Can you point to a specific example in glibc that you are concerned about?

p.

---

From: Paul Koning <[email-masked]>
Date: Wed, 28 Apr 1999 15:00:30 -0400

>>>>> "Philip" == Philip Blundell <[email-masked]> writes:

 >> "Patches to glibc...."; Scott Bambrough was one of the others in
 >> the discussion.  Date I have is around April 14th.

 Philip> If I remember right that discussion was about structures like
 Philip> the TFTP header.  Those do need to be packed because,
 Philip> unfortunately, they are used directly for external
 Philip> presentation.  I don't recall ever having seen a detailed
 Philip> explanation of this alleged structure packing problem with
 Philip> passwd (though I might well have missed it).

I don't remember any of the details other than a vague recollection
that the problem appeared in password checking.  That in turn lead to
the more general discussion, which is the only part I saved.

Is there ANY archive of this list anywhere?

	paul

---

From: Andy Hayward <[email-masked]>
Date: Wed, 28 Apr 1999 20:51:24 +0100

> Is there ANY archive of this list anywhere?

Possibly. I've got about 1550 emails from this list since December last
year (about 5Mb worth uncompressed). Give me a day or so and I'll have a
dig through. Alternatively does anyone have a ftp dropbox I can upload
it all to?

ach

---

From: Stefan Bellon <[email-masked]>
Date: Wed, 28 Apr 1999 21:51:46 +0200

In article <[email-masked]>,
   Philip Blundell <[email-masked]> wrote:

[snip]

> >Why don't you provide 2.2.X kernels for the RiscPC/A7000/...? It
> >would be much easier to upgrade to elf then!

> Because nobody with a RiscPC or an A7000 has volunteered to build a
> kernel and make one available.  I have neither of these machines so
> there is nothing I can do about it.

So, would anybody who has already moved to ELF (with a RiscPC) make
these available as binaries? I'd be very happy as well.

Greetings,

-- 
 Stefan Bellon <[email-masked]>
 Acorn RiscPC * StrongARM 202 MHz * 66 MB RAM

 'Work fascinates me - I could sit and watch it for hours'
unsubscribe: body of `unsubscribe linux-arm' to [email-masked]

---

From: Peter Teichmann <[email-masked]>
Date: Wed, 28 Apr 1999 20:04:40 +0000

In message <Pine.LNX.4.04.9904281804340.1344-100000@hyperspace>

> the device numbers in Documentation/devices.txt. 

I already tried this, but they are all in a new rpm format which my old
rpm utility can not read. I also already tried to compile a new rpm, but
I gave up when I noticed that too much libs and other things needed for
that are missing on my system. If you have an idea where I can get a more
recent rpm which runs also on a RiscPC, preferable not compressed into a
rpm with new format?

-- 
Peter Teichmann