- 论坛徽章:
- 0
|
本帖最后由 xdshting 于 2010-09-01 17:20 编辑
- if (daemon_mode) {
- int ctl_sock, fd2;
- struct servent *sv;
- /*
- * Detach from parent.
- */
- if (daemon(1, 1) < 0) {
- syslog(LOG_ERR, "failed to become a daemon");
- exit(1);
- }
- (void) signal(SIGCHLD, reapchild);
- /*
- * Get port number for ftp/tcp.
- */
- sv = getservbyname("ftp", "tcp");
- if (sv == NULL) {
- syslog(LOG_ERR, "getservbyname for ftp failed");
- exit(1);
- }
- /*
- * Open a socket, bind it to the FTP port, and start
- * listening.
- */
- ctl_sock = socket(AF_INET, SOCK_STREAM, 0);
- if (ctl_sock < 0) {
- syslog(LOG_ERR, "control socket: %m");
- exit(1);
- }
- if (setsockopt(ctl_sock, SOL_SOCKET, SO_REUSEADDR,
- (char *)&on, sizeof(on)) < 0)
- syslog(LOG_ERR, "control setsockopt: %m");;
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.s_addr = INADDR_ANY;
- server_addr.sin_port = sv->s_port;
- if (bind(ctl_sock, (struct sockaddr *)&server_addr,
- sizeof(server_addr))) {
- syslog(LOG_ERR, "control bind: %m");
- exit(1);
- }
- if (listen(ctl_sock, 32) < 0) {
- syslog(LOG_ERR, "control listen: %m");
- exit(1);
- }
- /*
- * Loop forever accepting connection requests and forking off
- * children to handle them.
- */
- while (1) {
- addrlen = sizeof(his_addr);
- fd2 = accept(ctl_sock, (struct sockaddr *)&his_addr,
- &addrlen);
- if (fork() == 0) {
- /* child */
- (void) dup2(fd2, 0);
- (void) dup2(fd2, 1);
- close(ctl_sock);
- break;
- }
- close(fd2);
- }
- } else[color=Red] {
- addrlen = sizeof(his_addr);
- if (getpeername(0, (struct sockaddr *)&his_addr,
- &addrlen) < 0) {
- syslog(LOG_ERR, "getpeername (%s): %m", argv[0]);
- exit(1);
- }[/color]
- }
复制代码 红色的部分很奇怪(64行),从if。。。else。。。可以看出,只有在deamon模式,才会把描述符0定向到套接口,否则他就是普通的文件描述符啊?
怎么能能对他调用getpeername呢?
更多的源码在
http://www.hackchina.com/r/56502 ... ftpd-_-ftpd.c__html
谢谢 |
|