inetutils中tftpd不能独立运行的原因
来源:互联网 发布:java核心技术第10版 编辑:程序博客网 时间:2024/06/10 02:05
main (int argc, char *argv[])
{
int index;
register struct tftphdr *tp;
int on, n;
struct sockaddr_storage sin;
char *temp;
int tempint;
struct stat stbuf;
user = xstrdup (DEFAULT_USER);
set_program_name (argv[0]);
iu_argp_init ("tftpd", default_program_authors);
argp_parse (&argp, argc, argv, 0, &index, NULL);
openlog ("tftpd", LOG_PID, LOG_FTP);
if (index < argc)
{
struct dirlist *dirp;
/* Get list of directory prefixes. Skip relative pathnames. */
for (dirp = dirs; index < argc && dirp < &dirs[MAXDIRS]; index++)
{
if (argv[index][0] == '/')
{
dirp->name = argv[index];
dirp->len = strlen (dirp->name);
dirp++;
}
}
}
on = 1;
if (ioctl (0, FIONBIO, &on) < 0)
{
syslog (LOG_ERR, "ioctl(FIONBIO): %m");
exit (EXIT_FAILURE);
}
fstat(0,&stbuf);
if ((stbuf.st_mode & S_IFMT) == S_IFSOCK)
syslog (LOG_INFO, "stbuf.st_mode = S_IFSOCK" );
fromlen = sizeof (from);
n = recvfrom (0, buf, sizeof (buf), 0, (struct sockaddr *) &from, &fromlen);
temp=inet_ntoa(((struct sockaddr_in*)&from)->sin_addr);
tempint=ntohs (((struct sockaddr_in *)&from)->sin_port);
syslog (LOG_INFO, "sin_addr = %s,sin_port = %d" ,temp,tempint);
if (n < 0)
{
syslog (LOG_ERR, "recvfrom: %m\n");
if ((stbuf.st_mode & S_IFMT) == S_IFCHR)
syslog (LOG_INFO, "stbuf.st_mode = S_IFCHR" );
fprintf(stderr,"fd = 0 is not a socket\n");
exit (EXIT_FAILURE);
}
蓝色部分是自己加的。
如果不加,查看/var/log/syslog只会看到一条信息
Dec 13 08:57:14 ch-Founder-PC tftpd[10451]: recvfrom: Socket operation on non-socket
意思是recvfrom函数的参数0不是一个套接字。
再然后就exit了。如果用ps也看不到tftpd进程。
下面是加了蓝色部分的日志信息
Dec 13 08:57:14 ch-Founder-PC tftpd[10451]: sin_addr = 0.0.0.0,sin_port = 0
Dec 13 08:57:14 ch-Founder-PC tftpd[10451]: recvfrom: Socket operation on non-socket
Dec 13 08:57:14 ch-Founder-PC tftpd[10451]: stbuf.st_mode = S_IFCHR
如果用./inetd -d来启动tftpd服务的话,日志信息是:
Dec 13 08:38:27 ch-Founder-PC tftpd[10221]: stbuf.st_mode = S_IFSOCK
Dec 13 08:38:27 ch-Founder-PC tftpd[10221]: sin_addr = 172.22.24.150,sin_port = 34722
Dec 13 08:38:27 ch-Founder-PC tftpd[10222]: 172.22.24.150 (IPv4): read request for /home/ch/tftpboot/test: success
看来inetd.c中肯定有dup2函数把stdin设置为了一个socket。
果然是这样,相关的代码是:
void
run_service (int ctrl, struct servtab *sep)
{
struct passwd *pwd;
struct group *grp = NULL;
char buf[50];
if (sep->se_bi)
{
(*sep->se_bi->bi_fn) (ctrl, sep);
}
else
{
if (debug)
fprintf (stderr, "%d execl %s\n", (int) getpid (), sep->se_server);
dup2 (ctrl, 0);
close (ctrl);
dup2 (0, 1);
dup2 (0, 2);
- inetutils中tftpd不能独立运行的原因
- win7系统中3Dmax不能运行的原因分析
- VS2010+opencv中Debug下运行,Release下运行,其中一个不能成功的原因。
- Jbuilder2006 不能运行一闪而过的原因
- netbox2.8不能运行的原因
- C盘太满,程序不能运行的原因
- Release版本不能运行的原因
- ComThread.InitSTA() 不能运行的原因
- inetutils中tftp源代码分析之一:tftp中命令的使用
- 独立运行的程序
- 独立运行的程序
- 独立运行的程序
- 独立运行的程序
- 独立运行的程序
- 中断处理中不能睡眠的原因
- 中断处理中不能睡眠的原因
- 中断中不能睡眠的原因
- qwt自带demo不能运行的原因
- tomcat的端口号问题
- Oracle杀掉系统进程的描述
- 报错写法
- 一键打包上传测试 报错CodeSign build/Release-iphone/XXX.app
- TextView展开和收起
- inetutils中tftpd不能独立运行的原因
- unity平台路径
- JVM堆内存中垃圾回收机制的原理
- 洛谷1040 加分二叉树
- 协程屏蔽字库
- 学习子空间投影下 简单的最小二乘
- 移 login 第三方
- Sonar代码质量检测工具
- LINUX-动态链接与静态链接对比(动态库和静态库)