提交 0c380176 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

A complete telnetd.

lwIP crashes after a client connects and sh prints the prompt.
上级 abc4e71f
...@@ -151,7 +151,7 @@ mscan.kern: $(O)/kernel ...@@ -151,7 +151,7 @@ mscan.kern: $(O)/kernel
## ##
QEMUOPTS = -smp $(QEMUSMP) -m 512 -serial mon:stdio -nographic \ QEMUOPTS = -smp $(QEMUSMP) -m 512 -serial mon:stdio -nographic \
-net user -net nic,model=e1000 \ -net user -net nic,model=e1000 \
-net dump,file=qemu.pcap -net dump,file=qemu.pcap -redir tcp:2323::23
qemu: $(O)/kernel qemu: $(O)/kernel
$(QEMU) $(QEMUOPTS) -kernel $(O)/kernel $(QEMU) $(QEMUOPTS) -kernel $(O)/kernel
......
...@@ -24,16 +24,38 @@ main(void) ...@@ -24,16 +24,38 @@ main(void)
if (r < 0) if (r < 0)
die("telnetd listen: %d\n", r); die("telnetd listen: %d\n", r);
printf(1, "telnetd: port 23\n");
for (;;) { for (;;) {
socklen_t socklen = sizeof(sin); socklen_t socklen;
int ss = accept(s, (struct sockaddr *)&sin, &socklen); int ss;
int pid;
socklen = sizeof(sin);
ss = accept(s, (struct sockaddr *)&sin, &socklen);
if (ss < 0) { if (ss < 0) {
printf(1, "telnetd accept: %d\n", ss); printf(2, "telnetd accept: %d\n", ss);
continue;
}
printf(1, "telnetd: connection\n");
pid = fork(0);
if (pid < 0) {
printf(2, "telnetd fork: %d\n", pid);
close(ss);
continue; continue;
} }
if (pid == 0) {
printf(1, "Got one!\n"); static char *argv[] = { "sh", 0 };
// XXX fork, exec sh, etc.. close(0);
close(1);
close(2);
dup(ss);
dup(ss);
dup(ss);
exec("sh", argv);
exit();
}
close(ss); close(ss);
} }
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论