remoteinfo.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include <sys/types.h>
       
     2 #include <sys/socket.h>
       
     3 #include <netinet/in.h>
       
     4 #include <fcntl.h>
       
     5 #include "byte.h"
       
     6 #include "substdio.h"
       
     7 #include "ip.h"
       
     8 #include "fmt.h"
       
     9 #include "timeoutconn.h"
       
    10 #include "timeoutread.h"
       
    11 #include "timeoutwrite.h"
       
    12 #include "remoteinfo.h"
       
    13 
       
    14 static char line[999];
       
    15 static int t;
       
    16 
       
    17 static int mywrite(fd,buf,len) int fd; char *buf; int len;
       
    18 {
       
    19   return timeoutwrite(t,fd,buf,len);
       
    20 }
       
    21 static int myread(fd,buf,len) int fd; char *buf; int len;
       
    22 {
       
    23   return timeoutread(t,fd,buf,len);
       
    24 }
       
    25 
       
    26 char *remoteinfo_get(ipr,rp,ipl,lp,timeout)
       
    27 struct ip_address *ipr;
       
    28 unsigned long rp;
       
    29 struct ip_address *ipl;
       
    30 unsigned long lp;
       
    31 int timeout;
       
    32 {
       
    33   char *x;
       
    34   int s;
       
    35   struct sockaddr_in sin;
       
    36   substdio ss;
       
    37   char buf[32];
       
    38   unsigned int len;
       
    39   int numcolons;
       
    40   char ch;
       
    41 
       
    42   t = timeout;
       
    43  
       
    44   s = socket(AF_INET,SOCK_STREAM,0);
       
    45   if (s == -1) return 0;
       
    46  
       
    47   byte_zero(&sin,sizeof(sin));
       
    48   sin.sin_family = AF_INET;
       
    49   byte_copy(&sin.sin_addr,4,ipl);
       
    50   sin.sin_port = 0;
       
    51   if (bind(s,(struct sockaddr *) &sin,sizeof(sin)) == -1) { close(s); return 0; }
       
    52   if (timeoutconn(s,ipr,113,timeout) == -1) { close(s); return 0; }
       
    53   fcntl(s,F_SETFL,fcntl(s,F_GETFL,0) & ~O_NDELAY);
       
    54  
       
    55   len = 0;
       
    56   len += fmt_ulong(line + len,rp);
       
    57   len += fmt_str(line + len," , ");
       
    58   len += fmt_ulong(line + len,lp);
       
    59   len += fmt_str(line + len,"\r\n");
       
    60  
       
    61   substdio_fdbuf(&ss,mywrite,s,buf,sizeof buf);
       
    62   if (substdio_putflush(&ss,line,len) == -1) { close(s); return 0; }
       
    63  
       
    64   substdio_fdbuf(&ss,myread,s,buf,sizeof buf);
       
    65   x = line;
       
    66   numcolons = 0;
       
    67   for (;;) {
       
    68     if (substdio_get(&ss,&ch,1) != 1) { close(s); return 0; }
       
    69     if ((ch == ' ') || (ch == '\t') || (ch == '\r')) continue;
       
    70     if (ch == '\n') break;
       
    71     if (numcolons < 3) { if (ch == ':') ++numcolons; }
       
    72     else { *x++ = ch; if (x == line + sizeof(line) - 1) break; }
       
    73   }
       
    74   *x = 0;
       
    75   close(s);
       
    76   return line;
       
    77 }