(以内容“== 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_group {
 
    char name[15];
 
    unsigned int p;
 
    char f;
 
    char b;
 
 
};
 
};
 +
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()数用户数量。