tcp-env.c
changeset 0 068428edee47
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tcp-env.c	Fri Oct 19 14:06:22 2007 +0200
@@ -0,0 +1,129 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/param.h>
+#include <netinet/in.h>
+#include "sig.h"
+#include "stralloc.h"
+#include "str.h"
+#include "env.h"
+#include "fmt.h"
+#include "scan.h"
+#include "subgetopt.h"
+#include "ip.h"
+#include "dns.h"
+#include "byte.h"
+#include "remoteinfo.h"
+#include "exit.h"
+#include "case.h"
+
+void die() { _exit(111); }
+
+struct sockaddr_in salocal;
+unsigned long localport;
+struct ip_address iplocal;
+stralloc localname = {0};
+
+struct sockaddr_in saremote;
+unsigned long remoteport;
+struct ip_address ipremote;
+stralloc remotename = {0};
+
+char temp[IPFMT + FMT_ULONG];
+
+void main(argc,argv)
+int argc;
+char *argv[];
+{
+ int dummy;
+ char *proto;
+ int opt;
+ int flagremoteinfo;
+ unsigned long timeout;
+
+ sig_pipeignore();
+
+ flagremoteinfo = 1;
+ timeout = 30;
+ while ((opt = sgopt(argc,argv,"rRt:")) != sgoptdone)
+   switch(opt)
+    {
+     case 'r': flagremoteinfo = 1; break;
+     case 'R': flagremoteinfo = 0; break;
+     case 't': scan_ulong(sgoptarg,&timeout); break;
+    }
+
+ argv += sgoptind;
+ argc -= sgoptind;
+
+ if (argc < 1) die();
+ if (!env_init()) die();
+
+ proto = env_get("PROTO");
+ if (!proto || str_diff(proto,"TCP"))
+  {
+   if (!env_put("PROTO=TCP")) die();
+
+   dummy = sizeof(salocal);
+   if (getsockname(0,(struct sockaddr *) &salocal,&dummy) == -1) die();
+
+   localport = ntohs(salocal.sin_port);
+   temp[fmt_ulong(temp,localport)] = 0;
+   if (!env_put2("TCPLOCALPORT",temp)) die();
+
+   byte_copy(&iplocal,4,&salocal.sin_addr);
+   temp[ip_fmt(temp,&iplocal)] = 0;
+   if (!env_put2("TCPLOCALIP",temp)) die();
+
+   switch(dns_ptr(&localname,&iplocal))
+    {
+     case DNS_MEM: die();
+     case DNS_SOFT:
+       if (!stralloc_copys(&localname,"softdnserror")) die();
+     case 0:
+       if (!stralloc_0(&localname)) die();
+       case_lowers(localname.s);
+       if (!env_put2("TCPLOCALHOST",localname.s)) die();
+       break;
+     default:
+       if (!env_unset("TCPLOCALHOST")) die();
+    }
+
+   dummy = sizeof(saremote);
+   if (getpeername(0,(struct sockaddr *) &saremote,&dummy) == -1) die();
+
+   remoteport = ntohs(saremote.sin_port);
+   temp[fmt_ulong(temp,remoteport)] = 0;
+   if (!env_put2("TCPREMOTEPORT",temp)) die();
+
+   byte_copy(&ipremote,4,&saremote.sin_addr);
+   temp[ip_fmt(temp,&ipremote)] = 0;
+   if (!env_put2("TCPREMOTEIP",temp)) die();
+
+   switch(dns_ptr(&remotename,&ipremote))
+    {
+     case DNS_MEM: die();
+     case DNS_SOFT:
+       if (!stralloc_copys(&remotename,"softdnserror")) die();
+     case 0:
+       if (!stralloc_0(&remotename)) die();
+       case_lowers(remotename.s);
+       if (!env_put2("TCPREMOTEHOST",remotename.s)) die();
+       break;
+     default:
+       if (!env_unset("TCPREMOTEHOST")) die();
+    }
+
+   if (!env_unset("TCPREMOTEINFO")) die();
+   if (flagremoteinfo)
+    {
+     char *rinfo;
+     rinfo = remoteinfo_get(&ipremote,remoteport,&iplocal,localport,(int) timeout);
+     if (rinfo)
+       if (!env_put2("TCPREMOTEINFO",rinfo)) die();
+    }
+  }
+
+ sig_pipedefault();
+ execvp(*argv,argv);
+ die();
+}