(以内容“== friends == <source lang="c"> struct friends { char id[13]; char exp[LEN_FRIEND_EXP]; #ifdef FRIEND_MULTI_GROUP int groupid; #endif }; struct friends_inf...”创建新页面) |
(→逻辑部分) |
||
(未显示同一用户的5个中间版本) | |||
第1行: | 第1行: | ||
+ | [[Category:BBS 代码分析]] | ||
+ | |||
+ | = UI部分 = | ||
+ | |||
+ | 入口函数:src/list.c deal_key() | ||
+ | |||
+ | = 逻辑部分 = | ||
+ | == 载入时间 == | ||
+ | 见stack trace | ||
+ | <source lang="asm"> | ||
+ | #0 getfriendstr (user=0xf79fb884, puinfo=0xf6aa1fd8) at utmp.c:705 | ||
+ | #1 0x080cf5f6 in u_enter () at newmain_single.c:184 | ||
+ | #2 0x080d1087 in user_login () at newmain_single.c:892 | ||
+ | #3 0x080d1916 in main_bbs (convit=0, argv=0xff9f4eea "/home/bbs/bin/sshbbsd") at newmain_single.c:1099 | ||
+ | #4 0x0808953a in bbs_main (argv=0xff9f4eea "/home/bbs/bin/sshbbsd") at bbsd_single.c:626 | ||
+ | #5 0x08089d82 in bbs_entry () at bbsd_single.c:1008 | ||
+ | #6 0x0805c745 in do_exec_no_pty (command=0x0, pw=0x0, display=0x0, auth_proto=0x0, auth_data=0x0) at sshd.c:1792 | ||
+ | #7 0x0805c625 in do_authenticated (pw=0x0) at sshd.c:1730 | ||
+ | #8 0x0805c453 in do_authentication (user=0x8169ed0, privileged_port=0, cipher_type=3) at sshd.c:1634 | ||
+ | #9 0x0805c111 in do_connection (privileged_port=0) at sshd.c:1473 | ||
+ | #10 0x0805bd05 in main (ac=1, av=0xff9f2ed4) at sshd.c:1324 | ||
+ | </source> | ||
+ | |||
== friends == | == friends == | ||
<source lang="c"> | <source lang="c"> | ||
+ | // 部分 | ||
+ | struct user_info { /* Structure used in UTMP file */ | ||
+ | int active; /* When allocated this field is true */ | ||
+ | int uid; /* Used to find user name in passwd file */ | ||
+ | int pid; /* kill() to notify user of talk request */ | ||
+ | // ... | ||
+ | int friendsnum; | ||
+ | int friends_uid[MAXFRIENDS]; | ||
+ | #ifdef FRIEND_MULTI_GROUP | ||
+ | unsigned int friends_p[MAXFRIENDS]; | ||
+ | #endif | ||
+ | // ... | ||
+ | }; | ||
+ | |||
+ | struct user_info *user_record[USHM_SIZE]; | ||
+ | |||
+ | // friends文件就是这个东西的一个数组 | ||
struct friends { | struct friends { | ||
− | char id[13]; | + | char id[13]; // 用户名 |
− | char exp[LEN_FRIEND_EXP]; | + | char exp[LEN_FRIEND_EXP]; // 昵称,默认为空 |
#ifdef FRIEND_MULTI_GROUP | #ifdef FRIEND_MULTI_GROUP | ||
int groupid; | int groupid; | ||
#endif | #endif | ||
}; | }; | ||
+ | |||
struct friends_info { | struct friends_info { | ||
− | char exp[LEN_FRIEND_EXP]; | + | char exp[LEN_FRIEND_EXP]; // 存储昵称用 |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
}; | }; | ||
+ | struct friends_info* topfriend; // 存储了好友的昵称 | ||
+ | // 次序按照用户名经过处理排序后的,对照userinfo.friends_uid | ||
+ | |||
</source> | </source> | ||
+ | |||
+ | == utmp.c == | ||
+ | ; cmpfuid [(const void*a,const void*b)] | ||
+ | * Friend.NCaseId() | ||
+ | |||
+ | ; getfriendstr [(struct userec* user,struct user_info* puinfo)] | ||
+ | * User.GetFriends() | ||
+ | |||
+ | ; myfriend [(int uid, char *fexp)] | ||
+ | * UserInfo.HasFriend() | ||
+ | |||
+ | ; hisfriend [(int uid,struct user_info* him)] | ||
+ | * UserInfo.HasFriend() | ||
+ | |||
+ | == list.c == | ||
+ | |||
+ | === TERM显示相关 === | ||
+ | ; print_title | ||
+ | ; print_title2 | ||
+ | ; print_user_info_title | ||
+ | ; show_message [(char *msg)] | ||
+ | ; pagerchar [(int usernum, struct user_info *user, int pager, int *isfriend)] | ||
+ | ; msgchar [(struct user_info *uin, int *isfriend)] | ||
+ | ; do_userlist | ||
+ | 显示user list。 | ||
+ | |||
+ | ; show_userlist | ||
+ | 显示user list。调用do_userlist。如果需要刷新则调用fill_userlist()。 | ||
+ | |||
+ | ; deal_key | ||
+ | ; deal_key2 | ||
+ | 按键处理。 | ||
+ | |||
+ | ; printuent [(struct userec *uentp, char *arg)] | ||
+ | 显示用户信息。 | ||
+ | |||
+ | ; Show_Users | ||
+ | 调用printuent显示所有用户信息。 | ||
+ | |||
+ | do_query [(int star, int curr)] | ||
+ | do_query2 [(int star, int curr)] | ||
+ | |||
+ | ; Users | ||
+ | 初始化user_data,调Show_Users显示用户,deal_key2接收按键,do_query2执行。 | ||
+ | |||
+ | ; t_friends | ||
+ | 调用show_userlist显示好友,deal_key接收按键,do_query执行。 | ||
+ | |||
+ | ; t_users | ||
+ | 调用show_userlist显示用户,deal_key接收按键,do_query执行。 | ||
+ | |||
+ | ; t_rusers | ||
+ | 调用t_users显示用户,显示真实用户名。 | ||
+ | |||
+ | ; choose [(int update, int defaultn, int (*title_show) (), int (*key_deal) (), int (*list_show) (), int (*read) (),int(*read2)())] | ||
+ | 显示、选择、执行函数。 | ||
+ | |||
+ | ; setlistrange [(int i)] | ||
+ | 设定显示范围。 | ||
+ | |||
+ | ; readuser [(int star, int curr)] | ||
+ | 调用display_userinfo显示/修改用户信息。 | ||
+ | |||
+ | |||
+ | === user_record相关 === | ||
+ | update_data [(void *data)] | ||
+ | ; swap_user_record | ||
+ | 交换user_record两项。 | ||
+ | |||
+ | ; sort_user_record | ||
+ | 排序user_record | ||
+ | |||
+ | ; full_utmp [(struct user_info *uentp, int *count)] | ||
+ | 填充user_record一项。 | ||
+ | |||
+ | ; fill_userlist | ||
+ | 调用full_utmp(),填充user_record | ||
+ | |||
+ | ; countusers [(struct userec *uentp, char *arg)] | ||
+ | ; allusers | ||
+ | 调用countusers()数用户数量。 |
2012年2月3日 (五) 00:25的最新版本
UI部分
入口函数:src/list.c deal_key()
逻辑部分
载入时间
见stack trace
#0 getfriendstr (user=0xf79fb884, puinfo=0xf6aa1fd8) at utmp.c:705
#1 0x080cf5f6 in u_enter () at newmain_single.c:184
#2 0x080d1087 in user_login () at newmain_single.c:892
#3 0x080d1916 in main_bbs (convit=0, argv=0xff9f4eea "/home/bbs/bin/sshbbsd") at newmain_single.c:1099
#4 0x0808953a in bbs_main (argv=0xff9f4eea "/home/bbs/bin/sshbbsd") at bbsd_single.c:626
#5 0x08089d82 in bbs_entry () at bbsd_single.c:1008
#6 0x0805c745 in do_exec_no_pty (command=0x0, pw=0x0, display=0x0, auth_proto=0x0, auth_data=0x0) at sshd.c:1792
#7 0x0805c625 in do_authenticated (pw=0x0) at sshd.c:1730
#8 0x0805c453 in do_authentication (user=0x8169ed0, privileged_port=0, cipher_type=3) at sshd.c:1634
#9 0x0805c111 in do_connection (privileged_port=0) at sshd.c:1473
#10 0x0805bd05 in main (ac=1, av=0xff9f2ed4) at sshd.c:1324
friends
// 部分
struct user_info { /* Structure used in UTMP file */
int active; /* When allocated this field is true */
int uid; /* Used to find user name in passwd file */
int pid; /* kill() to notify user of talk request */
// ...
int friendsnum;
int friends_uid[MAXFRIENDS];
#ifdef FRIEND_MULTI_GROUP
unsigned int friends_p[MAXFRIENDS];
#endif
// ...
};
struct user_info *user_record[USHM_SIZE];
// friends文件就是这个东西的一个数组
struct friends {
char id[13]; // 用户名
char exp[LEN_FRIEND_EXP]; // 昵称,默认为空
#ifdef FRIEND_MULTI_GROUP
int groupid;
#endif
};
struct friends_info {
char exp[LEN_FRIEND_EXP]; // 存储昵称用
};
struct friends_info* topfriend; // 存储了好友的昵称
// 次序按照用户名经过处理排序后的,对照userinfo.friends_uid
utmp.c
- cmpfuid [(const void*a,const void*b)]
- Friend.NCaseId()
- getfriendstr [(struct userec* user,struct user_info* puinfo)]
- User.GetFriends()
- myfriend [(int uid, char *fexp)]
- UserInfo.HasFriend()
- hisfriend [(int uid,struct user_info* him)]
- UserInfo.HasFriend()
list.c
TERM显示相关
- print_title
- print_title2
- print_user_info_title
- show_message [(char *msg)]
- pagerchar [(int usernum, struct user_info *user, int pager, int *isfriend)]
- msgchar [(struct user_info *uin, int *isfriend)]
- do_userlist
显示user list。
- show_userlist
显示user list。调用do_userlist。如果需要刷新则调用fill_userlist()。
- deal_key
- deal_key2
按键处理。
- printuent [(struct userec *uentp, char *arg)]
显示用户信息。
- Show_Users
调用printuent显示所有用户信息。
do_query [(int star, int curr)] do_query2 [(int star, int curr)]
- Users
初始化user_data,调Show_Users显示用户,deal_key2接收按键,do_query2执行。
- t_friends
调用show_userlist显示好友,deal_key接收按键,do_query执行。
- t_users
调用show_userlist显示用户,deal_key接收按键,do_query执行。
- t_rusers
调用t_users显示用户,显示真实用户名。
- choose [(int update, int defaultn, int (*title_show) (), int (*key_deal) (), int (*list_show) (), int (*read) (),int(*read2)())]
显示、选择、执行函数。
- setlistrange [(int i)]
设定显示范围。
- readuser [(int star, int curr)]
调用display_userinfo显示/修改用户信息。
user_record相关
update_data [(void *data)]
- swap_user_record
交换user_record两项。
- sort_user_record
排序user_record
- full_utmp [(struct user_info *uentp, int *count)]
填充user_record一项。
- fill_userlist
调用full_utmp(),填充user_record
- countusers [(struct userec *uentp, char *arg)]
- allusers
调用countusers()数用户数量。