📄 224.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="215.htm">上一层</a>][<a href="225.htm">下一篇</a>]
<hr><p align="left"><small>发信人: SingleBoy (孤鹰★忧伤的夜鸟), 信区: Linux <br>
标 题: SmartGirl-0.0.0-beta1 <br>
发信站: 华南网木棉站 (Tue Jan 4 04:23:32 2000), 转信 <br>
<br>
<br>
/**************************************************************** <br>
* 本程序遵循 GPL 发布, 可以自由和免费地被复制, 使用 <br>
* 发布的目的是使它有用, 不提供任何承诺和保障. <br>
* <br>
* 如果本程序被修改, 您必须保证本段文字随改动后的程序 <br>
* 一起发布, 并且修改者的信息追加到下面的作者列表 <br>
* 的后面 <br>
* <br>
* 作 者: Rocky S. Lee <br>
* 邮 箱: coolrocky@21cn.com <br>
*****************************************************************/ <br>
#include <fcntl.h> <br>
#include <pthread.h> <br>
#include <stdio.h> <br>
#include <stdlib.h> <br>
#include <string.h> <br>
#include <sys/select.h> <br>
#include <sys/stat.h> <br>
#include <sys/time.h> <br>
#include <sys/types.h> <br>
#include <termios.h> <br>
#include <unistd.h> <br>
<br>
#define VERSION "0.0.0-beta1" <br>
<br>
#define MAX_FD_NUM 20 <br>
<br>
#define TRUE 1 <br>
#define FALSE 0 <br>
<br>
#define FAILED -1 <br>
#define SUCCESS 0 <br>
#define NICKNAME_UNKNOWN 1 <br>
#define LOGIN_NAME_ERROR 2 <br>
//HERE CAN DEFINE OTHER CONSTANTS <br>
<br>
char* error[] = { <br>
"Success.", <br>
"The LOGIN NAME may be wrong." <br>
}; <br>
}; <br>
<br>
#define TIME_OUT 60 <br>
<br>
#define MAXPATHLEN 4095 <br>
#define COMMAND "telnet" <br>
<br>
struct account_info { <br>
char nickname[32]; <br>
char realaddress[32]; <br>
}; <br>
<br>
int setup_mode(struct termios* old_term_param); <br>
int reset_mode(struct termios* old_term_param); <br>
<br>
int read_string(int handle, char* buffer, int buf_len); <br>
<br>
int get_account_info(char* nickname, struct account_info* info_record); <br>
int enjoy_it(int fd_read, int fd_write); <br>
<br>
int main(int argc, char* argv[]) <br>
{ <br>
int fd_read, fd_write, f_in[2], f_out[2]; <br>
char* argus[3]; <br>
char* version = VERSION; <br>
struct account_info info_record; <br>
pthread_t* thread_anti_idle_id; <br>
<br>
printf(";34mThanks for using SmartGirl %s!\n0m", version); <br>
<br>
if (argc <2) { <br>
printf("Too few arguments!\n"); <br>
printf("Usage:\n\t%s <NICK NAME>\n", argv[0]); <br>
exit(0); <br>
} <br>
<br>
if (get_account_info(argv[1], &info_record) != 0) { <br>
printf("The target \"%s\" is unknown ...\n", argv[1]); <br>
/* The code passes argv[1] to telnet goes here */ <br>
exit(1); <br>
} <br>
<br>
pipe(f_in); <br>
pipe(f_out); <br>
switch (fork()) { <br>
case -1: /* cannot fork child process */ <br>
perror("Cannot fork a subroutine.\n"); <br>
exit(1); <br>
case 0: /* child process */ <br>
dup2(f_in[0], STDIN_FILENO); <br>
close(f_in[0]); <br>
close(f_in[1]); <br>
dup2(f_out[1], STDOUT_FILENO); <br>
close(f_out[0]); <br>
close(f_out[1]); <br>
argus[0] = COMMAND; <br>
argus[1] = info_record.realaddress; <br>
argus[2] = NULL; <br>
if ((execvp("telnet", &argus[0]))<0) { <br>
perror("The execvp of command faild ...\n"); <br>
exit(1); <br>
} <br>
break; <br>
default: /* parent process */ <br>
close(f_in[0]); <br>
fd_write = f_in[1]; <br>
close(f_out[1]); <br>
fd_read = f_out[0]; <br>
enjoy_it(fd_read, fd_write); <br>
break; <br>
} <br>
<br>
close(f_in[0]); <br>
close(f_in[1]); <br>
close(f_out[0]); <br>
close(f_out[1]); <br>
<br>
return 0; <br>
} <br>
<br>
int get_account_info(char* nickname, struct account_info* info_record) <br>
{ <br>
int i, conf_file, found; <br>
char path[MAXPATHLEN]; <br>
<br>
if ((getenv("HOME")) == NULL) { <br>
perror("Home directory no found!\n"); <br>
return -1; <br>
} <br>
} <br>
<br>
strcpy(path, getenv("HOME")); <br>
strcat(path, "/.go_rc"); <br>
<br>
if ((conf_file=open(path, O_RDONLY)) == -1) { <br>
perror("Cannot open config file ...\n"); <br>
return -1; <br>
} <br>
<br>
found = 0; <br>
while (read_string(conf_file, info_record->nickname, 32) != 0 <br>
&& read_string(conf_file, info_record->realaddress, 32) != 0) { <br>
if ((strcmp(nickname, info_record->nickname)) == 0) { <br>
found = 1; <br>
break; <br>
} <br>
} <br>
close(conf_file); <br>
<br>
if (found) <br>
return SUCCESS; <br>
else <br>
else <br>
return NICKNAME_UNKNOWN; <br>
} <br>
<br>
int read_string(int handle, char* buffer, int buf_len) <br>
{ <br>
char* bufp = buffer; <br>
int counter = 0, i; <br>
<br>
for (i = 0; i < buf_len; i++) <br>
buffer[i] = '\0'; <br>
<br>
while (((i = read(handle, bufp, 1)) != 0) && counter < buf_len) { <br>
if (*bufp == ' ' || *bufp == '\t' <br>
|| *bufp == '\n' || *bufp == '\r') { <br>
*bufp = '\0'; <br>
break; <br>
} <br>
counter++; <br>
bufp++; <br>
} <br>
<br>
if (counter >= buf_len) <br>
*bufp = '\0'; <br>
<br>
return counter; <br>
} <br>
<br>
int enjoy_it(int fd_read, int fd_write) <br>
{ <br>
char buff; <br>
#define BUFFER_SIZE 1024 <br>
char buffer[BUFFER_SIZE]; <br>
int counter; <br>
fd_set fdR, fdW; <br>
struct timeval time_value; <br>
struct termios old_term_param; <br>
<br>
setup_mode(&old_term_param); <br>
while (1) { <br>
FD_ZERO(&fdR); <br>
FD_SET(fd_read, &fdR); <br>
FD_SET(STDIN_FILENO, &fdR); <br>
<br>
time_value.tv_sec = TIME_OUT; <br>
time_value.tv_usec = 0; <br>
if (select(MAX_FD_NUM + 1, &fdR, NULL, NULL, &time_value) == 0) <br>
<br>
buff = 12; <br>
write(fd_write, &buff, 1); <br>
continue; <br>
} <br>
<br>
if (FD_ISSET(STDIN_FILENO, &fdR)) { <br>
if (read(STDIN_FILENO, &buff, 1) == 1) { <br>
if (buff == 29) { <br>
write(fd_write, "\035quit\n", 6); <br>
write(STDOUT_FILENO, "\n", 1); <br>
break; <br>
} <br>
if (write(fd_write, &buff, 1) != 1) <br>
break; <br>
} <br>
} <br>
if (FD_ISSET(fd_read, &fdR)) { <br>
if ((counter = read(fd_read, buffer, BUFFER_SIZE)) > 0) <br>
write(STDOUT_FILENO, buffer, counter); <br>
else <br>
break; <br>
} <br>
} <br>
reset_mode(&old_term_param); <br>
<br>
return SUCCESS; <br>
} <br>
<br>
int setup_mode(struct termios* old_term_param) <br>
{ <br>
struct termios current_term_param; <br>
<br>
if (!isatty(STDIN_FILENO)) <br>
return FAILED; <br>
<br>
if (tcgetattr(STDIN_FILENO, ¤t_term_param) == -1) <br>
return FAILED; <br>
<br>
*old_term_param = current_term_param; <br>
current_term_param.c_lflag &= ~(ECHO | ICANON | ISIG); <br>
current_term_param.c_cc[VMIN] = 0; <br>
current_term_param.c_cc[VTIME] = 0; <br>
if(tcsetattr(0,TCSANOW,¤t_term_param) == -1) <br>
return FAILED; <br>
else <br>
return SUCCESS; <br>
} <br>
<br>
int reset_mode(struct termios* old_term_param) <br>
{ <br>
if (tcsetattr(STDIN_FILENO, TCSANOW, old_term_param) != 0) <br>
return FAILED; <br>
else <br>
return SUCCESS; <br>
} <br>
<br>
-- <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="215.htm">上一层</a>][<a href="225.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -