tag busybox-1.2.1 1_2_1
authorMike Frysinger <vapier@gentoo.org>
Thu, 24 Aug 2006 03:06:55 +0000 (03:06 -0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 24 Aug 2006 03:06:55 +0000 (03:06 -0000)
14 files changed:
Makefile
Rules.mak
archival/libunarchive/get_header_tar.c
changelog [new file with mode: 0644]
include/libbb.h
libbb/obscure.c
libbb/xfuncs.c
loginutils/passwd.c
networking/arping.c
networking/inetd.c
networking/traceroute.c
shell/ash.c
shell/lash.c
util-linux/dmesg.c

index a705bac32b9e4dd6b8a352141797218acd476482..a14cbd00a4d877295287d3d7d2037fc6cdfa2395 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -216,6 +216,8 @@ randconfig: scripts/config/conf
 
 allyesconfig: scripts/config/conf
        @./scripts/config/conf -y $(CONFIG_CONFIG_IN) > /dev/null
+       @$(SED) -i -r -e "s/^(USING_CROSS_COMPILER)=.*/# \1 is not set/" .config
+       @./scripts/config/conf -o $(CONFIG_CONFIG_IN) > /dev/null
 
 allnoconfig: scripts/config/conf
        @./scripts/config/conf -n $(CONFIG_CONFIG_IN) > /dev/null
@@ -226,13 +228,13 @@ allnoconfig: scripts/config/conf
 
 defconfig: scripts/config/conf
        @./scripts/config/conf -y $(CONFIG_CONFIG_IN) > /dev/null
-       @$(SED) -i -r -e "s/^(CONFIG_(DEBUG.*|STATIC|SELINUX|BUILD_(AT_ONCE|LIBBUSYBOX)|FEATURE_(DEVFS|FULL_LIBBUSYBOX|SHARED_BUSYBOX|MTAB_SUPPORT|CLEAN_UP|UDHCP_DEBUG)|INSTALL_NO_USR))=.*/# \1 is not set/" .config
+       @$(SED) -i -r -e "s/^(USING_CROSS_COMPILER|CONFIG_(DEBUG.*|STATIC|SELINUX|BUILD_(AT_ONCE|LIBBUSYBOX)|FEATURE_(DEVFS|FULL_LIBBUSYBOX|SHARED_BUSYBOX|MTAB_SUPPORT|CLEAN_UP|UDHCP_DEBUG)|INSTALL_NO_USR))=.*/# \1 is not set/" .config
        @./scripts/config/conf -o $(CONFIG_CONFIG_IN) > /dev/null
 
 
 allbareconfig: scripts/config/conf
        @./scripts/config/conf -y $(CONFIG_CONFIG_IN) > /dev/null
-       @$(SED) -i -r -e "s/^(CONFIG_(DEBUG|STATIC|SELINUX|DEVFSD|NC_GAPING_SECURITY_HOLE|BUILD_AT_ONCE)).*/# \1 is not set/" .config
+       @$(SED) -i -r -e "s/^(USING_CROSS_COMPILER|CONFIG_(DEBUG|STATIC|SELINUX|DEVFSD|NC_GAPING_SECURITY_HOLE|BUILD_AT_ONCE)).*/# \1 is not set/" .config
        @$(SED) -i -e "/FEATURE/s/=.*//;/^[^#]/s/.*FEATURE.*/# \0 is not set/;" .config
        @echo "CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y" >> .config
        @yes n | ./scripts/config/conf -o $(CONFIG_CONFIG_IN) > /dev/null
@@ -483,7 +485,6 @@ distclean: clean
        rm -f scripts/bb_mkdep scripts/usage
        rm -r -f include/config include/config.h $(DEP_INCLUDES)
        find . -name .depend'*' -print0 | xargs -0 rm -f
-       find . -name '*.rej' -print0 | xargs -0 rm -f
        rm -f .hdepend
        rm -f .config .config.old .config.cmd
 
index b7a91b63bb2e6193f4f9392f9f6b758cecd8055c..44c9f23742febc6184236be6414adfee697ea8c4 100644 (file)
--- a/Rules.mak
+++ b/Rules.mak
@@ -14,7 +14,7 @@ endif
 PROG      := busybox
 MAJOR_VERSION   :=1
 MINOR_VERSION   :=2
-SUBLEVEL_VERSION:=0
+SUBLEVEL_VERSION:=1
 EXTRAVERSION    :=
 VERSION   :=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL_VERSION)$(EXTRAVERSION)
 BUILDTIME := $(shell TZ=UTC date -u "+%Y.%m.%d-%H:%M%z")
@@ -24,20 +24,22 @@ BUILDTIME := $(shell TZ=UTC date -u "+%Y.%m.%d-%H:%M%z")
 # With a modern GNU make(1) (highly recommended, that's what all the
 # developers use), all of the following configuration values can be
 # overridden at the command line.  For example:
-#   make CROSS_COMPILE=powerpc-linux- top_srcdir="$HOME/busybox" PREFIX=/mnt/app
+#   make CROSS=powerpc-linux- top_srcdir="$HOME/busybox" PREFIX=/mnt/app
 #--------------------------------------------------------
 
-# If you are running a cross compiler, you will want to set CROSS_COMPILE
+# If you are running a cross compiler, you will want to set 'CROSS'
 # to something more interesting...  Target architecture is determined
 # by asking the CC compiler what arch it compiles things for, so unless
 # your compiler is broken, you should not need to specify TARGET_ARCH
