(→逻辑部分) |
|||
(未显示同一用户的3个中间版本) | |||
第1行: | 第1行: | ||
+ | [[Category:BBS 代码分析]] | ||
+ | |||
= UI部分 = | = UI部分 = | ||
第4行: | 第6行: | ||
= 逻辑部分 = | = 逻辑部分 = | ||
+ | == 载入时间 == | ||
+ | 见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 == | ||
第21行: | 第38行: | ||
// ... | // ... | ||
}; | }; | ||
+ | |||
+ | struct user_info *user_record[USHM_SIZE]; | ||
// friends文件就是这个东西的一个数组 | // friends文件就是这个东西的一个数组 | ||
第51行: | 第70行: | ||
; hisfriend [(int uid,struct user_info* him)] | ; hisfriend [(int uid,struct user_info* him)] | ||
* UserInfo.HasFriend() | * 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()数用户数量。