diff options
author | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-04-04 17:48:27 +0800 |
---|---|---|
committer | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-04-04 17:48:27 +0800 |
commit | 431ac04533837d4d6bf8d01314f5c3e794e4a2a6 (patch) | |
tree | ea809f1e6a3bfe56fbc4f25d732231e1a6377c81 /cacheserver/utmpserver.c | |
parent | 911a0f4f78bf10384e32bd96cc2a2742b7005d94 (diff) | |
download | pttbbs-outtacache.tar pttbbs-outtacache.tar.gz pttbbs-outtacache.tar.bz2 pttbbs-outtacache.tar.lz pttbbs-outtacache.tar.xz pttbbs-outtacache.tar.zst pttbbs-outtacache.zip |
completeouttacache
git-svn-id: http://opensvn.csie.org/pttbbs/branches/outtacache@1687 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'cacheserver/utmpserver.c')
-rw-r--r-- | cacheserver/utmpserver.c | 88 |
1 files changed, 78 insertions, 10 deletions
diff --git a/cacheserver/utmpserver.c b/cacheserver/utmpserver.c index 5826eb59..60cd02ad 100644 --- a/cacheserver/utmpserver.c +++ b/cacheserver/utmpserver.c @@ -4,12 +4,12 @@ struct { int uid; - short nFriends, nRejects; + int nFriends, nRejects; int friend[MAX_FRIEND]; int reject[MAX_REJECT]; -} utmp[MAX_ACTIVE]; +} utmp[USHM_SIZE]; -inline void countarray(int *s, int max) +inline int countarray(int *s, int max) { int i; for( i = 0 ; i < max && s[i] ; ++i ) @@ -17,6 +17,57 @@ inline void countarray(int *s, int max) return i; } +int +reverse_friend_stat(int stat) +{ + int stat1 = 0; + if (stat & IFH) + stat1 |= HFM; + if (stat & IRH) + stat1 |= HRM; + if (stat & HFM) + stat1 |= IFH; + if (stat & HRM) + stat1 |= IRH; + if (stat & IBH) + stat1 |= IBH; + return stat1; +} + +int set_friend_bit(int me, int ui) +{ + int hit = 0; + /* 判斷對方是否為我的朋友 ? */ + if( intbsearch(utmp[ui].uid, utmp[me].friend, utmp[me].nFriends) ) + hit = IFH; + + /* 判斷我是否為對方的朋友 ? */ + if( intbsearch(utmp[me].uid, utmp[ui].friend, utmp[ui].nFriends) ) + hit |= HFM; + + /* 判斷對方是否為我的仇人 ? */ + if( intbsearch(utmp[ui].uid, utmp[me].reject, utmp[me].nRejects) ) + hit |= IRH; + + /* 判斷我是否為對方的仇人 ? */ + if( intbsearch(utmp[me].uid, utmp[ui].reject, utmp[ui].nRejects) ) + hit |= HRM; + + return hit; +} + +void initdata(int index) +{ + utmp[index].nFriends = countarray(utmp[index].friend, MAX_FRIEND); + utmp[index].nRejects = countarray(utmp[index].reject, MAX_REJECT); + if( utmp[index].nFriends > 0 ) + qsort(utmp[index].friend, utmp[index].nFriends, + sizeof(int), qsort_intcompar); + if( utmp[index].nRejects > 0 ) + qsort(utmp[index].reject, utmp[index].nRejects, + sizeof(int), qsort_intcompar); +} + int main(int argc, char **argv) { struct sockaddr_in clientaddr; @@ -47,13 +98,15 @@ int main(int argc, char **argv) toread(cfd, &index, sizeof(index)); if( index == -1 ){ int nSynced = 0; - for( i = 0 ; i < MAX_ACTIVE ; ++i, ++nSynced ) + for( i = 0 ; i < USHM_SIZE ; ++i, ++nSynced ) if( toread(cfd, &utmp[i].uid, sizeof(utmp[i].uid)) > 0 && toread(cfd, utmp[i].friend, sizeof(utmp[i].friend)) > 0 && - toread(cfd, utmp[i].reject, sizeof(utmp[i].reject)) > 0 ) - ; + toread(cfd, utmp[i].reject, sizeof(utmp[i].reject)) > 0 ){ + if( utmp[i].uid ) + initdata(i); + } else - for( ; i < MAX_ACTIVE ; ++i ) + for( ; i < USHM_SIZE ; ++i ) utmp[i].uid = 0; close(cfd); fprintf(stderr, "%d users synced\n", nSynced); @@ -63,11 +116,26 @@ int main(int argc, char **argv) if( toread(cfd, &uid, sizeof(uid)) > 0 && toread(cfd, utmp[index].friend, sizeof(utmp[index].friend)) > 0 && toread(cfd, utmp[index].reject, sizeof(utmp[index].reject)) > 0 ){ - int nFriends = 0, frarray[MAX_FRIEND]; +#define MAX_FS (2 * MAX_FRIEND) + int iu, nFrs, stat, rstat; + ocfs_t fs[MAX_FS]; + utmp[index].uid = uid; - utmp[index].nFriends = countarray(utmp[index].friend, MAX_FRIEND); - utmp[index].nRejects = countarray(utmp[index].reject, MAX_REJECT); + initdata(index); + + for( nFrs = iu = 0 ; iu < USHM_SIZE && nFrs < MAX_FS ; ++iu ) + if( iu != index && utmp[iu].uid ){ + if( (stat = set_friend_bit(index, iu)) ){ + rstat = reverse_friend_stat(stat); + fs[nFrs].index = iu; + fs[nFrs].uid = utmp[iu].uid; + fs[nFrs].friendstat = (stat << 24) + iu; + fs[nFrs].rfriendstat = (rstat << 24) + index; + ++nFrs; + } + } + towrite(cfd, &fs, sizeof(ocfs_t) * nFrs); } close(cfd); } |