-CC             = $(CROSS_COMPILE)gcc
-AR             = $(CROSS_COMPILE)ar
-AS             = $(CROSS_COMPILE)as
-LD             = $(CROSS_COMPILE)ld
-NM             = $(CROSS_COMPILE)nm
-STRIP          = $(CROSS_COMPILE)strip
-ELF2FLT        = $(CROSS_COMPILE)elf2flt
+CROSS          =$(strip $(subst ",, $(strip $(CROSS_COMPILER_PREFIX))))
+# be gentle to vi coloring.. "))
+CC             = $(CROSS)gcc
+AR             = $(CROSS)ar
+AS             = $(CROSS)as
+LD             = $(CROSS)ld
+NM             = $(CROSS)nm
+STRIP          = $(CROSS)strip
+ELF2FLT        = $(CROSS)elf2flt
 CPP            = $(CC) -E
 SED           ?= sed
 BZIP2         ?= bzip2
@@ -62,7 +64,7 @@ CC_MAJOR:=$(shell printf "%02d" $(shell echo __GNUC__ | $(CC) -E -xc - | tail -n
 CC_MINOR:=$(shell printf "%02d" $(shell echo __GNUC_MINOR__ | $(CC) -E -xc - | tail -n 1))
 
 #--------------------------------------------------------
-export VERSION BUILDTIME HOSTCC HOSTCFLAGS CROSS_COMPILE CC AR AS LD NM STRIP CPP
+export VERSION BUILDTIME HOSTCC HOSTCFLAGS CROSS CC AR AS LD NM STRIP CPP
 ifeq ($(strip $(TARGET_ARCH)),)
 TARGET_ARCH:=$(shell $(CC) -dumpmachine | $(SED) -e s'/-.*//' \
                -e 's/i.86/i386/' \
@@ -169,13 +171,11 @@ CHECKED_LDFLAGS := $(call check_ld,$(LD),--warn-common,)
 
 # Pin CHECKED_CFLAGS with := so it's only evaluated once.
 CHECKED_CFLAGS:=$(call check_cc,$(CC),-Wall,)
-CHECKED_CFLAGS+=$(call check_cc,$(HOSTCC),-Werror,)
 CHECKED_CFLAGS+=$(call check_cc,$(CC),-Wstrict-prototypes,)
 CHECKED_CFLAGS+=$(call check_cc,$(CC),-Wshadow,)
 CHECKED_CFLAGS+=$(call check_cc,$(CC),-funsigned-char,)
 CHECKED_CFLAGS+=$(call check_cc,$(CC),-mmax-stack-frame=256,)
 CHECKED_CFLAGS+=$(call check_cc,$(CC),-fno-builtin-strlen)
-CHECKED_CFLAGS+=$(call check_cc,$(CC),-finline-limit=0)
 
 # Preemptively pin this too.
 PROG_CFLAGS:=
index 4394d23ee016e50ca376df958cd0f9dad1e1ec46..0f3196221cfd7c53831abb0c648d8f67be555a32 100644 (file)
@@ -1,4 +1,3 @@
-/* vi: set sw=4 ts=4: */
 /* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  *
  *  FIXME:
@@ -56,7 +55,11 @@ char get_header_tar(archive_handle_t *archive_handle)
        /* Align header */
        data_align(archive_handle, 512);
 
-       xread(archive_handle->src_fd, tar.raw, 512);
+       if (bb_full_read(archive_handle->src_fd, tar.raw, 512) != 512) {
+               /* Assume end of file */
+               bb_error_msg_and_die("Short header");
+               //return(EXIT_FAILURE);
+       }
        archive_handle->offset += 512;
 
        /* If there is no filename its an empty header */
@@ -65,7 +68,7 @@ char get_header_tar(archive_handle_t *archive_handle)
                        /* This is the second consecutive empty header! End of archive!
                         * Read until the end to empty the pipe from gz or bz2
                         */
-                       while (full_read(archive_handle->src_fd, tar.raw, 512) == 512);
+                       while (bb_full_read(archive_handle->src_fd, tar.raw, 512) == 512);
                        return(EXIT_FAILURE);
                }
                end = 1;
@@ -162,14 +165,14 @@ char get_header_tar(archive_handle_t *archive_handle)
 #ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
        case 'L': {
                        longname = xzalloc(file_header->size + 1);
-                       xread(archive_handle->src_fd, longname, file_header->size);
+                       archive_xread_all(archive_handle, longname, file_header->size);
                        archive_handle->offset += file_header->size;
 
                        return(get_header_tar(archive_handle));
                }
        case 'K': {
                        linkname = xzalloc(file_header->size + 1);
-                       xread(archive_handle->src_fd, linkname, file_header->size);
+                       archive_xread_all(archive_handle, linkname, file_header->size);
                        archive_handle->offset += file_header->size;
 
                        file_header->name = linkname;
diff --git a/changelog b/changelog
new file mode 100644 (file)
index 0000000..ace9acf
--- /dev/null
+++ b/changelog
@@ -0,0 +1,598 @@
+Various bug fixes that apply to busybox 1.2.0, cherry-picked from the
+ongoing development branch.  This will form the basis for busybox 1.2.1.
+
+I'll append fixes to this as they come up.  (Check the file date, or the bug
+list below.)  This file is basically a concatenation of the following:
+
+http://busybox.net/downloads/patches/svn-15575.patch
+http://busybox.net/downloads/patches/svn-15653.patch
+http://busybox.net/downloads/patches/svn-15656.patch
+http://busybox.net/downloads/patches/svn-15658.patch
+http://busybox.net/downloads/patches/svn-15659.patch
+http://busybox.net/downloads/patches/svn-15660.patch
+http://busybox.net/downloads/patches/svn-15670.patch
+http://busybox.net/downloads/patches/svn-15698.patch
+http://busybox.net/downloads/patches/svn-15700.patch
+http://busybox.net/downloads/patches/svn-15702.patch
+http://busybox.net/downloads/patches/svn-15705.patch
+http://busybox.net/downloads/patches/svn-15727.patch
+
+ ------------------------------------------------------------------------
+r15575 | landley | 2006-07-01 13:19:02 -0400 (Sat, 01 Jul 2006) | 2 lines
+Changed paths:
+   M /trunk/busybox/shell/lash.c
+
+Patch from Shaun Jackman moving the var=value logic to where it can do some
+good.
+
+ ------------------------------------------------------------------------
+Index: shell/lash.c
+===================================================================
+--- shell/lash.c       (revision 15574)
++++ shell/lash.c       (revision 15575)
+@@ -1171,12 +1171,6 @@
+ {
+       struct built_in_command *x;
+-      /* Check if the command sets an environment variable. */
+-      if( strchr(child->argv[0], '=') != NULL ) {
+-              child->argv[1] = child->argv[0];
+-              _exit(builtin_export(child));
+-      }
+-
+       /* Check if the command matches any of the non-forking builtins.
+        * Depending on context, this might be redundant.  But it's
+        * easier to waste a few CPU cycles than it is to figure out
+@@ -1300,6 +1294,12 @@
+                * is doomed to failure, and doesn't work on bash, either.
+                */
+               if (newjob->num_progs == 1) {
++                      /* Check if the command sets an environment variable. */
++                      if (strchr(child->argv[0], '=') != NULL) {
++                              child->argv[1] = child->argv[0];
++                              return builtin_export(child);
++                      }
++
+                       for (x = bltins; x->cmd; x++) {
+                               if (strcmp(child->argv[0], x->cmd) == 0 ) {
+                                       int rcode;
+ ------------------------------------------------------------------------
+r15653 | landley | 2006-07-05 21:09:21 -0400 (Wed, 05 Jul 2006) | 6 lines
+Changed paths:
+   M /trunk/busybox/shell/ash.c
+
+Bug fix from Vladimir Oleynic via Paul Fox for:
+echo "+bond0" > /sys/class/net/bonding_masters
+while true; do
+  echo hello
+done  
+
+ ------------------------------------------------------------------------
+Index: shell/ash.c
+===================================================================
+--- shell/ash.c        (revision 15652)
++++ shell/ash.c        (revision 15653)
+@@ -3469,6 +3469,7 @@
+       flushall();
+ cmddone:
+       exitstatus |= ferror(stdout);
++      clearerr(stdout);
+       commandname = savecmdname;
+       exsig = 0;
+       handler = savehandler;
+ ------------------------------------------------------------------------
+r15656 | landley | 2006-07-06 12:41:56 -0400 (Thu, 06 Jul 2006) | 5 lines
+Changed paths:
+   M /trunk/busybox/util-linux/dmesg.c
+
+Fix three embarassing thinkos in the new dmesg.c:
+1) the c argument shouldn't have had a : after that, dunno how that got there.
+2) the xgetlarg for level was using size
+3) because xgetlarg's error message _SUCKS_ (it does a show_usage() rather than giving any specific info about the range that was violated) I dropped the range down to 2 bytes.  (Which works fine, I dunno why we were nit-picking about that...)
+
+ ------------------------------------------------------------------------
+Index: util-linux/dmesg.c
+===================================================================
+--- util-linux/dmesg.c (revision 15655)
++++ util-linux/dmesg.c (revision 15656)
+@@ -15,16 +15,16 @@
+ int dmesg_main(int argc, char *argv[])
+ {
+       char *size, *level;
+-      int flags = bb_getopt_ulflags(argc, argv, "c:s:n:", &size, &level);
++      int flags = bb_getopt_ulflags(argc, argv, "cs:n:", &size, &level);
+       if (flags & 4) {
+-              if(klogctl(8, NULL, bb_xgetlarg(size, 10, 0, 10)))
++              if(klogctl(8, NULL, bb_xgetlarg(level, 10, 0, 10)))
+                       bb_perror_msg_and_die("klogctl");
+       } else {
+               int len;
+               char *buf;
+-              len = (flags & 2) ? bb_xgetlarg(size, 10, 4096, INT_MAX) : 16384;
++              len = (flags & 2) ? bb_xgetlarg(size, 10, 2, INT_MAX) : 16384;
+               buf = xmalloc(len);
+               if (0 > (len = klogctl(3 + (flags & 1), buf, len)))
+                       bb_perror_msg_and_die("klogctl");
+ ------------------------------------------------------------------------
+r15658 | pgf | 2006-07-06 16:00:43 -0400 (Thu, 06 Jul 2006) | 4 lines
+Changed paths:
+   M /trunk/busybox/Makefile
+
+fix dependencies so that compressed usage gets rebuilt if
+    a) include/usage.h is changed, and 
+    b) after "make clean".
+
+ ------------------------------------------------------------------------
+Index: Makefile
+===================================================================
+--- Makefile   (revision 15657)
++++ Makefile   (revision 15658)
+@@ -436,13 +436,16 @@
+ ifeq ($(strip $(CONFIG_FEATURE_COMPRESS_USAGE)),y)
+ USAGE_BIN:=scripts/usage
+-$(USAGE_BIN): $(top_srcdir)/scripts/usage.c .config
++$(USAGE_BIN): $(top_srcdir)/scripts/usage.c .config \
++              $(top_srcdir)/include/usage.h
+       $(do_link.h)
+ DEP_INCLUDES += include/usage_compressed.h
+-include/usage_compressed.h: .config $(USAGE_BIN) $(top_srcdir)/scripts/usage_compressed
+-      $(Q)SED="$(SED)" $(SHELL) $(top_srcdir)/scripts/usage_compressed "$(top_builddir)/scripts" > $@
++include/usage_compressed.h: .config $(USAGE_BIN) \
++              $(top_srcdir)/scripts/usage_compressed
++      $(Q)SED="$(SED)" $(SHELL) $(top_srcdir)/scripts/usage_compressed \
++      "$(top_builddir)/scripts" > $@
+ endif # CONFIG_FEATURE_COMPRESS_USAGE
+ # workaround alleged bug in make-3.80, make-3.81
+@@ -470,7 +473,8 @@
+           docs/BusyBox.txt docs/BusyBox.1 docs/BusyBox.html \
+           docs/busybox.net/BusyBox.html busybox.links \
+           libbusybox.so* \
+-          .config.old busybox busybox_unstripped
++          .config.old busybox busybox_unstripped \
++          include/usage_compressed.h scripts/usage
+       - rm -r -f _install testsuite/links
+       - find . -name .\*.flags -o -name \*.o  -o -name \*.om -o -name \*.syn \
+           -o -name \*.os -o -name \*.osm -o -name \*.a | xargs rm -f
+ ------------------------------------------------------------------------
+r15659 | landley | 2006-07-06 16:02:47 -0400 (Thu, 06 Jul 2006) | 3 lines
+Changed paths:
+   M /trunk/busybox/libbb/Makefile
+
+Attempt to address Shaun Jackman's problem adding "busybox: busybox.bflt" to
+.config.mak.
+
+ ------------------------------------------------------------------------
+Index: libbb/Makefile
+===================================================================
+--- libbb/Makefile     (revision 15658)
++++ libbb/Makefile     (revision 15659)
+@@ -12,6 +12,12 @@
+ endif
+ srcdir=$(top_srcdir)/libbb
+ LIBBB_DIR:=./
++
++# Ensure "all" is still the default target when make is run by itself in
++# libbb, even if the files we include define rules for targets.
++
++all:
++
+ include $(top_srcdir)/Rules.mak
+ include $(top_builddir)/.config
+ include Makefile.in
+ ------------------------------------------------------------------------
+r15660 | landley | 2006-07-06 16:30:19 -0400 (Thu, 06 Jul 2006) | 3 lines
+Changed paths:
+   M /trunk/busybox/archival/libunarchive/get_header_tar.c
+
+Fix tar so it can extract git-generated tarballs, based on a suggestion
+from Erik Frederiksen.
+
+ ------------------------------------------------------------------------
+Index: archival/libunarchive/get_header_tar.c
+===================================================================
+--- archival/libunarchive/get_header_tar.c     (revision 15659)
++++ archival/libunarchive/get_header_tar.c     (revision 15660)
+@@ -137,10 +137,6 @@
+       case '1':
+               file_header->mode |= S_IFREG;
+               break;
+-      case 'x':
+-      case 'g':
+-              bb_error_msg_and_die("pax is not tar");
+-              break;
+       case '7':
+               /* Reserved for high performance files, treat as normal file */
+       case 0:
+@@ -188,8 +184,11 @@
+       case 'N':       /* Old GNU for names > 100 characters */
+       case 'S':       /* Sparse file */
+       case 'V':       /* Volume header */
+-              bb_error_msg("Ignoring GNU extension type %c", tar.formated.typeflag);
+ #endif
++      case 'g':       /* pax global header */
++      case 'x':       /* pax extended header */
++              bb_error_msg("Ignoring extension type %c", tar.formated.typeflag);
++              break;
+       default:
+               bb_error_msg("Unknown typeflag: 0x%x", tar.formated.typeflag);
+       }
+ ------------------------------------------------------------------------
+r15670 | landley | 2006-07-09 13:03:07 -0400 (Sun, 09 Jul 2006) | 3 lines
+Changed paths:
+   M /trunk/busybox/shell/lash.c
+
+Bugfix from Shaun Jackman (check that argv[optind] isn't null before
+dereferencing it) plus a bunch of tweaks from me.
+
+ ------------------------------------------------------------------------
+Index: shell/lash.c
+===================================================================
+--- shell/lash.c       (revision 15669)
++++ shell/lash.c       (revision 15670)
+@@ -1498,6 +1498,8 @@
+               remove_job(&job_list, job_list.fg);
+       }
+ }
++#else
++void free_memory(void);
+ #endif
+ #ifdef CONFIG_LASH_JOB_CONTROL
+@@ -1528,7 +1530,7 @@
+       /* Put ourselves in our own process group.  */
+       setsid();
+       shell_pgrp = getpid ();
+-      setpgid (shell_pgrp, shell_pgrp);
++      setpgid(shell_pgrp, shell_pgrp);
+       /* Grab control of the terminal.  */
+       tcsetpgrp(shell_terminal, shell_pgrp);
+@@ -1577,7 +1579,7 @@
+                               argv = argv+optind;
+                               break;
+                       case 'i':
+-                              interactive = TRUE;
++                              interactive++;
+                               break;
+                       default:
+                               bb_show_usage();
+@@ -1591,18 +1593,18 @@
+        *    standard output is a terminal
+        *    Refer to Posix.2, the description of the `sh' utility. */
+       if (argv[optind]==NULL && input==stdin &&
+-                      isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) {
+-              interactive=TRUE;
++                      isatty(STDIN_FILENO) && isatty(STDOUT_FILENO))
++      {
++              interactive++;
+       }
+       setup_job_control();
+-      if (interactive==TRUE) {
+-              //printf( "optind=%d  argv[optind]='%s'\n", optind, argv[optind]);
++      if (interactive) {
+               /* Looks like they want an interactive shell */
+-#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
+-              printf( "\n\n%s Built-in shell (lash)\n", BB_BANNER);
+-              printf( "Enter 'help' for a list of built-in commands.\n\n");
+-#endif
+-      } else if (local_pending_command==NULL) {
++              if (!ENABLE_FEATURE_SH_EXTRA_QUIET) {
++                      printf( "\n\n%s Built-in shell (lash)\n", BB_BANNER);
++                      printf( "Enter 'help' for a list of built-in commands.\n\n");
++              }
++      } else if (!local_pending_command && argv[optind]) {
+               //printf( "optind=%d  argv[optind]='%s'\n", optind, argv[optind]);
+               input = bb_xfopen(argv[optind], "r");
+               /* be lazy, never mark this closed */
+@@ -1614,15 +1616,10 @@
+       if (!cwd)
+               cwd = bb_msg_unknown;
+-#ifdef CONFIG_FEATURE_CLEAN_UP
+-      atexit(free_memory);
+-#endif
++      if (ENABLE_FEATURE_CLEAN_UP) atexit(free_memory);
+-#ifdef CONFIG_FEATURE_COMMAND_EDITING
+-      cmdedit_set_initial_prompt();
+-#else
+-      PS1 = NULL;
+-#endif
++      if (ENABLE_FEATURE_COMMAND_EDITING) cmdedit_set_initial_prompt();
++      else PS1 = NULL;
+       return (busy_loop(input));
+ }
+ ------------------------------------------------------------------------
+r15698 | vapier | 2006-07-14 23:59:00 -0400 (Fri, 14 Jul 2006) | 2 lines
+Changed paths:
+   M /trunk/busybox/libbb/obscure.c
+
+Tito writes: If the gecos field of an user is empty, obscure reports a false "similar to gecos" error.
+
+ ------------------------------------------------------------------------
+Index: libbb/obscure.c
+===================================================================
+--- libbb/obscure.c    (revision 15697)
++++ libbb/obscure.c    (revision 15698)
+@@ -109,7 +109,7 @@
+               return "similar to username";
+       }
+       /* no gecos as-is, as sub-string, reversed, capitalized, doubled */
+-      if (string_checker(new_p, pw->pw_gecos)) {
++      if (*pw->pw_gecos && string_checker(new_p, pw->pw_gecos)) {
+               return "similar to gecos";
+       }
+       /* hostname as-is, as sub-string, reversed, capitalized, doubled */
+ ------------------------------------------------------------------------
+r15700 | landley | 2006-07-15 19:00:46 -0400 (Sat, 15 Jul 2006) | 4 lines
+Changed paths:
+   M /trunk/busybox/include/libbb.h
+   M /trunk/busybox/libbb/xfuncs.c
+
+We need xsetuid() and xsetgid() because per-user process resource limits can
+prevent a process from switching to a user that has too many processes, and
+when that happens WE'RE STILL ROOT.  See http://lwn.net/Articles/190331/
+
+ ------------------------------------------------------------------------
+Index: libbb/xfuncs.c
+===================================================================
+--- libbb/xfuncs.c     (revision 15699)
++++ libbb/xfuncs.c     (revision 15700)
+@@ -232,3 +232,15 @@
+       return 0;
+ }
+ #endif        
++
++#ifdef L_setuid
++void xsetgid(gid_t gid)
++{
++      if (setgid(gid)) bb_error_msg_and_die("setgid");
++}
++
++void xsetuid(uid_t uid)
++{
++      if (setuid(uid)) bb_error_msg_and_die("setuid");
++}
++#endif
+Index: include/libbb.h
+===================================================================
+--- include/libbb.h    (revision 15699)
++++ include/libbb.h    (revision 15700)
+@@ -185,6 +185,8 @@
+ extern bb_xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
+ extern void bb_xlisten(int s, int backlog);
+ extern void bb_xchdir(const char *path);
++extern void xsetgid(gid_t gid);
++extern void xsetuid(uid_t uid);
+ #define BB_GETOPT_ERROR 0x80000000UL
+ extern const char *bb_opt_complementally;
+ ------------------------------------------------------------------------
+r15702 | landley | 2006-07-16 04:06:34 -0400 (Sun, 16 Jul 2006) | 2 lines
+Changed paths:
+   M /trunk/busybox/loginutils/passwd.c
+   M /trunk/busybox/networking/arping.c
+   M /trunk/busybox/networking/ether-wake.c
+   M /trunk/busybox/networking/fakeidentd.c
+   M /trunk/busybox/networking/inetd.c
+   M /trunk/busybox/networking/traceroute.c
+
+Convert setuid/setgid users to xsetuid/xsetgid.
+
+ ------------------------------------------------------------------------
+Index: networking/fakeidentd.c
+===================================================================
+--- networking/fakeidentd.c    (revision 15701)
++++ networking/fakeidentd.c    (revision 15702)
+@@ -159,8 +159,8 @@
+               close(0);
+               inetbind();
+-              if (setgid(nogrp))   bb_error_msg_and_die("Could not setgid()");
+-              if (setuid(nobody))  bb_error_msg_and_die("Could not setuid()");
++              xsetgid(nogrp);
++              xsetuid(nobody);
+               close(1);
+               close(2);
+Index: networking/ether-wake.c
+===================================================================
+--- networking/ether-wake.c    (revision 15701)
++++ networking/ether-wake.c    (revision 15702)
+@@ -145,7 +145,7 @@
+       s = make_socket();
+       /* now that we have a raw socket we can drop root */
+-      setuid(getuid());
++      xsetuid(getuid());
+       /* look up the dest mac address */
+       get_dest_addr(argv[optind], &eaddr);
+Index: networking/inetd.c
+===================================================================
+--- networking/inetd.c (revision 15701)
++++ networking/inetd.c (revision 15702)
+@@ -1513,11 +1513,11 @@
+                         if (sep->se_group) {
+                               pwd->pw_gid = grp->gr_gid;
+                         }
+-                        setgid ((gid_t) pwd->pw_gid);
++                        xsetgid ((gid_t) pwd->pw_gid);
+                         initgroups (pwd->pw_name, pwd->pw_gid);
+-                        setuid ((uid_t) pwd->pw_uid);
++                        xsetuid((uid_t) pwd->pw_uid);
+                       } else if (sep->se_group) {
+-                        setgid (grp->gr_gid);
++                        xsetgid(grp->gr_gid);
+                         setgroups (1, &grp->gr_gid);
+                       }
+                       dup2 (ctrl, 0);
+Index: networking/traceroute.c
+===================================================================
+--- networking/traceroute.c    (revision 15701)
++++ networking/traceroute.c    (revision 15702)
+@@ -941,7 +941,6 @@
+ #endif
+       u_short off = 0;
+       struct IFADDRLIST *al;
+-      int uid = getuid();
+       char *device = NULL;
+       int max_ttl = 30;
+       char *max_ttl_str = NULL;
+@@ -1010,8 +1009,7 @@
+            * set the ip source address of the outbound
+            * probe (e.g., on a multi-homed host).
+            */
+-           if (uid)
+-              bb_error_msg_and_die("-s %s: Permission denied", source);
++           if (getuid()) bb_error_msg_and_die("-s %s: Permission denied", source);
+       }
+       if(waittime_str)
+               waittime = str2val(waittime_str, "wait time", 2, 24 * 60 * 60);
+@@ -1160,8 +1158,8 @@
+                   sizeof(on));
+       /* Revert to non-privileged user after opening sockets */
+-      setgid(getgid());
+-      setuid(uid);
++      xsetgid(getgid());
++      xsetuid(getuid());
+       outip = (struct ip *)xcalloc(1, (unsigned)packlen);
+Index: networking/arping.c
+===================================================================
+--- networking/arping.c        (revision 15701)
++++ networking/arping.c        (revision 15702)
+@@ -262,7 +262,8 @@
+       s = socket(PF_PACKET, SOCK_DGRAM, 0);
+       ifindex = errno;
+-      setuid(getuid());
++      // Drop suid root privileges
++      xsetuid(getuid());
+       {
+               unsigned long opt;
+Index: loginutils/passwd.c
+===================================================================
+--- loginutils/passwd.c        (revision 15701)
++++ loginutils/passwd.c        (revision 15702)
+@@ -227,10 +227,7 @@
+       signal(SIGINT, SIG_IGN);
+       signal(SIGQUIT, SIG_IGN);
+       umask(077);
+-      if (setuid(0)) {
+-              syslog(LOG_ERR, "can't setuid(0)");
+-              bb_error_msg_and_die( "Cannot change ID to root.\n");
+-      }
++      xsetuid(0);
+       if (!update_passwd(pw, crypt_passwd)) {
+               syslog(LOG_INFO, "password for `%s' changed by user `%s'", name,
+                          myname);
+ ------------------------------------------------------------------------
+r15705 | landley | 2006-07-16 14:58:18 -0400 (Sun, 16 Jul 2006) | 2 lines
+Changed paths:
+   M /trunk/busybox/loginutils/adduser.c
+
+Bugfix from Tito to make sure /etc/group gets updated.
+
+ ------------------------------------------------------------------------
+Index: loginutils/adduser.c
+===================================================================
+--- loginutils/adduser.c       (revision 15704)
++++ loginutils/adduser.c       (revision 15705)
+@@ -96,6 +96,7 @@
+ static int adduser(struct passwd *p, unsigned long flags)
+ {
+       FILE *file;
++      int addgroup = !p->pw_gid;
+       /* make sure everything is kosher and setup uid && gid */
+       file = bb_xfopen(bb_path_passwd_file, "a");
+@@ -132,9 +133,8 @@
+       /* add to group */
+       /* addgroup should be responsible for dealing w/ gshadow */
+       /* if using a pre-existing group, don't create one */
+-      if (p->pw_gid == 0) {
+-              addgroup_wrapper(p);
+-      }
++      if (addgroup) addgroup_wrapper(p);
++
+       /* Clear the umask for this process so it doesn't
+        * * screw up the permissions on the mkdir and chown. */
+       umask(0);
+ ------------------------------------------------------------------------
+r15727 | landley | 2006-07-19 17:33:42 -0400 (Wed, 19 Jul 2006) | 4 lines
+Changed paths:
+   M /trunk/busybox/modutils/modprobe.c
+
+Patch from Yann Morin to look for modules.conf in the right place on 2.6.
+Fixes http://bugs.busybox.net/view.php?id=942
+
+
+ ------------------------------------------------------------------------
+Index: modutils/modprobe.c
+===================================================================
+--- modutils/modprobe.c        (revision 15726)
++++ modutils/modprobe.c        (revision 15727)
+@@ -545,29 +545,37 @@
+       }
+       close ( fd );
++      /*
++       * First parse system-specific options and aliases
++       * as they take precedence over the kernel ones.
++       */
+       if (!ENABLE_FEATURE_2_6_MODULES
+                       || ( fd = open ( "/etc/modprobe.conf", O_RDONLY )) < 0 )
+               if (( fd = open ( "/etc/modules.conf", O_RDONLY )) < 0 )
+-                      if (( fd = open ( "/etc/conf.modules", O_RDONLY )) < 0 )
+-                              return first;
++                      fd = open ( "/etc/conf.modules", O_RDONLY );
+-      include_conf (&first, &current, buffer, sizeof(buffer), fd);
+-      close(fd);
++      if (fd >= 0) {
++              include_conf (&first, &current, buffer, sizeof(buffer), fd);
++              close(fd);
++      }
+-      filename = bb_xasprintf("/lib/modules/%s/modules.alias", un.release);
+-      fd = open ( filename, O_RDONLY );
+-      if (ENABLE_FEATURE_CLEAN_UP)
+-              free(filename);
+-      if (fd < 0) {
+-              /* Ok, that didn't work.  Fall back to looking in /lib/modules */
+-              if (( fd = open ( "/lib/modules/modules.alias", O_RDONLY )) < 0 ) {
+-                      return first;
++      /* Only 2.6 has a modules.alias file */
++      if (ENABLE_FEATURE_2_6_MODULES) {
++              /* Parse kernel-declared aliases */
++              filename = bb_xasprintf("/lib/modules/%s/modules.alias", un.release);
++              if ((fd = open ( filename, O_RDONLY )) < 0) {
++                      /* Ok, that didn't work.  Fall back to looking in /lib/modules */
++                      fd = open ( "/lib/modules/modules.alias", O_RDONLY );
+               }
++              if (ENABLE_FEATURE_CLEAN_UP)
++                      free(filename);
++
++              if (fd >= 0) {
++                      include_conf (&first, &current, buffer, sizeof(buffer), fd);
++                      close(fd);
++              }
+       }
+-      include_conf (&first, &current, buffer, sizeof(buffer), fd);
+-      close(fd);
+-
+       return first;
+ }
index ddf965fbf466b1e2bbca44432f1e9bf832da0439..6565760cfc0fd53014c21a7aa5cd9e7d4d6a2994 100644 (file)
 
 #include <ctype.h>
 #include <dirent.h>
-#include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
 #include <netdb.h>
-#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h>
 #include <strings.h>
-#include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/types.h>
-#include <sys/wait.h>
 #include <termios.h>
 #include <unistd.h>
 
 
 #include "pwd_.h"
 #include "grp_.h"
+#ifdef CONFIG_FEATURE_SHADOWPASSWDS
 #include "shadow_.h"
+#endif
+#ifdef CONFIG_FEATURE_SHA1_PASSWORDS
+# include "sha1.h"
+#endif
 
 /* Try to pull in PATH_MAX */
 #include <limits.h>
@@ -133,9 +134,9 @@ extern DIR *bb_xopendir(const char *path);
 extern int remove_file(const char *path, int flags);
 extern int copy_file(const char *source, const char *dest, int flags);
 extern ssize_t safe_read(int fd, void *buf, size_t count);
-extern ssize_t full_read(int fd, void *buf, size_t len);
+extern ssize_t bb_full_read(int fd, void *buf, size_t len);
 extern ssize_t safe_write(int fd, const void *buf, size_t count);
-extern ssize_t full_write(int fd, const void *buf, size_t len);
+extern ssize_t bb_full_write(int fd, const void *buf, size_t len);
 extern int recursive_action(const char *fileName, int recurse,
          int followLinks, int depthFirst,
          int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData),
@@ -181,13 +182,8 @@ extern void bb_xdaemon(int nochdir, int noclose);
 extern void bb_xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
 extern void bb_xlisten(int s, int backlog);
 extern void bb_xchdir(const char *path);
-extern void utoa_to_buf(unsigned n, char *buf, unsigned buflen);
-extern char *utoa(unsigned n);
-extern void itoa_to_buf(int n, char *buf, unsigned buflen);
-extern char *itoa(int n);
 extern void xsetgid(gid_t gid);
 extern void xsetuid(uid_t uid);
-extern off_t fdlength(int fd);
 
 #define BB_GETOPT_ERROR 0x80000000UL
 extern const char *bb_opt_complementally;
@@ -341,9 +337,7 @@ char *dirname (char *path);
 
 int bb_make_directory (char *path, long mode, int flags);
 
-int get_signum(char *name);
-char *get_signame(int number);
-
+const char *u_signal_names(const char *str_sig, int *signo, int startnum);
 char *bb_simplify_path(const char *path);
 
 enum { /* DO NOT CHANGE THESE VALUES!  cp.c depends on them. */
@@ -474,14 +468,14 @@ extern int restricted_shell ( const char *shell );
 extern void setup_environment ( const char *shell, int loginshell, int changeenv, const struct passwd *pw );
 extern int correct_password ( const struct passwd *pw );
 extern char *pw_encrypt(const char *clear, const char *salt);
+extern struct spwd *pwd_to_spwd(const struct passwd *pw);
 extern int obscure(const char *old, const char *newval, const struct passwd *pwdp);
 
 extern int bb_xopen(const char *pathname, int flags);
 extern int bb_xopen3(const char *pathname, int flags, int mode);
-extern void xread(int fd, void *buf, size_t count);
-extern unsigned char xread_char(int fd);
-extern void xlseek(int fd, off_t offset, int whence);
-extern void xwrite(int fd, void *buf, size_t count);
+extern ssize_t bb_xread(int fd, void *buf, size_t count);
+extern void bb_xread_all(int fd, void *buf, size_t count);
+extern unsigned char bb_xread_char(int fd);
 
 #ifndef COMM_LEN
 #ifdef TASK_COMM_LEN
@@ -559,19 +553,4 @@ extern uint32_t *bb_crc32_filltable (int endian);
 
 extern const char BB_BANNER[];
 
-// Make sure we call functions instead of macros.
-#undef isalnum
-#undef isalpha
-#undef isascii
-#undef isblank
-#undef iscntrl
-#undef isdigit
-#undef isgraph
-#undef islower
-#undef isprint
-#undef ispunct
-#undef isspace
-#undef isupper
-#undef isxdigit
-
 #endif /* __LIBBUSYBOX_H__ */
index 3353df949805328490d3bb93e91a0172cf590524..464d3b5ab209431e680f019546f829d20e02d833 100644 (file)
 
 #include "libbb.h"
 
+
+/* passwords should consist of 6 (to 8 characters) */
+#define MINLEN 6
+
+
 static int string_checker_helper(const char *p1, const char *p2) __attribute__ ((__pure__));
 
 static int string_checker_helper(const char *p1, const char *p2)
@@ -95,13 +100,13 @@ static const char *obscure_msg(const char *old_p, const char *new_p, const struc
        int c;
        int length;
        int mixed = 0;
-       /* Add 2 for each type of characters to the minlen of password */
-       int size = CONFIG_PASSWORD_MINLEN + 8;
+       /* Add 1 for each type of characters to the minlen of password */
+       int size = MINLEN + 8;
        const char *p;
        char hostname[255];
 
        /* size */
-       if (!new_p || (length = strlen(new_p)) < CONFIG_PASSWORD_MINLEN)
+       if (!new_p || (length = strlen(new_p)) < MINLEN)
                return("too short");
 
        /* no username as-is, as sub-string, reversed, capitalized, doubled */
index 8562a4fcbaa2d0621508401e5127524ae1cc6ab7..e5f471cc6e5ecec59062dba9846e1704a12ae1bb 100644 (file)
@@ -120,55 +120,40 @@ int bb_xopen3(const char *pathname, int flags, int mode)
 #endif
 
 #ifdef L_xread
-
-// Die with an error message if we can't read the entire buffer.
-
-void xread(int fd, void *buf, size_t count)
+ssize_t bb_xread(int fd, void *buf, size_t count)
 {
-       while (count) {
-               ssize_t size;
+       ssize_t size;
 
-               if ((size = safe_read(fd, buf, count)) < 1)
-                       bb_error_msg_and_die("Short read");
-               count -= size;
-               buf = ((char *) buf) + size;
+       size = read(fd, buf, count);
+       if (size < 0) {
+               bb_perror_msg_and_die(bb_msg_read_error);
        }
+       return(size);
 }
 #endif
 
-#ifdef L_xwrite
-
-// Die with an error message if we can't write the entire buffer.
-
-void xwrite(int fd, void *buf, size_t count)
+#ifdef L_xread_all
+void bb_xread_all(int fd, void *buf, size_t count)
 {
-       while (count) {
-               ssize_t size;
+       ssize_t size;
 
-               if ((size = safe_write(fd, buf, count)) < 1)
-                       bb_error_msg_and_die("Short write");
+       while (count) {
+               if ((size = bb_xread(fd, buf, count)) == 0) {   /* EOF */
+                       bb_error_msg_and_die("Short read");
+               }
                count -= size;
                buf = ((char *) buf) + size;
        }
-}
-#endif
-
-#ifdef L_xlseek
-
-// Die if we can't lseek to the right spot.
-
-void xlseek(int fd, off_t offset, int whence)
-{
-       if (whence != lseek(fd, offset, whence)) bb_error_msg_and_die("lseek");
+       return;
 }
 #endif
 
 #ifdef L_xread_char
-unsigned char xread_char(int fd)
+unsigned char bb_xread_char(int fd)
 {
        char tmp;
 
-       xread(fd, &tmp, 1);
+       bb_xread_all(fd, &tmp, 1);
 
        return(tmp);
 }
@@ -244,59 +229,7 @@ int wait4pid(int pid)
        if (WIFSIGNALED(status)) return WTERMSIG(status);
        return 0;
 }
-#endif
-
-#ifdef L_itoa
-// Largest 32 bit integer is -2 billion plus null terminator.
-// Int should always be 32 bits on a Unix-oid system, see
-// http://www.unix.org/whitepapers/64bit.html
-static char local_buf[12];
-
-void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
-{
-       int i, out = 0;
-       if (buflen) {
-               for (i=1000000000; i; i/=10) {
-                       int res = n/i;
-
-                       if ((res || out || i == 1) && --buflen>0) {
-                               out++;
-                               n -= res*i;
-                               *buf++ = '0' + res;
-                       }
-               }
-               *buf = 0;
-       }
-}
-
-// Note: uses static buffer, calling it twice in a row will overwrite.
-
-char *utoa(unsigned n)
-{
-       utoa_to_buf(n, local_buf, sizeof(local_buf));
-
-       return local_buf;
-}
-
-void itoa_to_buf(int n, char *buf, unsigned buflen)
-{
-       if (buflen && n<0) {
-               n = -n;
-               *buf++ = '-';
-               buflen--;
-       }
-       utoa_to_buf((unsigned)n, buf, buflen);
-}
-
-// Note: uses static buffer, calling it twice in a row will overwrite.
-
-char *itoa(int n)
-{
-       itoa_to_buf(n, local_buf, sizeof(local_buf));
-
-       return local_buf;
-}
-#endif
+#endif 
 
 #ifdef L_setuid
 void xsetgid(gid_t gid)
@@ -309,41 +242,3 @@ void xsetuid(uid_t uid)
        if (setuid(uid)) bb_error_msg_and_die("setuid");
 }
 #endif
-
-#ifdef L_fdlength
-off_t fdlength(int fd)
-{
-       off_t bottom = 0, top = 0, pos;
-       long size;
-
-       // If the ioctl works for this, return it.
-
-       if (ioctl(fd, BLKGETSIZE, &size) >= 0) return size*512;
-
-       // If not, do a binary search for the last location we can read.
-
-       do {
-               char temp;
-
-               pos = bottom + (top - bottom) / 2;;
-
-               // If we can read from the current location, it's bigger.
-
-               if (lseek(fd, pos, 0)>=0 && safe_read(fd, &temp, 1)==1) {
-                       if (bottom == top) bottom = top = (top+1) * 2;
-                       else bottom = pos;
-
-               // If we can't, it's smaller.
-
-               } else {
-                       if (bottom == top) {
-                               if (!top) return 0;
-                               bottom = top/2;
-                       }
-                       else top = pos;
-               }
-       } while (bottom + 1 != top);
-
-       return pos + 1;
-}
-#endif
index 7745444c0ae6c82655d047512e79129503ed94b5..92cddc182c0cf9fb8953b5fd6583ddb703f477b7 100644 (file)
@@ -1,8 +1,4 @@
 /* vi: set sw=4 ts=4: */
-/*
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
- */
-
 #include <fcntl.h>
 #include <stdio.h>
 #include <string.h>
@@ -150,6 +146,9 @@ int passwd_main(int argc, char **argv)
        int dflg = 0;                           /* -d - delete password */
        const struct passwd *pw;
 
+#if ENABLE_FEATURE_SHADOWPASSWDS
+       const struct spwd *sp;
+#endif
        amroot = (getuid() == 0);
        openlog("passwd", LOG_PID | LOG_CONS | LOG_NOWAIT, LOG_AUTH);
        while ((flag = getopt(argc, argv, "a:dlu")) != EOF) {
@@ -188,13 +187,18 @@ int passwd_main(int argc, char **argv)
                syslog(LOG_WARNING, "can't change pwd for `%s'", name);
                bb_error_msg_and_die("Permission denied.\n");
        }
-       if (ENABLE_FEATURE_SHADOWPASSWDS) {
-               struct spwd *sp = getspnam(name);
-               if (!sp) bb_error_msg_and_die("Unknown user %s", name);
-               cp = sp->sp_pwdp;
-       } else cp = pw->pw_passwd;
-
+#if ENABLE_FEATURE_SHADOWPASSWDS
+       sp = getspnam(name);
+       if (!sp) {
+               sp = (struct spwd *) pwd_to_spwd(pw);
+       }
+       cp = sp->sp_pwdp;
+       np = sp->sp_namp;
+#else
+       cp = pw->pw_passwd;
        np = name;
+#endif
+
        safe_strncpy(crypt_passwd, cp, sizeof(crypt_passwd));
        if (!(dflg || lflg || uflg)) {
                if (!amroot) {
@@ -236,7 +240,6 @@ int passwd_main(int argc, char **argv)
                syslog(LOG_WARNING, "an error occurred updating the password file");
                bb_error_msg_and_die("An error occurred updating the password file.\n");
        }
-       if (ENABLE_FEATURE_CLEAN_UP) free(myname);
        return (0);
 }
 
index 5665ddb2b2522a927f1c53e8dbca3745b537a90f..04eb728a70840b0c839405ab0ca8d6807a335f3b 100644 (file)
@@ -52,6 +52,18 @@ static int req_recv;
 
 #define MS_TDIFF(tv1,tv2) ( ((tv1).tv_sec-(tv2).tv_sec)*1000 + \
                           ((tv1).tv_usec-(tv2).tv_usec)/1000 )
+#if 0
+static void set_signal(int signo, void (*handler) (void))
+{
+       struct sigaction sa;
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_handler = (void (*)(int)) handler;
+       sa.sa_flags = SA_RESTART;
+       sigaction(signo, &sa, NULL);
+}
+#endif
+
 static int send_pack(int sock, struct in_addr *src_addr,
                                         struct in_addr *dst_addr, struct sockaddr_ll *ME,
                                         struct sockaddr_ll *HE)
index 54294b6355ce84cdc3c5ed41f3321f232314a78b..d3d2cca201f827772efe5905ee99d4fff42142c7 100644 (file)
@@ -1,4 +1,3 @@
-/* vi: set sw=4 ts=4: */
 /*      $Slackware: inetd.c 1.79s 2001/02/06 13:18:00 volkerdi Exp $    */
 /*      $OpenBSD: inetd.c,v 1.79 2001/01/30 08:30:57 deraadt Exp $      */
 /*      $NetBSD: inetd.c,v 1.11 1996/02/22 11:14:41 mycroft Exp $       */
@@ -1802,3 +1801,4 @@ daytime_dg (int s, servtab_t *sep ATTRIBUTE_UNUSED)
   (void) sendto (s, buffer, strlen (buffer), 0, &sa, sizeof (sa));
 }
 #endif /* CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME */
+/* vi: set sw=4 ts=4: */
index c2084fc1e3e1543fe24fbca1b4e8b87442df8332..b7046a054794e1c7d6685728a5cbddbe5f997ece 100644 (file)
@@ -548,7 +548,7 @@ static int
 wait_for_reply(int sock, struct sockaddr_in *fromp, const struct timeval *tp)
 {
        fd_set fds;
-       struct timeval now, tvwait;
+       struct timeval now, wait;
        struct timezone tz;
        int cc = 0;
        socklen_t fromlen = sizeof(*fromp);
@@ -556,12 +556,12 @@ wait_for_reply(int sock, struct sockaddr_in *fromp, const struct timeval *tp)
        FD_ZERO(&fds);
        FD_SET(sock, &fds);
 
-       tvwait.tv_sec = tp->tv_sec + waittime;
-       tvwait.tv_usec = tp->tv_usec;
+       wait.tv_sec = tp->tv_sec + waittime;
+       wait.tv_usec = tp->tv_usec;
        (void)gettimeofday(&now, &tz);
-       tvsub(&tvwait, &now);
+       tvsub(&wait, &now);
 
-       if (select(sock + 1, &fds, NULL, NULL, &tvwait) > 0)
+       if (select(sock + 1, &fds, NULL, NULL, &wait) > 0)
                cc = recvfrom(sock, (char *)packet, sizeof(packet), 0,
                            (struct sockaddr *)fromp, &fromlen);
 
index 5031ae153ea4cea405efdf31b56433303e87c8da..6011448d3149552bca7c36f92ac4f0355d478ec9 100644 (file)
@@ -2035,6 +2035,7 @@ static void onsig(int);
 static int dotrap(void);
 static void setinteractive(int);
 static void exitshell(void) ATTRIBUTE_NORETURN;
+static int decode_signal(const char *, int);
 
 /*
  * This routine is called when an error or an interrupt occurs in an
@@ -2546,6 +2547,11 @@ onint(void) {
        int i;
 
        intpending = 0;
+#if 0
+       /* comment by vodz: its strange for me, this programm don`t use other
+          signal block */
+       sigsetmask(0);
+#endif
        i = EXSIG;
        if (gotsig[SIGINT - 1] && !trap[SIGINT]) {
                if (!(rootshell && iflag)) {
@@ -3322,7 +3328,7 @@ evalcommand(union node *cmd, int flags)
                        }
                        sp = arglist.list;
                }
-               full_write(preverrout_fd, "\n", 1);
+               bb_full_write(preverrout_fd, "\n", 1);
        }
 
        cmd_is_exec = 0;
@@ -4559,7 +4565,7 @@ expandhere(union node *arg, int fd)
 {
        herefd = fd;
        expandarg(arg, (struct arglist *)NULL, 0);
-       full_write(fd, stackblock(), expdest - (char *)stackblock());
+       bb_full_write(fd, stackblock(), expdest - (char *)stackblock());
 }
 
 
@@ -6547,7 +6553,7 @@ usage:
        }
 
        if (**++argv == '-') {
-               signo = get_signum(*argv + 1);
+               signo = decode_signal(*argv + 1, 1);
                if (signo < 0) {
                        int c;
 
@@ -6561,7 +6567,7 @@ usage:
                                        list = 1;
                                        break;
                                case 's':
-                                       signo = get_signum(optionarg);
+                                       signo = decode_signal(optionarg, 1);
                                        if (signo < 0) {
                                                sh_error(
                                                        "invalid signal number or name: %s",
@@ -6587,14 +6593,14 @@ usage:
 
                if (!*argv) {
                        for (i = 1; i < NSIG; i++) {
-                               name = get_signame(i);
-                               if (isdigit(*name))
+                               name = u_signal_names(0, &i, 1);
+                               if (name)
                                        out1fmt(snlfmt, name);
                        }
                        return 0;
                }
-               name = get_signame(signo);
-               if (isdigit(*name))
+               name = u_signal_names(*argptr, &signo, -1);
+               if (name)
                        out1fmt(snlfmt, name);
                else
                        sh_error("invalid signal number or exit status: %s", *argptr);
@@ -8378,7 +8384,7 @@ growstackstr(void)
 {
        size_t len = stackblocksize();
        if (herefd >= 0 && len >= 1024) {
-               full_write(herefd, stackblock(), len);
+               bb_full_write(herefd, stackblock(), len);
                return stackblock();
        }
        growstackblock();
@@ -10973,7 +10979,7 @@ openhere(union node *redir)
        if (redir->type == NHERE) {
                len = strlen(redir->nhere.doc->narg.text);
                if (len <= PIPESIZE) {
-                       full_write(pip[1], redir->nhere.doc->narg.text, len);
+                       bb_full_write(pip[1], redir->nhere.doc->narg.text, len);
                        goto out;
                }
        }
@@ -10987,7 +10993,7 @@ openhere(union node *redir)
 #endif
                signal(SIGPIPE, SIG_DFL);
                if (redir->type == NHERE)
-                       full_write(pip[1], redir->nhere.doc->narg.text, len);
+                       bb_full_write(pip[1], redir->nhere.doc->narg.text, len);
                else
                        expandhere(redir->nhere.doc, pip[1]);
                _exit(0);
@@ -11616,7 +11622,9 @@ trapcmd(int argc, char **argv)
                        if (trap[signo] != NULL) {
                                const char *sn;
 
-                               sn = get_signame(signo);
+                               sn = u_signal_names(0, &signo, 0);
+                               if (sn == NULL)
+                                       sn = "???";
                                out1fmt("trap -- %s %s\n",
                                        single_quote(trap[signo]), sn);
                        }
@@ -11628,7 +11636,7 @@ trapcmd(int argc, char **argv)
        else
                action = *ap++;
        while (*ap) {
-               if ((signo = get_signum(*ap)) < 0)
+               if ((signo = decode_signal(*ap, 0)) < 0)
                        sh_error("%s: bad trap", *ap);
                INTOFF;
                if (action) {
@@ -11931,6 +11939,14 @@ out:
        /* NOTREACHED */
 }
 
+static int decode_signal(const char *string, int minsig)
+{
+       int signo;
+       const char *name = u_signal_names(string, &signo, minsig);
+
+       return name ? signo : -1;
+}
+
 /*      var.c     */
 
 static struct var *vartab[VTABSIZE];
@@ -13457,7 +13473,7 @@ static const char op_tokens[] = {
 
 static arith_t arith (const char *expr, int *perrcode)
 {
-    char arithval; /* Current character under analysis */
+    register char arithval; /* Current character under analysis */
     operator lasttok, op;
     operator prec;
 
index 92c24d1c26662a488a04d1ba0db3ce40f30e3442..be2f364e0038016329d8a1a5cc5d422cf307ce91 100644 (file)
 
 
 #include "busybox.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <unistd.h>
 #include <getopt.h>
+#include <termios.h>
 #include "cmdedit.h"
 
 #ifdef CONFIG_LOCALE_SUPPORT
@@ -532,6 +543,16 @@ static void checkjobs(struct jobset *j_list)
                        /* child stopped */
                        job->stopped_progs++;
                        job->progs[prognum].is_stopped = 1;
+
+#if 0
+                       /* Printing this stuff is a pain, since it tends to
+                        * overwrite the prompt an inconveinient moments.  So
+                        * don't do that.  */
+                       if (job->stopped_progs == job->num_progs) {
+                               printf(JOB_STATUS_FORMAT, job->jobid, "Stopped",
+                                          job->text);
+                       }
+#endif
                }
        }
 
@@ -686,6 +707,26 @@ static int get_command(FILE * source, char *command)
        return 0;
 }
 
+static char* itoa(register int i)
+{
+       static char a[7]; /* Max 7 ints */
+       register char *b = a + sizeof(a) - 1;
+       int   sign = (i < 0);
+
+       if (sign)
+               i = -i;
+       *b = 0;
+       do
+       {
+               *--b = '0' + (i % 10);
+               i /= 10;
+       }
+       while (i);
+       if (sign)
+               *--b = '-';
+       return b;
+}
+
 static char * strsep_space( char *string, int * ix)
 {
        char *token;
index de9c3700f4bcf8758c3a4d76d9d728d2e11360c0..f0d440d2ba4996ba04f08bad2bbca37fabd1ac76 100644 (file)
@@ -1,5 +1,4 @@
-/* vi: set sw=4 ts=4: */
-/*
+/* vi: set ts=4:
  * 
  * dmesg - display/control kernel ring buffer.
  *