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()数用户数量。