summaryrefslogtreecommitdiff
path: root/packages/tinylogin
diff options
context:
space:
mode:
Diffstat (limited to 'packages/tinylogin')
-rw-r--r--packages/tinylogin/.mtn2git_empty0
-rw-r--r--packages/tinylogin/tinylogin-1.4/.mtn2git_empty0
-rw-r--r--packages/tinylogin/tinylogin-1.4/add-system.patch115
-rw-r--r--packages/tinylogin/tinylogin-1.4/adduser-empty_pwd.patch43
-rw-r--r--packages/tinylogin/tinylogin-1.4/cvs-20040608.patch821
5 files changed, 979 insertions, 0 deletions
diff --git a/packages/tinylogin/.mtn2git_empty b/packages/tinylogin/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/tinylogin/.mtn2git_empty
diff --git a/packages/tinylogin/tinylogin-1.4/.mtn2git_empty b/packages/tinylogin/tinylogin-1.4/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/tinylogin/tinylogin-1.4/.mtn2git_empty
diff --git a/packages/tinylogin/tinylogin-1.4/add-system.patch b/packages/tinylogin/tinylogin-1.4/add-system.patch
index e69de29bb2..18b4e47ad7 100644
--- a/packages/tinylogin/tinylogin-1.4/add-system.patch
+++ b/packages/tinylogin/tinylogin-1.4/add-system.patch
@@ -0,0 +1,115 @@
+? add-system.patch
+? cvs-20040608.patch
+? familiar
+? pod2htmd.tmp
+? pod2htmi.tmp
+? system.diff
+? tinylogin_1.4-20030620.1_arm.ipk
+? tinylogin_1.4-20030620.1_arm.ipk.asc
+? tinylogin_1.4-20030620.1_arm.ipk.upload.html
+? tinylogin_1.4-20030620.2_arm.ipk
+? tinylogin_1.4-20030620.2_arm.ipk.asc
+? tinylogin_1.4-20030620.2_arm.ipk.upload.html
+? tinylogin_1.4-20030620_arm.ipk
+? tinylogin_1.4-20030620_arm.ipk.asc
+? tinylogin_1.4-20030620_arm.ipk.upload.html
+? tmp
+Index: addgroup.c
+===================================================================
+RCS file: /var/cvs/tinylogin/addgroup.c,v
+retrieving revision 1.23
+diff -u -r1.23 addgroup.c
+--- a/addgroup.c 9 Jan 2003 18:43:29 -0000 1.23
++++ b/addgroup.c 8 Jun 2004 08:56:08 -0000
+@@ -31,6 +31,7 @@
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
++#include <getopt.h>
+ #include "tinylogin.h"
+
+ #define GROUP_FILE "/etc/group"
+@@ -124,6 +125,11 @@
+ return 0;
+ }
+
++static struct option long_options[] = {
++ { "system", 0, NULL, 'S' },
++ { 0, 0, 0, 0 }
++};
++
+ /*
+ * addgroup will take a login_name as its first parameter.
+ *
+@@ -136,14 +142,19 @@
+ int opt;
+ char *group;
+ char *user;
++ int option_index = -1;
+ gid_t gid = 0;
++ int system = 0;
+
+ /* get remaining args */
+- while ((opt = getopt (argc, argv, "g:")) != -1) {
++ while ((opt = getopt_long (argc, argv, "g:S", long_options, &option_index)) != -1) {
+ switch (opt) {
+ case 'g':
+ gid = strtol(optarg, NULL, 10);
+ break;
++ case 'S':
++ system = 1;
++ break;
+ default:
+ show_usage();
+ break;
+Index: adduser.c
+===================================================================
+RCS file: /var/cvs/tinylogin/adduser.c,v
+retrieving revision 1.38
+diff -u -r1.38 adduser.c
+--- a/adduser.c 21 Jun 2003 19:35:42 -0000 1.38
++++ b/adduser.c 8 Jun 2004 08:56:09 -0000
+@@ -66,13 +66,13 @@
+
+ /* remix */
+ /* EDR recoded such that the uid may be passed in *p */
+-static int passwd_study(const char *filename, struct passwd *p)
++static int passwd_study(const char *filename, struct passwd *p, int system)
+ {
+ struct passwd *pw;
+ FILE *passwd;
+
+- const int min = 500;
+- const int max = 65000;
++ const int min = system ? 10 : 500;
++ const int max = system ? 99 : 65000;
+
+ passwd = wfopen(filename, "r");
+ if (!passwd)
+@@ -142,7 +142,7 @@
+ }
+
+ /* putpwent(3) remix */
+-static int adduser(const char *filename, struct passwd *p, int makehome, int setpass)
++static int adduser(const char *filename, struct passwd *p, int makehome, int setpass, int system)
+ {
+ FILE *passwd;
+ int r;
+@@ -165,7 +165,7 @@
+ fseek(passwd, 0, SEEK_END);
+
+ /* if (passwd_study(filename, p) == 0) { */
+- r = passwd_study(filename, p);
++ r = passwd_study(filename, p, system);
+ if (r) {
+ if (r == 1)
+ error_msg("%s: login already in use", p->pw_name);
+@@ -357,7 +357,7 @@
+ }
+
+ /* grand finale */
+- return adduser(PASSWD_FILE, &pw, makehome, setpass);
++ return adduser(PASSWD_FILE, &pw, makehome, setpass, system);
+ }
+
+ /* $Id: adduser.c,v 1.38 2003/06/21 19:35:42 andersen Exp $ */
diff --git a/packages/tinylogin/tinylogin-1.4/adduser-empty_pwd.patch b/packages/tinylogin/tinylogin-1.4/adduser-empty_pwd.patch
index e69de29bb2..737ac423c4 100644
--- a/packages/tinylogin/tinylogin-1.4/adduser-empty_pwd.patch
+++ b/packages/tinylogin/tinylogin-1.4/adduser-empty_pwd.patch
@@ -0,0 +1,43 @@
+--- tinylogin-1.4/adduser.c.orig 2004-09-30 18:01:46.000000000 +0200
++++ tinylogin-1.4/adduser.c 2004-09-30 18:07:01.000000000 +0200
+@@ -249,6 +249,7 @@
+ struct option long_options[] = {
+ { "home", 1, NULL, 'h' },
+ { "disabled-password", 0, NULL, 'D' },
++ { "empty-password", 0, NULL, 'E' },
+ { "system", 0, NULL, 'S' },
+ { "ingroup", 1, NULL, 'G' },
+ { "no-create-home", 0, NULL, 'H' },
+@@ -287,7 +288,7 @@
+ shell = default_shell;
+
+ /* get args */
+- while ((opt = getopt_long (argc, argv, "h:g:s:G:DSH", long_options, &option_index)) != -1) {
++ while ((opt = getopt_long (argc, argv, "h:g:s:G:DESH", long_options, &option_index)) != -1) {
+ switch (opt) {
+ case 'h':
+ home = optarg;
+@@ -304,6 +305,9 @@
+ case 'D':
+ setpass = 0;
+ break;
++ case 'E':
++ setpass = -1;
++ break;
+ case 'S':
+ system = 1;
+ break;
+@@ -338,7 +342,12 @@
+
+ /* create a passwd struct */
+ pw.pw_name = (char *)login;
+- pw.pw_passwd = (char *)default_passwd;
++ if (setpass != -1)
++ pw.pw_passwd = (char *)default_passwd;
++ else {
++ pw.pw_passwd = (char *)"";
++ setpass = 0;
++ }
+ pw.pw_uid = 0;
+ pw.pw_gid = 0;
+ pw.pw_gecos = (char *)gecos;
diff --git a/packages/tinylogin/tinylogin-1.4/cvs-20040608.patch b/packages/tinylogin/tinylogin-1.4/cvs-20040608.patch
index e69de29bb2..1142329a67 100644
--- a/packages/tinylogin/tinylogin-1.4/cvs-20040608.patch
+++ b/packages/tinylogin/tinylogin-1.4/cvs-20040608.patch
@@ -0,0 +1,821 @@
+Index: Config.h
+===================================================================
+RCS file: /var/cvs/tinylogin/Config.h,v
+retrieving revision 1.10
+retrieving revision 1.12
+diff -u -r1.10 -r1.12
+--- a/Config.h 23 Jun 2002 03:09:07 -0000 1.10
++++ b/Config.h 17 Feb 2003 11:51:55 -0000 1.12
+@@ -27,15 +27,11 @@
+ // Enable checking of /etc/securetty by login
+ #define CONFIG_FEATURE_SECURETTY
+ //
+-// Enable using sha passwords
+-#define CONFIG_FEATURE_SHA1_PASSWORDS
+-//
+ // Enable use of a wheel group
+ #define CONFIG_WHEEL_GROUP
+ //
+-// This compiles out everything but the most
+-// trivial --help usage information (i.e. reduces binary size)
+-#define CONFIG_FEATURE_TRIVIAL_HELP
++// Show verbose usage messages
++//#define CONFIG_FEATURE_VERBOSE_USAGE
+ //
+ // Enable 'tinylogin --install [-s]' to allow tinylogin
+ // to create links (or symlinks) at runtime for all the
+@@ -48,10 +44,6 @@
+ // Nothing beyond this point should ever be touched by
+ // mere mortals so leave this stuff alone.
+ //
+-#ifdef CONFIG_FEATURE_SHA1_PASSWORDS
+-#define CONFIG_SHA1
+-#endif
+-//
+ #ifdef CONFIG_FEATURE_SHADOWPASSWDS
+ #define CONFIG_SHADOW
+ #endif
+Index: addgroup.c
+===================================================================
+RCS file: /var/cvs/tinylogin/addgroup.c,v
+retrieving revision 1.22
+retrieving revision 1.23
+diff -u -r1.22 -r1.23
+--- a/addgroup.c 12 Dec 2002 08:46:03 -0000 1.22
++++ b/addgroup.c 9 Jan 2003 18:43:29 -0000 1.23
+@@ -133,23 +133,33 @@
+ * ________________________________________________________________________ */
+ int addgroup_main(int argc, char **argv)
+ {
++ int opt;
+ char *group;
+ char *user;
+ gid_t gid = 0;
+
+- if (argc < 2) {
+- show_usage();
++ /* get remaining args */
++ while ((opt = getopt (argc, argv, "g:")) != -1) {
++ switch (opt) {
++ case 'g':
++ gid = strtol(optarg, NULL, 10);
++ break;
++ default:
++ show_usage();
++ break;
++ }
+ }
+
+- if (strncmp(argv[1], "-g", 2) == 0) {
+- gid = strtol(argv[2], NULL, 10);
+- group = argv[2];
++ if (optind < argc) {
++ group = argv[optind];
++ optind++;
+ } else {
+ show_usage();
+ }
+-
+- if (argc == 4) {
+- user = argv[3];
++
++ if (optind < argc) {
++ user = argv[optind];
++ optind++;
+ } else {
+ user = "";
+ }
+@@ -163,4 +173,4 @@
+ return addgroup(GROUP_FILE, group, gid, user);
+ }
+
+-/* $Id: addgroup.c,v 1.22 2002/12/12 08:46:03 andersen Exp $ */
++/* $Id: addgroup.c,v 1.23 2003/01/09 18:43:29 andersen Exp $ */
+Index: adduser.c
+===================================================================
+RCS file: /var/cvs/tinylogin/adduser.c,v
+retrieving revision 1.37
+retrieving revision 1.38
+diff -u -r1.37 -r1.38
+--- a/adduser.c 12 Dec 2002 08:46:03 -0000 1.37
++++ b/adduser.c 21 Jun 2003 19:35:42 -0000 1.38
+@@ -21,6 +21,9 @@
+ *
+ */
+
++#ifndef _GNU_SOURCE
++#define _GNU_SOURCE
++#endif
+ #include <errno.h>
+ #include <fcntl.h>
+ #include <stdarg.h>
+@@ -29,6 +32,7 @@
+ #include <string.h>
+ #include <time.h>
+ #include <unistd.h>
++#include <getopt.h>
+ #include <sys/param.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+@@ -93,21 +97,23 @@
+ }
+ }
+
+- /* EDR check for an already existing gid */
+- while (getgrgid(p->pw_uid) != NULL)
+- p->pw_uid++;
+-
+- /* EDR also check for an existing group definition */
+- if (getgrnam(p->pw_name) != NULL)
+- return 3;
++ if (p->pw_gid == 0) {
++ /* EDR check for an already existing gid */
++ while (getgrgid(p->pw_uid) != NULL)
++ p->pw_uid++;
++
++ /* EDR also check for an existing group definition */
++ if (getgrnam(p->pw_name) != NULL)
++ return 3;
++
++ /* EDR create new gid always = uid */
++ p->pw_gid = p->pw_uid;
++ }
+
+ /* EDR bounds check */
+ if ((p->pw_uid > max) || (p->pw_uid < min))
+ return 2;
+
+- /* EDR create new gid always = uid */
+- p->pw_gid = p->pw_uid;
+-
+ /* return 1; */
+ return 0;
+ }
+@@ -136,7 +142,7 @@
+ }
+
+ /* putpwent(3) remix */
+-static int adduser(const char *filename, struct passwd *p)
++static int adduser(const char *filename, struct passwd *p, int makehome, int setpass)
+ {
+ FILE *passwd;
+ int r;
+@@ -144,6 +150,11 @@
+ FILE *shadow;
+ struct spwd *sp;
+ #endif
++ int new_group = 1;
++
++ /* if using a pre-existing group, don't create one */
++ if (p->pw_gid != 0)
++ new_group = 0;
+
+ /* make sure everything is kosher and setup uid && gid */
+ passwd = wfopen(filename, "a");
+@@ -194,29 +205,36 @@
+ }
+ #endif
+
+- /* add to group */
+- /* addgroup should be responsible for dealing w/ gshadow */
+- addgroup_wrapper(p->pw_name, p->pw_gid);
++ if (new_group) {
++ /* add to group */
++ /* addgroup should be responsible for dealing w/ gshadow */
++ addgroup_wrapper(p->pw_name, p->pw_gid);
++ }
+
+ /* Clear the umask for this process so it doesn't
+ * * screw up the permissions on the mkdir and chown. */
+ umask(0);
+
+- /* mkdir */
+- if (mkdir(p->pw_dir, 0755)) {
+- perror_msg("%s", p->pw_dir);
+- }
+- /* Set the owner and group so it is owned by the new user. */
+- if (chown(p->pw_dir, p->pw_uid, p->pw_gid)) {
+- perror_msg("%s", p->pw_dir);
+- }
+- /* Now fix up the permissions to 2755. Can't do it before now
+- * since chown will clear the setgid bit */
+- if (chmod(p->pw_dir, 02755)) {
+- perror_msg("%s", p->pw_dir);
++ if (makehome) {
++ /* mkdir */
++ if (mkdir(p->pw_dir, 0755)) {
++ perror_msg("%s", p->pw_dir);
++ }
++ /* Set the owner and group so it is owned by the new user. */
++ if (chown(p->pw_dir, p->pw_uid, p->pw_gid)) {
++ perror_msg("%s", p->pw_dir);
++ }
++ /* Now fix up the permissions to 2755. Can't do it before now
++ * since chown will clear the setgid bit */
++ if (chmod(p->pw_dir, 02755)) {
++ perror_msg("%s", p->pw_dir);
++ }
++ }
++
++ if (setpass) {
++ /* interactively set passwd */
++ passwd_wrapper(p->pw_name);
+ }
+- /* interactively set passwd */
+- passwd_wrapper(p->pw_name);
+
+ return 0;
+ }
+@@ -228,6 +246,15 @@
+ return geteuid();
+ }
+
++struct option long_options[] = {
++ { "home", 1, NULL, 'h' },
++ { "disabled-password", 0, NULL, 'D' },
++ { "system", 0, NULL, 'S' },
++ { "ingroup", 1, NULL, 'G' },
++ { "no-create-home", 0, NULL, 'H' },
++ { 0, 0, 0, 0 }
++};
++
+ /*
+ * adduser will take a login_name as its first parameter.
+ *
+@@ -244,6 +271,11 @@
+ const char *gecos;
+ const char *home = NULL;
+ const char *shell;
++ const char *usegroup = NULL;
++ int option_index = -1;
++ int setpass = 1;
++ int makehome = 1;
++ int system = 0;
+
+ struct passwd pw;
+
+@@ -255,7 +287,7 @@
+ shell = default_shell;
+
+ /* get args */
+- while ((opt = getopt (argc, argv, "h:g:s:")) != -1) {
++ while ((opt = getopt_long (argc, argv, "h:g:s:G:DSH", long_options, &option_index)) != -1) {
+ switch (opt) {
+ case 'h':
+ home = optarg;
+@@ -266,6 +298,18 @@
+ case 's':
+ shell = optarg;
+ break;
++ case 'H':
++ makehome = 0;
++ break;
++ case 'D':
++ setpass = 0;
++ break;
++ case 'S':
++ system = 1;
++ break;
++ case 'G':
++ usegroup = optarg;
++ break;
+ default:
+ show_usage ();
+ break;
+@@ -301,8 +345,19 @@
+ pw.pw_dir = (char *)home;
+ pw.pw_shell = (char *)shell;
+
++ if (usegroup) {
++ /* Add user to a group that already exists */
++ struct group *g;
++
++ g = getgrnam(usegroup);
++ if (g == NULL)
++ error_msg_and_die("group %s does not exist", usegroup);
++
++ pw.pw_gid = g->gr_gid;
++ }
++
+ /* grand finale */
+- return adduser(PASSWD_FILE, &pw);
++ return adduser(PASSWD_FILE, &pw, makehome, setpass);
+ }
+
+-/* $Id: adduser.c,v 1.37 2002/12/12 08:46:03 andersen Exp $ */
++/* $Id: adduser.c,v 1.38 2003/06/21 19:35:42 andersen Exp $ */
+Index: install.sh
+===================================================================
+RCS file: /var/cvs/tinylogin/install.sh,v
+retrieving revision 1.10
+retrieving revision 1.11
+diff -u -r1.10 -r1.11
+--- a/install.sh 23 Jun 2002 03:09:07 -0000 1.10
++++ b/install.sh 6 Mar 2003 19:29:17 -0000 1.11
+@@ -21,11 +21,11 @@
+ h=`sort tinylogin.links | uniq`
+
+
+-mkdir -p $prefix/bin || exit 1
++install -d -m 0755 $prefix/bin || exit 1
+
+ for i in $h ; do
+ appdir=`dirname $i`
+- mkdir -p $prefix/$appdir || exit 1
++ install -d -m 0755 $prefix/$appdir || exit 1
+ if [ "$2" = "--hardlinks" ]; then
+ bb_path="$prefix/bin/tinylogin"
+ else
+Index: passwd.c
+===================================================================
+RCS file: /var/cvs/tinylogin/passwd.c,v
+retrieving revision 1.19
+retrieving revision 1.20
+diff -u -r1.19 -r1.20
+--- a/passwd.c 7 Nov 2002 02:34:15 -0000 1.19
++++ b/passwd.c 17 Feb 2003 11:51:55 -0000 1.20
+@@ -25,10 +25,6 @@
+ {
+ int x = 0; /* standart: DES */
+
+-#ifdef CONFIG_FEATURE_SHA1_PASSWORDS
+- if (strcasecmp(a, "sha1") == 0)
+- x = 2;
+-#endif
+ if (strcasecmp(a, "md5") == 0)
+ x = 1;
+ return x;
+@@ -394,11 +390,6 @@
+ bzero(cp, strlen(cp));
+ bzero(orig, sizeof(orig));
+
+-#ifdef CONFIG_FEATURE_SHA1_PASSWORDS
+- if (algo == 2) {
+- cp = pw_encrypt(pass, "$2$");
+- } else
+-#endif
+ if (algo == 1) {
+ cp = pw_encrypt(pass, "$1$");
+ } else
+Index: sha1.c
+===================================================================
+RCS file: sha1.c
+diff -N sha1.c
+--- a/sha1.c 20 Dec 2000 21:54:28 -0000 1.2
++++ /dev/null 1 Jan 1970 00:00:00 -0000
+@@ -1,187 +0,0 @@
+-/* vi: set sw=4 ts=4: */
+-/*
+- Implements the Secure Hash Algorithm (SHA1)
+-
+- Copyright (C) 1999 Scott G. Miller
+-
+- Released under the terms of the GNU General Public License v2
+- see file COPYING for details
+-
+- Credits:
+- Robert Klep <robert@ilse.nl> -- Expansion function fix
+- ---
+- FIXME: This source takes int to be a 32 bit integer. This
+- may vary from system to system. I'd use autoconf if I was familiar
+- with it. Anyone want to help me out?
+-*/
+-
+-void sha_hash(int *, int *);
+-void sha_init(int *);
+-char *sprint_hash(int *);
+-void do_sha_hash(int *, int *);
+-
+-/*
+- added 3 functions for sha passowrd stuff (mainly inspired from stuff seen in main.c from shasum-1.3 package)
+-*/
+-#include <stdio.h>
+-#include <string.h>
+-#include <stdlib.h>
+-
+-#include <endian.h>
+-/* On big endian machines, we need to reverse the input to process
+- the blocks correctly */
+-
+-#define switch_endianness(x) (x<<24 & 0xff000000) | \
+- (x<<8 & 0x00ff0000) | \
+- (x>>8 & 0x0000ff00) | \
+- (x>>24 & 0x000000ff)
+-
+-/* Initial hash values */
+-#define Ai 0x67452301
+-#define Bi 0xefcdab89
+-#define Ci 0x98badcfe
+-#define Di 0x10325476
+-#define Ei 0xc3d2e1f0
+-
+-/* SHA1 round constants */
+-#define K1 0x5a827999
+-#define K2 0x6ed9eba1
+-#define K3 0x8f1bbcdc
+-#define K4 0xca62c1d6
+-
+-/* Round functions. Note that f2() is used in both rounds 2 and 4 */
+-#define f1(B,C,D) ((B & C) | ((~B) & D))
+-#define f2(B,C,D) (B ^ C ^ D)
+-#define f3(B,C,D) ((B & C) | (B & D) | (C & D))
+-
+-/* left circular shift functions (rotate left) */
+-#define rol1(x) ((x<<1) | ((x>>31) & 1))
+-#define rol5(A) ((A<<5) | ((A>>27) & 0x1f))
+-#define rol30(B) ((B<<30) | ((B>>2) & 0x3fffffff))
+-
+-/*
+- Hashes 'data', which should be a pointer to 512 bits of data (sixteen
+- 32 bit ints), into the ongoing 160 bit hash value (five 32 bit ints)
+- 'hash'
+-*/
+-void sha_hash(int *data, int *hash)
+-{
+- int W[80];
+- unsigned int A = hash[0], B = hash[1], C = hash[2], D = hash[3], E =
+- hash[4];
+- unsigned int t, x, TEMP;
+-
+- for (t = 0; t < 16; t++) {
+-#ifdef BIG_ENDIAN
+- W[t] = switch_endianness(data[t]);
+-#else
+- W[t] = data[t];
+-#endif
+- }
+-
+-
+- /* SHA1 Data expansion */
+- for (t = 16; t < 80; t++) {
+- x = W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16];
+- W[t] = rol1(x);
+- }
+-
+- /* SHA1 main loop (t=0 to 79)
+- This is broken down into four subloops in order to use
+- the correct round function and constant */
+- for (t = 0; t < 20; t++) {
+- TEMP = rol5(A) + f1(B, C, D) + E + W[t] + K1;
+- E = D;
+- D = C;
+- C = rol30(B);
+- B = A;
+- A = TEMP;
+- }
+- for (; t < 40; t++) {
+- TEMP = rol5(A) + f2(B, C, D) + E + W[t] + K2;
+- E = D;
+- D = C;
+- C = rol30(B);
+- B = A;
+- A = TEMP;
+- }
+- for (; t < 60; t++) {
+- TEMP = rol5(A) + f3(B, C, D) + E + W[t] + K3;
+- E = D;
+- D = C;
+- C = rol30(B);
+- B = A;
+- A = TEMP;
+- }
+- for (; t < 80; t++) {
+- TEMP = rol5(A) + f2(B, C, D) + E + W[t] + K4;
+- E = D;
+- D = C;
+- C = rol30(B);
+- B = A;
+- A = TEMP;
+- }
+- hash[0] += A;
+- hash[1] += B;
+- hash[2] += C;
+- hash[3] += D;
+- hash[4] += E;
+-}
+-
+-/*
+- Takes a pointer to a 160 bit block of data (five 32 bit ints) and
+- intializes it to the start constants of the SHA1 algorithm. This
+- must be called before using hash in the call to sha_hash
+-*/
+-void sha_init(int *hash)
+-{
+- hash[0] = Ai;
+- hash[1] = Bi;
+- hash[2] = Ci;
+- hash[3] = Di;
+- hash[4] = Ei;
+-}
+-
+-
+-/*
+- * write the hash to a string
+- */
+-char *sprint_sha1_hash(int *hashval)
+-{
+- int x = 0;
+- char *out = NULL;
+-
+- if ((out = malloc(43)) == NULL)
+- return NULL;
+- memset(out, 0x00, 43);
+- strcpy(out, "$2$");
+- for (x = 0; x < 5; x++) {
+- sprintf(out + (x * 8) + 3, "%08x", hashval[x]);
+- }
+- out[43] = 0;
+- return out;
+-}
+-
+-
+-/*
+- * hash the password
+- */
+-void do_sha_hash(int *hashval, int *pw)
+-{
+- sha_init(hashval);
+- sha_hash(pw, hashval);
+-}
+-
+-
+-/*
+- * hash a charakter string and return the 160bit integer in hex as a character string
+- */
+-char *sha1_crypt(const char *pw)
+-{
+- int hashval[20];
+-
+- memset(hashval, 0x00, sizeof(hashval));
+- do_sha_hash(hashval, (int *) ((char *) pw + 3));
+-
+- return sprint_sha1_hash(hashval);
+-}
+Index: vlock.c
+===================================================================
+RCS file: /var/cvs/tinylogin/vlock.c,v
+retrieving revision 1.13
+retrieving revision 1.14
+diff -u -r1.13 -r1.14
+--- a/vlock.c 19 Sep 2002 03:50:31 -0000 1.13
++++ b/vlock.c 17 Feb 2003 11:51:56 -0000 1.14
+@@ -26,7 +26,7 @@
+ * minimalistic vlock.
+ */
+ /* Fixed by Erik Andersen to do passwords the tinylogin way...
+- * It now works with md5, sha1, etc passwords. */
++ * It now works with md5, etc passwords. */
+
+ #include "tinylogin.h"
+ #include <stdio.h>
+Index: docs/tinylogin.busybox.net/index.html
+===================================================================
+RCS file: /var/cvs/tinylogin/docs/tinylogin.busybox.net/index.html,v
+retrieving revision 1.23
+retrieving revision 1.25
+diff -u -r1.23 -r1.25
+--- a/docs/tinylogin.busybox.net/index.html 3 Jan 2003 10:56:32 -0000 1.23
++++ b/docs/tinylogin.busybox.net/index.html 3 Jan 2003 11:21:53 -0000 1.25
+@@ -56,6 +56,9 @@
+ Erik Andersen</a>, and licensed under the
+ <a href="http://www.gnu.org/copyleft/gpl.html">GNU GENERAL PUBLIC LICENSE</a>.
+
++<h3>Mailing List Information</h3>
++Here are the Tinylogin <a href="/lists/tinylogin/">mailing list archives</a><br>
++To subscribe, go and visit <a href= "/mailman/listinfo/tinylogin">this page</a>.
+
+ <!-- Begin Download section -->
+
+@@ -222,19 +225,19 @@
+ <ul>
+ <li> <A HREF="http://freshmeat.net/projects/tinylogin/?highlight=tinylogin">
+ Freshmeat AppIndex record for TinyLogin</A>
++ <p>
+
+ <li><a href="http://www.busybox.net/">BusyBox</a>
+ combines tiny versions of many common UNIX utilities into a single small
+ executable. It provides minimalist replacements for most of the utilities
+ you usually find on a standard Linux system.
+-
+ <p>
++
+ <li><a href="http://uclibc.org/uClibc.html">uClibc</a>
+ is a C library for embedded systems. You can actually statically link
+ a "Hello World" application under x86 that only takes 4k (as opposed to
+ 200k under GNU libc). It can do dynamic linking too and works nicely with
+ BusyBox to create very small embedded systems.
+-
+ <p>
+
+ </ul>
+Index: include/libbb.h
+===================================================================
+RCS file: /var/cvs/tinylogin/include/libbb.h,v
+retrieving revision 1.1
+retrieving revision 1.2
+diff -u -r1.1 -r1.2
+--- a/include/libbb.h 23 Jun 2002 03:09:10 -0000 1.1
++++ b/include/libbb.h 17 Feb 2003 11:51:57 -0000 1.2
+@@ -39,9 +39,6 @@
+ #ifdef CONFIG_FEATURE_SHADOWPASSWDS
+ #include "shadow_.h"
+ #endif
+-#ifdef CONFIG_FEATURE_SHA1_PASSWORDS
+-# include "sha1.h"
+-#endif
+
+ #if (__GNU_LIBRARY__ < 5) && (!defined __dietlibc__)
+ /* libc5 doesn't define socklen_t */
+Index: include/sha1.h
+===================================================================
+RCS file: include/sha1.h
+diff -N include/sha1.h
+--- a/include/sha1.h 23 Jun 2002 03:09:10 -0000 1.1
++++ /dev/null 1 Jan 1970 00:00:00 -0000
+@@ -1,3 +0,0 @@
+-/* SHA1.H - header file for SHA1.C */
+-
+-char *sha1_crypt(const char *pw);
+Index: include/usage.h
+===================================================================
+RCS file: /var/cvs/tinylogin/include/usage.h,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- a/include/usage.h 3 Jul 2002 05:57:00 -0000 1.2
++++ b/include/usage.h 17 Feb 2003 11:51:57 -0000 1.3
+@@ -33,11 +33,6 @@
+ "\t-h\tName of the remote host for this login.\n" \
+ "\t-p\tPreserve environment."
+
+-#ifdef CONFIG_FEATURE_SHA1_PASSWORDS
+- #define PASSWORD_ALG_TYPES(a) a
+-#else
+- #define PASSWORD_ALG_TYPES(a)
+-#endif
+ #define passwd_trivial_usage \
+ "[OPTION] [name]"
+ #define passwd_full_usage \
+@@ -46,7 +41,6 @@
+ "Options:\n" \
+ "\t-a\tDefine which algorithm shall be used for the password.\n" \
+ "\t\t\t(Choices: des, md5" \
+- PASSWORD_ALG_TYPES(", sha1") \
+ ")\n\t-d\tDelete the password for the specified user account.\n" \
+ "\t-l\tLocks (disables) the specified user account.\n" \
+ "\t-u\tUnlocks (re-enables) the specified user account."
+Index: libbb/obscure.c
+===================================================================
+RCS file: /var/cvs/tinylogin/libbb/obscure.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- a/libbb/obscure.c 23 Jun 2002 04:05:59 -0000 1.2
++++ b/libbb/obscure.c 30 Jul 2003 08:41:33 -0000 1.3
+@@ -44,7 +44,7 @@
+ * can't be a palindrome - like `R A D A R' or `M A D A M'
+ */
+
+-static int palindrome(const char *old, const char *newval)
++static int palindrome(const char *newval)
+ {
+ int i, j;
+
+@@ -79,24 +79,25 @@
+ * a nice mix of characters.
+ */
+
+-static int simple(const char *old, const char *newval)
++static int simple(const char *newval)
+ {
+ int digits = 0;
+ int uppers = 0;
+ int lowers = 0;
+ int others = 0;
++ int c;
+ int size;
+ int i;
+
+- for (i = 0; newval[i]; i++) {
+- if (isdigit(newval[i]))
+- digits++;
+- else if (isupper(newval[i]))
+- uppers++;
+- else if (islower(newval[i]))
+- lowers++;
++ for (i = 0; (c = *newval++) != 0; i++) {
++ if (isdigit(c))
++ digits = c;
++ else if (isupper(c))
++ uppers = c;
++ else if (islower(c))
++ lowers = c;
+ else
+- others++;
++ others = c;
+ }
+
+ /*
+@@ -129,49 +130,53 @@
+ return string;
+ }
+
+-static char *password_check(const char *old, const char *newval, const struct passwd *pwdp)
++static const char *
++password_check(const char *old, const char *newval, const struct passwd *pwdp)
+ {
+- char *msg = NULL;
+- char *oldmono, *newmono, *wrapped;
++ const char *msg;
++ char *newmono, *wrapped;
++ int lenwrap;
+
+ if (strcmp(newval, old) == 0)
+ return "no change";
++ if (simple(newval))
++ return "too simple";
+
++ msg = NULL;
+ newmono = str_lower(xstrdup(newval));
+- oldmono = str_lower(xstrdup(old));
+- wrapped = (char *) xmalloc(strlen(oldmono) * 2 + 1);
+- strcpy(wrapped, oldmono);
+- strcat(wrapped, oldmono);
++ lenwrap = strlen(old) * 2 + 1;
++ wrapped = (char *) xmalloc(lenwrap);
++ str_lower(strcpy(wrapped, old));
+
+- if (palindrome(oldmono, newmono))
++ if (palindrome(newmono))
+ msg = "a palindrome";
+
+- if (!msg && strcmp(oldmono, newmono) == 0)
++ else if (strcmp(wrapped, newmono) == 0)
+ msg = "case changes only";
+
+- if (!msg && similiar(oldmono, newmono))
++ else if (similiar(wrapped, newmono))
+ msg = "too similiar";
+
+- if (!msg && simple(old, newval))
+- msg = "too simple";
+-
+- if (!msg && strstr(wrapped, newmono))
+- msg = "rotated";
++ else {
++ safe_strncpy(wrapped + lenwrap, wrapped, lenwrap + 1);
++ if (strstr(wrapped, newmono))
++ msg = "rotated";
++ }
+
+ bzero(newmono, strlen(newmono));
+- bzero(oldmono, strlen(oldmono));
+- bzero(wrapped, strlen(wrapped));
++ bzero(wrapped, lenwrap);
+ free(newmono);
+- free(oldmono);
+ free(wrapped);
+
+ return msg;
+ }
+
+-static char *obscure_msg(const char *old, const char *newval, const struct passwd *pwdp)
++static const char *
++obscure_msg(const char *old, const char *newval, const struct passwd *pwdp)
+ {
+ int maxlen, oldlen, newlen;
+- char *new1, *old1, *msg;
++ char *new1, *old1;
++ const char *msg;
+
+ oldlen = strlen(old);
+ newlen = strlen(newval);
+@@ -233,7 +238,7 @@
+
+ extern int obscure(const char *old, const char *newval, const struct passwd *pwdp)
+ {
+- char *msg = obscure_msg(old, newval, pwdp);
++ const char *msg = obscure_msg(old, newval, pwdp);
+
+ /* if (msg) { */
+ if (msg != NULL) {
+Index: libbb/pw_encrypt.c
+===================================================================
+RCS file: /var/cvs/tinylogin/libbb/pw_encrypt.c,v
+retrieving revision 1.1
+retrieving revision 1.2
+diff -u -r1.1 -r1.2
+--- a/libbb/pw_encrypt.c 23 Jun 2002 03:09:12 -0000 1.1
++++ b/libbb/pw_encrypt.c 17 Feb 2003 11:51:58 -0000 1.2
+@@ -30,11 +30,6 @@
+ static char cipher[128];
+ char *cp;
+
+-#ifdef CONFIG_FEATURE_SHA1_PASSWORDS
+- if (strncmp(salt, "$2$", 3) == 0) {
+- return sha1_crypt(clear);
+- }
+-#endif
+ cp = (char *) crypt(clear, salt);
+ /* if crypt (a nonstandard crypt) returns a string too large,
+ truncate it so we don't overrun buffers and hope there is