Commit | Line | Data |
---|---|---|
2117e02e MW |
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 | } |