summaryrefslogtreecommitdiffstats
path: root/cacheserver/utmpserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'cacheserver/utmpserver.c')
-rw-r--r--cacheserver/utmpserver.c88
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);
}