ipcalc applet by Stephan Linz and Jordan Crouse
authorGlenn L McGrath <bug1@ihug.co.nz>
Sun, 10 Nov 2002 23:42:27 +0000 (23:42 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Sun, 10 Nov 2002 23:42:27 +0000 (23:42 -0000)
AUTHORS
include/applets.h
include/usage.h
networking/Makefile.in
networking/config.in
networking/ipcalc.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index 6cd8ab80fb31001a6a3861d5184307f6686e66c5..88fa562b22d5dfa2e4fd821e1594ce2a5d0b9fb4 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -8,6 +8,9 @@ incorect, _please_ let me know.
 
 -----------
 
+Emanuele Aina <emanuele.aina@tiscali.it>
+       run-parts
+
 Erik Andersen <andersen@codepoet.org>, <andersee@debian.org>
     Tons of new stuff, major rewrite of most of the
     core apps, tons of new apps as noted in header files.
@@ -28,6 +31,9 @@ Dave Cinege <dcinege@psychosis.com>
     more(v2), makedevs, dutmp, modularization, auto links file, 
     various fixes, Linux Router Project maintenance
 
+Jordan Crouse <jordan@cosmicpenguin.net>
+       ipcalc
+
 Magnus Damm <damm@opensource.se>
     tftp client
     insmod powerpc support
@@ -48,6 +54,9 @@ Daniel Jacobowitz <dan@debian.org>
 Matt Kraai <kraai@alumni.cmu.edu>
     documentation, bugfixes, test suite
 
+Stephan Linz <linz@li-pro.net>
+       ipcalc, Red Hat equivalence
+
 John Lombardo <john@deltanet.com>      
     dirname, tr
 
@@ -89,7 +98,3 @@ Charles P. Wright <cpwright@villagenet.com>
 
 Enrique Zanardi <ezanardi@ull.es>
     tarcat (since removed), loadkmap, various fixes, Debian maintenance
-
-Emanuele Aina <emanuele.aina@tiscali.it>
-       run-parts
-
index a9f93cc49529e4241503a27d44b8201633048075..e8bcb0e4b9967c12a63e4340b7207e09621aa75f 100644 (file)
 #ifdef CONFIG_IP
        APPLET(ip, ip_main, _BB_DIR_BIN, _BB_SUID_NEVER)
 #endif
+#ifdef CONFIG_IPCALC
+       APPLET(ipcalc, ipcalc_main, _BB_DIR_BIN, _BB_SUID_NEVER)
+#endif
 #ifdef CONFIG_KILL
        APPLET(kill, kill_main, _BB_DIR_BIN, _BB_SUID_NEVER)
 #endif
index c140a88ba025b741740f9a46c0ad584bc4b96502..b741360cf404425db0540ae081df8c7f34e38f9e 100644 (file)
 #define ip_full_usage \
        "not written yet"
 
+#ifndef CONFIG_FEATURE_IPCALC_FANCY
+#define ipcalc_trivial_usage \
+       "[--broadcast] [--netmask] [--network] ipaddr <netmask>"
+
+#define ipcalc_full_usage \
+       "Calculate IP network settings from a IP address\n\n" \
+       "Options:\n" \
+       "\t-b\t--broadcast\tDisplay calculated broadcast address.\n" \
+       "\t-n\t--netmask\tDisplay default netmask for IP.\n" \
+       "\t-w\t--network\tDisplay calculated network address." 
+#else
+#define ipcalc_trivial_usage \
+       "[OPTION]... ipaddr <netmask>"
+
+#define ipcalc_full_usage \
+       "Calculate IP network settings from a IP address\n\n" \
+       "Options:\n" \
+       "\t-b\t--broadcast\tDisplay calculated broadcast address.\n" \
+       "\t-n\t--netmask\tDisplay default netmask for IP.\n" \
+       "\t-w\t--network\tDisplay calculated network address.\n" \
+       "\t-h\t--hostname\tDisplay first resolved host name.\n" \
+       "\t-s\t--silent\tDon't ever display error messages." 
+#endif
+
+#define ipcalc_notes_usage \
+       "ipcalc provides a simple way to calculate IP information for\n" \
+       "a host. The various options specify what information ipcalc\n" \
+       "should display on standard out. Multiple options may be\n" \
+       "specified.\n"
+
 #define kill_trivial_usage \
        "[-signal] process-id [process-id ...]"
 #define kill_full_usage \
index d249c042301e517d2ad03a8b52d4448ae7497d03..7404b041d805fdbf70a3a89b05c9f54290df33d8 100644 (file)
@@ -27,6 +27,7 @@ NETWORKING-$(CONFIG_HOSTNAME)         += hostname.o
 NETWORKING-$(CONFIG_IFCONFIG)          += ifconfig.o
 NETWORKING-$(CONFIG_IFUPDOWN)          += ifupdown.o
 NETWORKING-$(CONFIG_IP)                    += ip.o
+NETWORKING-$(CONFIG_IPCALC)             += ipcalc.o
 NETWORKING-$(CONFIG_NC)                    += nc.o
 NETWORKING-$(CONFIG_NETSTAT)           += netstat.o
 NETWORKING-$(CONFIG_NSLOOKUP)          += nslookup.o
index 7393febaed87b5c6f95ba8567a29b084609237a4..27a8ab571471e047f70a7a62de01b1fe9e1eaf02 100644 (file)
@@ -30,6 +30,10 @@ if [ "$CONFIG_IP" = "y" ]; then
     bool '  route'             CONFIG_FEATURE_IP_ROUTE
     bool '  tunnel'            CONFIG_FEATURE_IP_TUNNEL
 fi
+bool 'ipcalc'      CONFIG_IPCALC
+if [ "$CONFIG_IPCALC" = "y" ]; then
+    bool '  Fancy IPCALC, more options, adds 300 bytes'        CONFIG_FEATURE_IPCALC_FANCY
+fi
 bool 'nc'          CONFIG_NC
 bool 'netstat'     CONFIG_NETSTAT
 bool 'nslookup'            CONFIG_NSLOOKUP
diff --git a/networking/ipcalc.c b/networking/ipcalc.c
new file mode 100644 (file)
index 0000000..f130f3b
--- /dev/null
@@ -0,0 +1,164 @@
+/* vi: set sw=4 ts=4 ai: */
+/*
+ * Mini ipcalc implementation for busybox
+ *
+ * By Jordan Crouse <jordan@cosmicpenguin.net>
+ *    Stephan Linz  <linz@li-pro.net>
+ *
+ * This is a complete reimplentation of the ipcalc program
+ * from Redhat.  I didn't look at their source code, but there
+ * is no denying that this is a loving reimplementation
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "busybox.h"
+
+#define IPCALC_MSG(CMD,ALTCMD) if (mode & SILENT) {ALTCMD;} else {CMD;}
+
+static unsigned long get_netmask(unsigned long ipaddr)
+{
+       if (ipaddr & 0xC0) {
+               return 0x00FFFFFF;      /* Class C */
+       }
+       if (ipaddr & 0x10) {
+               return 0x0000FFFF;      /* Class B */
+       }
+       return 0x000000FF;      /* Class A */
+}
+
+#define NETMASK   0x01
+#define BROADCAST 0x02
+#define NETWORK   0x04
+#define HOSTNAME  0x08
+#define SILENT    0x80
+
+int ipcalc_main(int argc, char **argv)
+{
+       unsigned char mode = 0;
+
+       unsigned long netmask = 0;
+       unsigned long broadcast = 0;
+       unsigned long network = 0;
+       unsigned long ipaddr = 0;
+
+       int opt = 0;
+
+       struct option long_options[] = {
+               {"netmask", no_argument, NULL, 'n'},
+               {"broadcast", no_argument, NULL, 'b'},
+               {"network", no_argument, NULL, 'w'},
+#ifdef CONFIG_FEATURE_IPCALC_FANCY
+               {"hostname", no_argument, NULL, 'h'},
+               {"silent", no_argument, NULL, 's'},
+#endif
+               {NULL, 0, NULL, 0}
+       };
+
+
+       while ((opt = getopt_long(argc, argv,
+#ifdef CONFIG_FEATURE_IPCALC_FANCY
+                                                         "nbwhs",
+#else
+                                                         "nbw",
+#endif
+                                                         long_options, NULL)) != EOF) {
+               if (opt == 'n')
+                       mode |= NETMASK;
+               else if (opt == 'b')
+                       mode |= BROADCAST;
+               else if (opt == 'w')
+                       mode |= NETWORK;
+#ifdef CONFIG_FEATURE_IPCALC_FANCY
+               else if (opt == 'h')
+                       mode |= HOSTNAME;
+               else if (opt == 's')
+                       mode |= SILENT;
+#endif
+               else {
+                       show_usage();
+               }
+       }
+
+       if (mode & (BROADCAST | NETWORK)) {
+               if (argc - optind > 2) {
+                       show_usage();
+               }
+       } else {
+               if (argc - optind != 1) {
+                       show_usage();
+               }
+       }
+
+       ipaddr = inet_addr(argv[optind]);
+
+       if (ipaddr == INADDR_NONE) {
+               IPCALC_MSG(error_msg_and_die("bad IP address: %s\n", argv[optind]),
+                                  exit(EXIT_FAILURE));
+       }
+
+
+       if (argc - optind == 2) {
+               netmask = inet_addr(argv[optind + 1]);
+       }
+
+       if (ipaddr == INADDR_NONE) {
+               IPCALC_MSG(error_msg_and_die("bad netmask: %s\n", argv[optind + 1]),
+                                  exit(EXIT_FAILURE));
+       }
+
+       /* JHC - If the netmask wasn't provided then calculate it */
+       if (!netmask) {
+               netmask = get_netmask(ipaddr);
+       }
+
+       if (mode & NETMASK) {
+               printf("NETMASK=%s\n", inet_ntoa((*(struct in_addr *) &netmask)));
+       }
+
+       if (mode & BROADCAST) {
+               broadcast = (ipaddr & netmask) | ~netmask;
+               printf("BROADCAST=%s\n", inet_ntoa((*(struct in_addr *) &broadcast)));
+       }
+
+       if (mode & NETWORK) {
+               network = ipaddr & netmask;
+               printf("NETWORK=%s\n", inet_ntoa((*(struct in_addr *) &network)));
+       }
+#ifdef CONFIG_FEATURE_IPCALC_FANCY
+       if (mode & HOSTNAME) {
+               struct hostent *hostinfo;
+               int x;
+
+               hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET);
+               if (!hostinfo) {
+                       IPCALC_MSG(error_msg("cannot find hostname for %s", argv[optind]);
+                                          herror(NULL);
+                                          putc('\n', stderr);,);
+                       exit(EXIT_FAILURE);
+               }
+               for (x = 0; hostinfo->h_name[x]; x++) {
+                       hostinfo->h_name[x] = tolower(hostinfo->h_name[x]);
+               }
+
+               printf("HOSTNAME=%s\n", hostinfo->h_name);
+       }
+#endif
+
+       return EXIT_SUCCESS;
+}
+
+/* END CODE */
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/