ipcalc applet by Stephan Linz and Jordan Crouse

This commit is contained in:
Glenn L McGrath 2002-11-10 23:42:27 +00:00
parent 912d8f4cbc
commit c11986d89e
6 changed files with 211 additions and 4 deletions

13
AUTHORS
View File

@ -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> Erik Andersen <andersen@codepoet.org>, <andersee@debian.org>
Tons of new stuff, major rewrite of most of the Tons of new stuff, major rewrite of most of the
core apps, tons of new apps as noted in header files. 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, more(v2), makedevs, dutmp, modularization, auto links file,
various fixes, Linux Router Project maintenance various fixes, Linux Router Project maintenance
Jordan Crouse <jordan@cosmicpenguin.net>
ipcalc
Magnus Damm <damm@opensource.se> Magnus Damm <damm@opensource.se>
tftp client tftp client
insmod powerpc support insmod powerpc support
@ -48,6 +54,9 @@ Daniel Jacobowitz <dan@debian.org>
Matt Kraai <kraai@alumni.cmu.edu> Matt Kraai <kraai@alumni.cmu.edu>
documentation, bugfixes, test suite documentation, bugfixes, test suite
Stephan Linz <linz@li-pro.net>
ipcalc, Red Hat equivalence
John Lombardo <john@deltanet.com> John Lombardo <john@deltanet.com>
dirname, tr dirname, tr
@ -89,7 +98,3 @@ Charles P. Wright <cpwright@villagenet.com>
Enrique Zanardi <ezanardi@ull.es> Enrique Zanardi <ezanardi@ull.es>
tarcat (since removed), loadkmap, various fixes, Debian maintenance tarcat (since removed), loadkmap, various fixes, Debian maintenance
Emanuele Aina <emanuele.aina@tiscali.it>
run-parts

View File

@ -254,6 +254,9 @@
#ifdef CONFIG_IP #ifdef CONFIG_IP
APPLET(ip, ip_main, _BB_DIR_BIN, _BB_SUID_NEVER) APPLET(ip, ip_main, _BB_DIR_BIN, _BB_SUID_NEVER)
#endif #endif
#ifdef CONFIG_IPCALC
APPLET(ipcalc, ipcalc_main, _BB_DIR_BIN, _BB_SUID_NEVER)
#endif
#ifdef CONFIG_KILL #ifdef CONFIG_KILL
APPLET(kill, kill_main, _BB_DIR_BIN, _BB_SUID_NEVER) APPLET(kill, kill_main, _BB_DIR_BIN, _BB_SUID_NEVER)
#endif #endif

View File

@ -982,6 +982,36 @@
#define ip_full_usage \ #define ip_full_usage \
"not written yet" "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 \ #define kill_trivial_usage \
"[-signal] process-id [process-id ...]" "[-signal] process-id [process-id ...]"
#define kill_full_usage \ #define kill_full_usage \

View File

@ -27,6 +27,7 @@ NETWORKING-$(CONFIG_HOSTNAME) += hostname.o
NETWORKING-$(CONFIG_IFCONFIG) += ifconfig.o NETWORKING-$(CONFIG_IFCONFIG) += ifconfig.o
NETWORKING-$(CONFIG_IFUPDOWN) += ifupdown.o NETWORKING-$(CONFIG_IFUPDOWN) += ifupdown.o
NETWORKING-$(CONFIG_IP) += ip.o NETWORKING-$(CONFIG_IP) += ip.o
NETWORKING-$(CONFIG_IPCALC) += ipcalc.o
NETWORKING-$(CONFIG_NC) += nc.o NETWORKING-$(CONFIG_NC) += nc.o
NETWORKING-$(CONFIG_NETSTAT) += netstat.o NETWORKING-$(CONFIG_NETSTAT) += netstat.o
NETWORKING-$(CONFIG_NSLOOKUP) += nslookup.o NETWORKING-$(CONFIG_NSLOOKUP) += nslookup.o

View File

@ -30,6 +30,10 @@ if [ "$CONFIG_IP" = "y" ]; then
bool ' route' CONFIG_FEATURE_IP_ROUTE bool ' route' CONFIG_FEATURE_IP_ROUTE
bool ' tunnel' CONFIG_FEATURE_IP_TUNNEL bool ' tunnel' CONFIG_FEATURE_IP_TUNNEL
fi 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 'nc' CONFIG_NC
bool 'netstat' CONFIG_NETSTAT bool 'netstat' CONFIG_NETSTAT
bool 'nslookup' CONFIG_NSLOOKUP bool 'nslookup' CONFIG_NSLOOKUP

164
networking/ipcalc.c Normal file
View File

@ -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:
*/