#include #include #include #include #include "byte.h" #include "substdio.h" #include "ip.h" #include "fmt.h" #include "timeoutconn.h" #include "timeoutread.h" #include "timeoutwrite.h" #include "remoteinfo.h" static char line[999]; char *remoteinfo_get(ipr,rp,ipl,lp,timeout) struct ip_address *ipr; unsigned long rp; struct ip_address *ipl; unsigned long lp; int timeout; { char *x; int s; struct sockaddr_in sin; substdio ss; char buf[32]; unsigned int len; int numcolons; char ch; s = socket(AF_INET,SOCK_STREAM,0); if (s == -1) return 0; byte_zero(&sin,sizeof(sin)); sin.sin_family = AF_INET; byte_copy(&sin.sin_addr,4,ipl); sin.sin_port = 0; if (bind(s,(struct sockaddr *) &sin,sizeof(sin)) == -1) { close(s); return 0; } if (timeoutconn(s,ipr,113,timeout) == -1) { close(s); return 0; } fcntl(s,F_SETFL,fcntl(s,F_GETFL,0) & ~O_NDELAY); len = 0; len += fmt_ulong(line + len,rp); len += fmt_str(line + len," , "); len += fmt_ulong(line + len,lp); len += fmt_str(line + len,"\r\n"); substdio_fdbuf(&ss,timeoutwrite,TIMEOUTWRITE(timeout,s),buf,sizeof(buf)); if (substdio_putflush(&ss,line,len) == -1) { close(s); return 0; } substdio_fdbuf(&ss,timeoutread,TIMEOUTREAD(timeout,s),buf,sizeof(buf)); x = line; numcolons = 0; for (;;) { if (substdio_get(&ss,&ch,1) != 1) { close(s); return 0; } if ((ch == ' ') || (ch == '\t') || (ch == '\r')) continue; if (ch == '\n') break; if (numcolons < 3) { if (ch == ':') ++numcolons; } else { *x++ = ch; if (x == line + sizeof(line) - 1) break; } } *x = 0; close(s); return line; }