ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /appl/lib/ether.b/
implement Ether;
include "sys.m";
sys: Sys;
include "ether.m";
init()
{
sys = load Sys Sys->PATH;
}
parse(s: string): array of byte
{
a := array[Eaddrlen] of byte;
for(i := 0; i < len a; i++){
n: int;
(n, s) = hex(s);
if(n < 0){
sys->werrstr("invalid ether address");
return nil;
}
a[i] = byte n;
if(s != nil && s[0] == ':')
s = s[1:];
}
return a;
}
hex(s: string): (int, string)
{
n := 0;
for(i := 0; i < len s && i < 2; i++){
if((c := s[i]) >= '0' && c <= '9')
c -= '0';
else if(c >= 'a' && c <= 'f')
c += 10 - 'a';
else if(c >= 'A' && c <= 'F')
c += 10 - 'A';
else if(c == ':')
break;
else
return (-1, s);
n = (n<<4) | c;
}
if(i == 0)
return (-1, s);
return (n, s[i:]);
}
text(a: array of byte): string
{
if(len a < Eaddrlen)
return "<invalid>";
return sys->sprint("%.2ux%.2ux%.2ux%.2ux%.2ux%.2ux",
int a[0], int a[1], int a[2], int a[3], int a[4], int a[5]);
}
addressof(dev: string): array of byte
{
if(dev != nil && dev[0] != '/')
dev = "/net/"+dev;
fd := sys->open(dev+"/addr", Sys->OREAD);
if(fd == nil)
return nil;
buf := array[64] of byte;
n := sys->read(fd, buf, len buf);
if(n <= 0)
return nil;
if(n > 0 && buf[n-1] == byte '\n')
n--;
return parse(string buf[0:n]);
}
eqaddr(a: array of byte, b: array of byte): int
{
if(len a != len b)
return 0;
for(i := 0; i < len a; i++)
if(a[i] != b[i])
return 0;
return 1;
}