inetutils中tftpd不能独立运行的原因
2017-12-13 09:53
232 查看
int
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);
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);
相关文章推荐
- iis 5.0 不能运行 asp.net 的 原因
- yummain.py install yum 不能运行的原因 yummain.py not found
- JAVA程序在eclipse下可运行但不能在cmd命令下运行的原因
- 新下载的linux 2.6内核不能运行make menuconfig原因查找
- Android Studio 更新后创建新项目不能运行原因
- Java项目在Tomcat下能运行,到WAS上不能运行原因查找
- Jbuilder2006 不能运行一闪而过的原因
- tiny210运行自己的应用程序不能使用触摸屏的解决方法以及原因猜想
- qwt自带demo不能运行的原因
- keil4程序从JLINK8下载后,不能运行,需要重启的原因
- 用VS2005编译的应用程序在其它VS2005机器不能正常运行的原因和解决办法
- 用VS2005编译的应用程序在其它VS2005机器不能正常运行的原因和解决办法
- adt导入老版本eclipse项目时不能运行原因
- 迅为4412开发板,运行Linux QT系统,U盘不能挂载,什么原因?
- worklight Ap在真机上不能运行的原因分析
- rhel as4.7 中自带firefox 3.0.1不能正常运行,会自动关闭,原因是scim
- TMS320F28335在Flash里面运行时不能设置断点的原因
- VS2010+opencv中Debug下运行,Release下运行,其中一个不能成功的原因。
- keil4程序从JLINK8下载后,不能运行,需要重启的原因
- STM32 编译后不能运行的几个原因