summaryrefslogtreecommitdiff
path: root/source/n/net-tools/ipmask.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/n/net-tools/ipmask.c')
-rw-r--r--source/n/net-tools/ipmask.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/source/n/net-tools/ipmask.c b/source/n/net-tools/ipmask.c
new file mode 100644
index 00000000..6be37c31
--- /dev/null
+++ b/source/n/net-tools/ipmask.c
@@ -0,0 +1,87 @@
+/* ipmask.c
+ *
+ * Given argv[1] as a decimal netmask and argv[2] as a decimal IP address,
+ * print the resulting broadcast and network addresses to stdout. This is
+ * potentially useful in scripts which need the broadcast address and the
+ * network address but want to ask the user as few questions as possible.
+ *
+ * Copyright 1994 by David Niemi. Written in about 30 minutes on 13 Aug.
+ * The author places no restrictions on the use of this program, provided
+ * that this copyright is preserved in any derived source code.
+ *
+ * Typical compilation command for Linux:
+ * cc ipmask.c -Wall -O -m486 -N -o ipmask -s
+ */
+
+#define MYNAME "ipmask"
+
+#include <stdio.h>
+
+void Usage(void) {
+ fprintf (stderr,
+ "USAGE: %s <decimal netmask> <decimal IP address>\n",
+ MYNAME);
+}
+
+int main(int argc, char *argv[])
+{
+unsigned long netmask, ipaddr, netaddr, broadcast;
+int in[4], j;
+unsigned char bc[4],na[4];
+
+ if (3 != argc) {
+ Usage();
+ exit(1);
+ }
+
+ /* Check netmask */
+ if (4 != sscanf(argv[1],"%d.%d.%d.%d", &in[0],&in[1],&in[2],&in[3])) {
+ fprintf (stderr,"Invalid netmask \"%s\".\n", argv[1]);
+ Usage();
+ exit(1);
+ }
+ for (j=0; j<4; ++j) {
+ if (in[j]<0 || in[j]>255) {
+ fprintf (stderr,
+ "Invalid octet %d in netmask \"%s\".\n",
+ j+1, argv[1]);
+ Usage();
+ exit(1);
+ }
+ }
+ netmask = in[3] + 256 * (in[2] + 256 * (in[1] + 256 * in[0]));
+
+ /* Check IP address */
+ if (4 != sscanf(argv[2],"%d.%d.%d.%d", &in[0],&in[1],&in[2],&in[3])) {
+ fprintf (stderr,"Invalid IP address \"%s\".\n", argv[2]);
+ Usage();
+ exit(1);
+ }
+ for (j=0; j<4; ++j) {
+ if (in[j]<0 || in[j]>255) {
+ fprintf (stderr,
+ "Invalid octet %d in IP address \"%s\".\n",
+ j+1, argv[1]);
+ Usage();
+ exit(1);
+ }
+ }
+ ipaddr = in[3] + 256 * (in[2] + 256 * (in[1] + 256 * in[0]));
+
+ broadcast = ipaddr | (~ netmask);
+ bc[0] = broadcast / 256 / 256 / 256;
+ bc[1] = (broadcast / 256 / 256) % 256;
+ bc[2] = (broadcast / 256) % 256;
+ bc[3] = broadcast % 256;
+
+ netaddr = ipaddr & netmask;
+ na[0] = netaddr / 256 / 256 / 256;
+ na[1] = (netaddr / 256 / 256) % 256;
+ na[2] = (netaddr / 256) % 256;
+ na[3] = netaddr % 256;
+
+ printf ("%d.%d.%d.%d %d.%d.%d.%d\n",
+ bc[0], bc[1], bc[2], bc[3], na[0], na[1], na[2], na[3]);
+
+ exit(0);
+}