PPTP CODE 分析

 

string dirname ( string $path )说明:返回路径中的目录部分。给出一个包含有指向一个文件的全路径的字符串($path),本函数返回去掉文件名后的目录名。

socket(AF_UNIX, SOCK_STREAM, 0),进程间通信/*PF_UNIX或AF_UNIX */
void callmgr_name_unixsock(struct sockaddr_un *where, 
  struct in_addr inetaddr,
  struct in_addr localbind)
{
    char localaddr[16], remoteaddr[16];
    where->sun_family = AF_UNIX;
    strncpy(localaddr,  inet_ntoa(localbind), 16);
    strncpy(remoteaddr, inet_ntoa(inetaddr),  16);
    snprintf(where->sun_path, sizeof(where->sun_path),
    PPTP_SOCKET_PREFIX "%s:%s", localaddr, remoteaddr);//作为唯一标识 
}
                            |pptp_gre_bind-->
                            |                                                       2.prctl(PR_SET_NAME, "pptpcm", 0, 0, 0); //给线程命名在目录下stat
    |     2.inststr()//不分析,和上面的函数功能应该相同,只执行一个
路线:main  --->   |open_callmgr-->launch_callmgr-->  2callmgr_main  -->    3routing_init routing_start替换路由
                                                                                                                      3open_inetsock链接对方open_unixsock本地
       3pptp_dispatch()--->主要的就在read里面
这样的用法:
 /* Now we have the peer address, bind the GRE socket early,
       before starting pppd. This prevents the ICMP Unreachable bug
       documented in <1026868263.2855.67.camel@jander> */
    gre_fd = pptp_gre_bind(inetaddr);
/*** Open IP protocol socket **************************************************/
int pptp_gre_bind(struct in_addr inetaddr)
{
    struct sockaddr_in src_addr, loc_addr;
    extern struct in_addr localbind;
    int s = socket(AF_INET, SOCK_RAW, PPTP_PROTO);
    if (s < 0) { warn("socket: %s", strerror(errno)); return -1; }
    if (localbind.s_addr != INADDR_NONE) {
        bzero(&loc_addr, sizeof(loc_addr));
        loc_addr.sin_family = AF_INET;
        loc_addr.sin_addr   = localbind;
        if (bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) != 0) {
            warn("bind: %s", strerror(errno)); close(s); return -1;
        }
    }
    src_addr.sin_family = AF_INET; //
    src_addr.sin_addr   = inetaddr;
    src_addr.sin_port   = 0; //这么用很奇怪,可能这个可以预防不可达的情况吧
    if (connect(s, (struct sockaddr *) &src_addr, sizeof(src_addr)) < 0) {
        warn("connect: %s", strerror(errno)); close(s); return -1;
    }
    my = test_redirections();//分配一些内存
    return s;
}

 

你可能感兴趣的:(PPTP CODE 分析)