1implement Announce; 2include "sys.m"; 3 sys: Sys; 4include "dial.m"; 5 dial: Dial; 6include "grid/announce.m"; 7 8init() 9{ 10 sys = load Sys Sys->PATH; 11} 12 13announce(): (string, ref Sys->Connection) 14{ 15 sysname := readfile("/dev/sysname"); 16 c := dial->announce("tcp!*!0"); 17 if(c == nil) 18 return (nil, nil); 19 local := readfile(c.dir + "/local"); 20 if(local == nil) 21 return (nil, nil); 22 for(i := len local - 1; i >= 0; i--) 23 if(local[i] == '!') 24 break; 25 port := local[i+1:]; 26 if(port == nil) 27 return (nil, nil); 28 if(port[len port - 1] == '\n') 29 port = port[0:len port - 1]; 30 return ("tcp!" + sysname + "!" + port, c); 31} 32 33 34readfile(f: string): string 35{ 36 fd := sys->open(f, Sys->OREAD); 37 if (fd == nil) 38 return nil; 39 buf := array[8192] of byte; 40 n := sys->read(fd, buf, len buf); 41 if (n <= 0) 42 return nil; 43 return string buf[0:n]; 44} 45