⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcp-env.c

📁 linux下qmail的源码 本人加了一些注释
💻 C
字号:
//	初始化qmail-smtpd.c的环境变量,但不负责监听端口及重定向网络连接

#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();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -