Implement a small strings applet
authorEric Andersen <andersen@codepoet.org>
Thu, 7 Nov 2002 02:09:37 +0000 (02:09 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 7 Nov 2002 02:09:37 +0000 (02:09 -0000)
include/applets.h
include/usage.h
miscutils/Makefile.in
miscutils/config.in
miscutils/strings.c [new file with mode: 0644]

index 1660b11c54c051d5d114f2bdc7c53cfc75fa1849..e41a4899602d14c427e07e04191347f311effca0 100644 (file)
 #ifdef CONFIG_START_STOP_DAEMON
     APPLET_ODDNAME("start-stop-daemon", start_stop_daemon_main, _BB_DIR_SBIN, _BB_SUID_NEVER, start_stop_daemon)
 #endif
+#ifdef CONFIG_STRINGS
+       APPLET(strings, strings_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER)
+#endif
 #ifdef CONFIG_STTY
        APPLET(stty, stty_main, _BB_DIR_BIN, _BB_SUID_NEVER)
 #endif
index b66d964025b3ab6fbce25dbd9e08db6682d1071d..b49f3869b92d885c51ff399de47c0fbb4dd0d109 100644 (file)
        "-s <signal>\t\tsignal to send (default 15)\n"\
        "-a <pathname>\t\tprogram to start (default <executable>)\n"
 
+#define strings_trivial_usage \
+    "[-afo] [-n length] [file ... ]"
+#define strings_full_usage \
+    "Display printable strings in a binary file." \
+    "\n\nOptions:" \
+    "\n\t-f\tPrecede each string with the name of the file where it was found." \
+    "\n\t-n N\tSpecifies that at least N characters forms a sequence (default 4)" \
+    "\n\t-o\tEach string is preceded by its decimal offset in the file."
+
 #define stty_trivial_usage \
        "[-a|g] [-F DEVICE] [SETTING]..."
 #define stty_full_usage \
index a5e12e7eedf08a753f62c3a1a158e6110e4aea65..72292b69d185153b246102fd4f214c4f15461fbe 100644 (file)
@@ -33,6 +33,7 @@ MISCUTILS-$(CONFIG_MAKEDEVS)          += makedevs.o
 MISCUTILS-$(CONFIG_MKTEMP)             += mktemp.o
 MISCUTILS-$(CONFIG_MT)                 += mt.o
 MISCUTILS-$(CONFIG_READLINK)           += readlink.o
+MISCUTILS-$(CONFIG_STRINGS)            += strings.o
 MISCUTILS-$(CONFIG_TIME)               += time.o
 MISCUTILS-$(CONFIG_UPDATE)             += update.o
 MISCUTILS-$(CONFIG_WATCHDOG)           += watchdog.o
index 1d2751444a0057dcca99aa357da928e70604995c..3dc5e2c8b7464056f64041d796ce8749c004fc49 100644 (file)
@@ -15,6 +15,7 @@ bool 'makedevs'           CONFIG_MAKEDEVS
 bool 'mktemp'      CONFIG_MKTEMP
 bool 'mt'          CONFIG_MT
 bool 'readlink'            CONFIG_READLINK
+bool 'strings'     CONFIG_STRINGS
 bool 'time'        CONFIG_TIME
 bool 'update'      CONFIG_UPDATE
 bool 'watchdog'            CONFIG_WATCHDOG
diff --git a/miscutils/strings.c b/miscutils/strings.c
new file mode 100644 (file)
index 0000000..043d6b8
--- /dev/null
@@ -0,0 +1,142 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * strings implementation for busybox
+ *
+ * Copyright (c) 1980, 1987
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Original copyright notice is retained at the end of this file.
+ *
+ * Modified for BusyBox by Erik Andersen <andersee@debian.org>
+ */
+
+#include <stdio.h> 
+#include <stdlib.h> 
+#include <string.h> 
+#include <getopt.h> 
+#include <unistd.h>
+#include <ctype.h>
+#include "busybox.h"
+
+#define ISSTR(ch)      (isprint(ch) || ch == '\t')
+
+int strings_main(int argc, char **argv) 
+{
+       extern char *optarg;
+       extern int optind;
+       int ch, cnt;
+       int exitcode;
+       int oflg, fflg;
+       char *file;
+       size_t foff, minlen;
+       unsigned char *bfr, *C;
+
+
+       exitcode = fflg = oflg = 0;
+       minlen = -1;
+       while ((ch = getopt(argc, argv, "an:of")) > 0)
+               switch(ch) {
+                       case '-':
+                               break;
+                       case 'f':
+                               fflg = 1;
+                               break;
+                       case 'n':
+                               minlen = atoi(optarg);
+                               break;
+                       case 'o':
+                               oflg = 1;
+                               break;
+                       default:
+                               show_usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (minlen == -1)
+               minlen = 4;
+
+       bfr = xmalloc(minlen);
+       bfr[minlen] = '\0';
+       file = "stdin";
+       do {
+               if (*argv) {
+                       fprintf(stderr, "opening '%s'\n", *argv);
+                       file = *argv++;
+                       if (!freopen(file, "r", stdin)) {
+                               perror_msg("%s", file);
+                               exitcode = EXIT_FAILURE;
+                               continue;
+                       }
+               }
+               foff = 0;
+
+               for (cnt = 0; (ch = getchar()) != EOF;) {
+                       if (ISSTR(ch)) {
+                               if (!cnt)
+                                       C = bfr;
+                               *C++ = ch;
+                               if (++cnt < minlen)
+                                       continue;
+                               if (fflg)
+                                       printf("%s:", file);
+                               if (oflg)
+                                       printf("%07ld %s", (long)(foff - minlen), (char *)bfr);
+                               else
+                                       printf("%s", bfr);
+                               while ((ch = getchar()) != EOF && ISSTR(ch))
+                                       putchar((char)ch);
+                               putchar('\n');
+                       }
+                       cnt = 0;
+               }
+       } while (*argv);
+       exit(exitcode);
+}
+
+/*
+ * Copyright (c) 1980, 1987
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change 
+ *             ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> 
+ *
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */