/* 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;}

#define CLASS_A_NETMASK	ntohl(0xFF000000)
#define CLASS_B_NETMASK	ntohl(0xFFFF0000)
#define CLASS_C_NETMASK	ntohl(0xFFFFFF00)

static unsigned long get_netmask(unsigned long ipaddr)
{
	ipaddr = htonl(ipaddr);

	if ((ipaddr & 0xC0000000) == 0xC0000000)
		return CLASS_C_NETMASK;
	else if ((ipaddr & 0x80000000) == 0x80000000)
		return CLASS_B_NETMASK;
	else if ((ipaddr & 0x80000000) == 0)
		return CLASS_A_NETMASK;
	else
		return 0;
}

#ifdef CONFIG_FEATURE_IPCALC_FANCY
static int get_prefix(unsigned long netmask)
{
	unsigned long msk = 0x80000000;
        int ret = 0;

	netmask = htonl(netmask);
	while(msk) {
		if (netmask & msk)
			ret++;
		msk >>= 1;
        }
        return ret;
}
#endif

#define NETMASK   0x01
#define BROADCAST 0x02
#define NETWORK   0x04
#define NETPREFIX 0x08
#define HOSTNAME  0x10
#define SILENT    0x20


int ipcalc_main(int argc, char **argv)
{
	unsigned long mode;

	unsigned long netmask;
	unsigned long broadcast;
	unsigned long network;
	unsigned long ipaddr;
	struct in_addr a;

#ifdef CONFIG_FEATURE_IPCALC_FANCY
	unsigned long netprefix = 0;
	int have_netmask = 0;
	char *ipstr, *prefixstr;
#endif

	static const struct option long_options[] = {
		{"netmask", no_argument, NULL, 'm'},
		{"broadcast", no_argument, NULL, 'b'},
		{"network", no_argument, NULL, 'n'},
#ifdef CONFIG_FEATURE_IPCALC_FANCY
                {"prefix", no_argument, NULL, 'p'},
		{"hostname", no_argument, NULL, 'h'},
		{"silent", no_argument, NULL, 's'},
#endif
		{NULL, 0, NULL, 0}
	};

	bb_applet_long_options = long_options;
	mode = bb_getopt_ulflags(argc, argv,
#ifdef CONFIG_FEATURE_IPCALC_FANCY
							  "mbnphs");
#else
							  "mbn");
#endif
	if (mode & (BROADCAST | NETWORK | NETPREFIX)) {
		if (argc - optind > 2) {
			bb_show_usage();
		}
	} else {
		if (argc - optind != 1) {
			bb_show_usage();
		}
	}

#ifdef CONFIG_FEATURE_IPCALC_FANCY
        prefixstr = ipstr = argv[optind];

        while(*prefixstr) {
                if (*prefixstr == '/') {
                        *prefixstr = (char)0;
                        prefixstr++;
                        if (*prefixstr) {
				unsigned int msk;

                                netprefix = atol(prefixstr);
                                if (netprefix > 32) {
                                        IPCALC_MSG(bb_error_msg_and_die("bad IP prefix: %s\n", prefixstr),
                                                exit(EXIT_FAILURE));
                                }
				netmask = 0;
				msk = 0x80000000;
				while (netprefix > 0) {
					netmask |= msk;
					msk >>= 1;
                                                netprefix--;
                                        }
                                        netmask = htonl(netmask);
                                /* Even if it was 0, we will signify that we have a netmask. This allows */
                                /* for specification of default routes, etc which have a 0 netmask/prefix */
                                have_netmask = 1;
                        }
                        break;
                }
                prefixstr++;
        }
	ipaddr = inet_aton(ipstr, &a);
#else
	ipaddr = inet_aton(argv[optind], &a);
#endif

	if (ipaddr == 0) {
		IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[optind]),
				   exit(EXIT_FAILURE));
	}
	ipaddr = a.s_addr;

	if (argc - optind == 2) {
#ifdef CONFIG_FEATURE_IPCALC_FANCY
	       if (have_netmask) {
                        IPCALC_MSG(bb_error_msg_and_die("Both prefix and netmask were specified, use one or the other.\n"),
                                exit(EXIT_FAILURE));
                }

#endif
		netmask = inet_aton(argv[optind + 1], &a);
		if (netmask == 0) {
		IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[optind + 1]),
				   exit(EXIT_FAILURE));
	}
		netmask = a.s_addr;
	} else {
#ifdef CONFIG_FEATURE_IPCALC_FANCY

		if (!have_netmask)
#endif
	/* JHC - If the netmask wasn't provided then calculate it */
		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 & NETPREFIX) {
                printf("PREFIX=%i\n", get_prefix(netmask));
        }

	if (mode & HOSTNAME) {
		struct hostent *hostinfo;
		int x;

		hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET);
		if (!hostinfo) {
			IPCALC_MSG(bb_herror_msg_and_die(
				"cannot find hostname for %s", argv[optind]),);
			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:
*/
