summaryrefslogtreecommitdiffstats
path: root/cacheserver
diff options
context:
space:
mode:
authorin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-04-04 17:48:27 +0800
committerin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-04-04 17:48:27 +0800
commit431ac04533837d4d6bf8d01314f5c3e794e4a2a6 (patch)
treeea809f1e6a3bfe56fbc4f25d732231e1a6377c81 /cacheserver
parent911a0f4f78bf10384e32bd96cc2a2742b7005d94 (diff)
downloadpttbbs-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')
-rw-r--r--cacheserver/Makefile6
-rw-r--r--cacheserver/cacheserver.c106
-rw-r--r--cacheserver/utmpserver.c88
-rw-r--r--cacheserver/utmpsync.c2
4 files changed, 79 insertions, 123 deletions
diff --git a/cacheserver/Makefile b/cacheserver/Makefile
index 2c4f46e5..42b077b4 100644
--- a/cacheserver/Makefile
+++ b/cacheserver/Makefile
@@ -5,9 +5,6 @@ PROGRAMS= utmpserver utmpsync
all: ${PROGRAMS}
-#cacheserver: cacheserver.c
-# ${CC} ${CFLAGS} ${LDFLAGS} -o cacheserver cacheserver.c avltree.c
-
.for fn in ${PROGRAMS}
${fn}: ${fn}.c
${CC} ${CFLAGS} ${LDFLAGS} -DPTTBBS_UTIL -o ${fn} ${fn}.c ../util/util_*.o
@@ -15,6 +12,3 @@ ${fn}: ${fn}.c
clean:
rm -f *~ ${PROGRAMS}
-
-test: utmpserver
- ./utmpserver
diff --git a/cacheserver/cacheserver.c b/cacheserver/cacheserver.c
deleted file mode 100644
index 05b454c0..00000000
--- a/cacheserver/cacheserver.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/* $Id$ */
-#include "bbs.h"
-#include <avltree.h>
-#include <err.h>
-
-AVL_IX_DESC avl;
-
-typedef struct {
- int uid;
- unsigned int count;
- char key[IDLEN + 1];
-} rectype_t;
-
-void usage(void)
-{
- fprintf(stderr, "usage: cacheserver -f PASSWD -p port\n");
-}
-
-int loadpasswd(char *pfn)
-{
- int fd, i, nUsers = 0;
- userec_t u;
- rectype_t rec;
-
- if( pfn == NULL ){
- fprintf(stderr, "no password file!\n");
- return -1;
- }
- if( (fd = open(pfn, O_RDONLY)) < 0 ){
- perror("open password");
- return -1;
- }
-
- avl_create_index(&avl, AVL_NO_DUP_KEYS, IDLEN + 1);
-
- for( i = 0 ; read(fd, &u, sizeof(u)) == sizeof(u) ; ++i )
- if( u.userid[0] ){
- ++nUsers;
- rec.uid = i;
- rec.count = 0;
- strlcpy(rec.key, u.userid, sizeof(rec.key));
- avl_add_key((AVL_IX_REC*)&rec, &avl);
- }
- fprintf(stderr, "%d users added\n", nUsers);
-
-#if 0
- rec.uid = 0;
- rec.count = 0;
- strcpy(rec.key, "KTDOG");
- avl_find_key((AVL_IX_REC*)&rec, &avl);
- printf("%d\n", rec.uid);
-#endif
- return 0;
-}
-
-int service(int sfd)
-{
- int cfd, len, size;
- struct sockaddr_in clientaddr;
-
- char buf[10240];
- while( 1 ){
- if( (cfd = accept(sfd, (struct sockaddr *)&clientaddr, &len)) < 0 ){
- if( errno != EINTR )
- sleep(1);
- continue;
- }
-
- read(cfd, &size, sizeof(size));
- for( len = 0 ; len < size ;
- len += read(cfd, &buf[len], sizeof(buf) - len) )
- ;
- printf("total %d bytes\n", len);
- close(cfd);
- }
-}
-
-int main(int argc, char **argv)
-{
- int ch, port = 0, sfd;
- char *pfn = NULL;
- while( (ch = getopt(argc, argv, "f:p:h")) != -1 )
- switch( ch ){
- case 'f':
- pfn = strdup(optarg);
- break;
-
- case 'p':
- port = atoi(optarg);
- break;
-
- case 'h':
- default:
- usage();
- return 1;
- }
-
- if( (sfd = tobind(port)) < 0 )
- return 1;
-
- if( loadpasswd(pfn) < 0 )
- return 1;
-
- service(sfd);
- return 0;
-}
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);
}
diff --git a/cacheserver/utmpsync.c b/cacheserver/utmpsync.c
index bebde137..13ffcf4e 100644
--- a/cacheserver/utmpsync.c
+++ b/cacheserver/utmpsync.c
@@ -15,7 +15,7 @@ int main(int argc, char **argv)
index = -1;
towrite(sfd, &index, sizeof(index));
- for( i = 0 ; i < MAX_ACTIVE ; ++i )
+ for( i = 0 ; i < USHM_SIZE ; ++i )
if( towrite(sfd, &SHM->uinfo[i].uid, sizeof(SHM->uinfo[i].uid)) < 0 ||
towrite(sfd, SHM->uinfo[i].friend,
sizeof(SHM->uinfo[i].friend)) < 0 ||