home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Online / QMail / source / tcp-env.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-15  |  2.9 KB  |  130 lines

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <sys/param.h>
  4. #include <netinet/in.h>
  5. #include "sig.h"
  6. #include "stralloc.h"
  7. #include "str.h"
  8. #include "env.h"
  9. #include "fmt.h"
  10. #include "scan.h"
  11. #include "subgetopt.h"
  12. #include "ip.h"
  13. #include "dns.h"
  14. #include "byte.h"
  15. #include "remoteinfo.h"
  16. #include "exit.h"
  17. #include "case.h"
  18.  
  19. void die() { _exit(111); }
  20.  
  21. struct sockaddr_in salocal;
  22. unsigned long localport;
  23. struct ip_address iplocal;
  24. stralloc localname = {0};
  25.  
  26. struct sockaddr_in saremote;
  27. unsigned long remoteport;
  28. struct ip_address ipremote;
  29. stralloc remotename = {0};
  30.  
  31. char temp[IPFMT + FMT_ULONG];
  32.  
  33. void main(argc,argv)
  34. int argc;
  35. char *argv[];
  36. {
  37.  int dummy;
  38.  char *proto;
  39.  int opt;
  40.  int flagremoteinfo;
  41.  unsigned long timeout;
  42.  
  43.  sig_pipeignore();
  44.  
  45.  flagremoteinfo = 1;
  46.  timeout = 30;
  47.  while ((opt = sgopt(argc,argv,"rRt:")) != sgoptdone)
  48.    switch(opt)
  49.     {
  50.      case 'r': flagremoteinfo = 1; break;
  51.      case 'R': flagremoteinfo = 0; break;
  52.      case 't': scan_ulong(sgoptarg,&timeout); break;
  53.     }
  54.  
  55.  argv += sgoptind;
  56.  argc -= sgoptind;
  57.  
  58.  if (argc < 1) die();
  59.  if (!env_init()) die();
  60.  
  61.  proto = env_get("PROTO");
  62.  if (!proto || str_diff(proto,"TCP"))
  63.   {
  64.    if (!env_put("PROTO=TCP")) die();
  65.  
  66.    dummy = sizeof(salocal);
  67.    if (getsockname(0,(struct sockaddr *) &salocal,&dummy) == -1) die();
  68.  
  69.    localport = ntohs(salocal.sin_port);
  70.    temp[fmt_ulong(temp,localport)] = 0;
  71.    if (!env_put2("TCPLOCALPORT",temp)) die();
  72.  
  73.    byte_copy(&iplocal,4,&salocal.sin_addr);
  74.    temp[ip_fmt(temp,&iplocal)] = 0;
  75.    if (!env_put2("TCPLOCALIP",temp)) die();
  76.  
  77.    switch(dns_ptr(&localname,&iplocal))
  78.     {
  79.      case DNS_MEM: die();
  80.      case DNS_SOFT:
  81.        if (!stralloc_copys(&localname,"softdnserror")) die();
  82.      case 0:
  83.        if (!stralloc_0(&localname)) die();
  84.        case_lowers(localname.s);
  85.        if (!env_put2("TCPLOCALHOST",localname.s)) die();
  86.        break;
  87.      default:
  88.        if (!env_unset("TCPLOCALHOST")) die();
  89.     }
  90.  
  91.    dummy = sizeof(saremote);
  92.    if (getpeername(0,(struct sockaddr *) &saremote,&dummy) == -1) die();
  93.  
  94.    remoteport = ntohs(saremote.sin_port);
  95.    temp[fmt_ulong(temp,remoteport)] = 0;
  96.    if (!env_put2("TCPREMOTEPORT",temp)) die();
  97.  
  98.    byte_copy(&ipremote,4,&saremote.sin_addr);
  99.    temp[ip_fmt(temp,&ipremote)] = 0;
  100.    if (!env_put2("TCPREMOTEIP",temp)) die();
  101.  
  102.    switch(dns_ptr(&remotename,&ipremote))
  103.     {
  104.      case DNS_MEM: die();
  105.      case DNS_SOFT:
  106.        if (!stralloc_copys(&remotename,"softdnserror")) die();
  107.      case 0:
  108.        if (!stralloc_0(&remotename)) die();
  109.        case_lowers(remotename.s);
  110.        if (!env_put2("TCPREMOTEHOST",remotename.s)) die();
  111.        break;
  112.      default:
  113.        if (!env_unset("TCPREMOTEHOST")) die();
  114.     }
  115.  
  116.    if (!env_unset("TCPREMOTEINFO")) die();
  117.    if (flagremoteinfo)
  118.     {
  119.      char *rinfo;
  120.      rinfo = remoteinfo_get(&ipremote,remoteport,&iplocal,localport,(int) timeout);
  121.      if (rinfo)
  122.        if (!env_put2("TCPREMOTEINFO",rinfo)) die();
  123.     }
  124.   }
  125.  
  126.  sig_pipedefault();
  127.  execvp(*argv,argv);
  128.  die();
  129. }
  130.