ref: af81ff0f5f4a71c9623648ebbb6c9f8a5e9ba9c1
parent: fbbc25e50e852ea7cc3c589f228f5fbf2fd383aa
author: 9ferno <gophone2015@gmail.com>
date: Sat Sep 11 12:48:53 EDT 2021
output ip addr & mask
--- /dev/null
+++ b/appl/cmd/ip/netaddr.b
@@ -1,0 +1,75 @@
+implement Netaddr;
+
+include "sys.m";
+ sys: Sys;
+ read, write: import sys;
+
+include "draw.m";
+
+include "ip.m";
+ ip: IP;
+ IPaddr: import ip;
+
+# objective:
+# input: addr/mask or addr mask
+# output: addr & mask
+#% ./netaddr.dis 127.0.0.8 /104
+#127.0.0.0
+#% ./netaddr.dis 127.0.0.8/104
+#127.0.0.0
+#% ./netaddr.dis 127.0.0.8 255.255.0.0
+#127.0.0.0
+Netaddr: module
+{
+ init: fn(nil: ref Draw->Context, nil: list of string);
+};
+
+usage()
+{
+ sys->fprint(sys->fildes(2), "Usage: netaddr (addr mask | addr/mask)\n");
+ raise "fail:usage";
+}
+
+init(nil: ref Draw->Context, args: list of string)
+{
+ sys = load Sys Sys->PATH;
+ ip = load IP IP->PATH;
+
+# for(as:=args; as != nil; as = tl as){
+# sys->print("arg %s\n", hd as);
+# }
+ if(len args < 2 || len args > 3)
+ usage();
+ args = tl args;
+
+ ip->init();
+ if(len args == 1){
+ cidraddr := hd args;
+ (e,ipa, ipm) := IPaddr.parsecidr(cidraddr);
+ if(e != 0){
+ sys->fprint(sys->fildes(2), "netaddr: parsecidr cidraddr %s: %r\n", cidraddr);
+ raise "fail: parsecidr %r";
+ }
+ output(ipa,ipm);
+ }else{
+ addr := hd args;
+ mask := hd tl args;
+ (e,ipa) := IPaddr.parse(addr);
+ if(e != 0){
+ sys->fprint(sys->fildes(2), "netaddr: parse addr %s: %r\n", addr);
+ raise "fail: parse %r";
+ }
+ (em,ipm) := IPaddr.parsemask(mask);
+ if(em != 0){
+ sys->fprint(sys->fildes(2), "netaddr: parse mask %s: %r\n", mask);
+ raise "fail: parse %r";
+ }
+ output(ipa,ipm);
+ }
+}
+output(ipa: IPaddr, ipm: IPaddr)
+{
+# sys->print("ip %s mask %s\n", ipa.text(), ipm.text());
+ o := ipa.mask(ipm);
+ sys->print("%s\n", o.text());
+}