ipcalc applet by Stephan Linz and Jordan Crouse
No binary (build failed)
—
(log yok)
| @@ -8,6 +8,9 @@ incorect, _please_ let me know. | |
| ----------- | |
| + | Emanuele Aina <[email protected]> |
| + | run-parts |
| + | |
| Erik Andersen <[email protected]>, <[email protected]> | |
| 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 <[email protected]> | |
| more(v2), makedevs, dutmp, modularization, auto links file, | |
| various fixes, Linux Router Project maintenance | |
| + | Jordan Crouse <[email protected]> |
| + | ipcalc |
| + | |
| Magnus Damm <[email protected]> | |
| tftp client | |
| insmod powerpc support | |
| @@ -48,6 +54,9 @@ Daniel Jacobowitz <[email protected]> | |
| Matt Kraai <[email protected]> | |
| documentation, bugfixes, test suite | |
| + | Stephan Linz <[email protected]> |
| + | ipcalc, Red Hat equivalence |
| + | |
| John Lombardo <[email protected]> | |
| dirname, tr | |
| @@ -89,7 +98,3 @@ Charles P. Wright <[email protected]> | |
| Enrique Zanardi <[email protected]> | |
| tarcat (since removed), loadkmap, various fixes, Debian maintenance | |
| - | |
| - | Emanuele Aina <[email protected]> |
| - | run-parts |
| - | |
| @@ -254,6 +254,9 @@ | |
| #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 | |
| @@ -982,6 +982,36 @@ | |
| #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 \ | |
| @@ -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 | |
| @@ -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 | |
| @@ -0,0 +1,164 @@ | |
| + | /* vi: set sw=4 ts=4 ai: */ |
| + | /* |
| + | * Mini ipcalc implementation for busybox |
| + | * |
| + | * By Jordan Crouse <[email protected]> |
| + | * Stephan Linz <[email protected]> |
| + | * |
| + | * 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: |
| + | */ |