diff options
author | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-04-02 17:04:07 +0800 |
---|---|---|
committer | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-04-02 17:04:07 +0800 |
commit | 300e4e2b21bf2ff69d02b18b38e85de37299279c (patch) | |
tree | 10213a282da892e39be793537c670669a6dd24cf | |
parent | 55869bf54864c9b7aebca3ca427e1e0b05c3ab48 (diff) | |
download | pttbbs-300e4e2b21bf2ff69d02b18b38e85de37299279c.tar pttbbs-300e4e2b21bf2ff69d02b18b38e85de37299279c.tar.gz pttbbs-300e4e2b21bf2ff69d02b18b38e85de37299279c.tar.bz2 pttbbs-300e4e2b21bf2ff69d02b18b38e85de37299279c.tar.lz pttbbs-300e4e2b21bf2ff69d02b18b38e85de37299279c.tar.xz pttbbs-300e4e2b21bf2ff69d02b18b38e85de37299279c.tar.zst pttbbs-300e4e2b21bf2ff69d02b18b38e85de37299279c.zip |
utmp sync and server
git-svn-id: http://opensvn.csie.org/pttbbs/branches/outtacache@1684 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | cacheserver/Makefile | 20 | ||||
-rw-r--r-- | cacheserver/utmpserver.c | 15 | ||||
-rw-r--r-- | cacheserver/utmpsync.c | 58 |
3 files changed, 82 insertions, 11 deletions
diff --git a/cacheserver/Makefile b/cacheserver/Makefile index 2427b610..fd2b08c7 100644 --- a/cacheserver/Makefile +++ b/cacheserver/Makefile @@ -1,16 +1,24 @@ # $Id$ .include "../pttbbs.mk" -all: cacheserver utmpserver +PROGRAMS= utmpserver utmpsync -cacheserver: cacheserver.c - ${CC} ${CFLAGS} ${LDFLAGS} -o cacheserver cacheserver.c avltree.c +all: ${PROGRAMS} -utmpserver: utmpserver.c - ${CC} ${CFLAGS} ${LDFLAGS} -o utmpserver utmpserver.c +#cacheserver: cacheserver.c +# ${CC} ${CFLAGS} ${LDFLAGS} -o cacheserver cacheserver.c avltree.c + +utmpsync: utmpsync.c + ${CC} ${CFLAGS} ${LDFLAGS} -DPTTBBS_UTIL -o utmpsync utmpsync.c \ + ../util/util_*.o + +.for fn in utmpsync utmpserver +${fn}: ${fn}.c + ${CC} ${CFLAGS} ${LDFLAGS} -o ${fn} ${fn}.c +.endfor clean: - rm -f cacheserver utmpserver *~ + rm -f *~ ${PROGRAMS} test: utmpserver ./utmpserver diff --git a/cacheserver/utmpserver.c b/cacheserver/utmpserver.c index dbbbb2bc..1414fae3 100644 --- a/cacheserver/utmpserver.c +++ b/cacheserver/utmpserver.c @@ -6,7 +6,7 @@ int tobind(int); int toread(int fd, void *buf, int len); struct { - char userid[IDLEN + 1]; + int uid; short nFriends, nRejects; int friend[MAX_FRIEND]; int reject[MAX_REJECT]; @@ -42,13 +42,13 @@ int main(int argc, char **argv) toread(cfd, &index, sizeof(index)); if( index == -1 ){ for( i = 0 ; i < MAX_ACTIVE ; ++i ) - if( toread(cfd, utmp[i].userid, sizeof(utmp[i].userid)) && + if( toread(cfd, &utmp[i].uid, sizeof(utmp[i].uid)) && toread(cfd, utmp[i].friend, sizeof(utmp[i].friend)) && toread(cfd, utmp[i].reject, sizeof(utmp[i].reject)) ) ; else for( ; i < MAX_ACTIVE ; ++i ) - utmp[i].userid[0] = 0; + utmp[i].uid = 0; close(cfd); continue; } @@ -81,7 +81,12 @@ int tobind(int port) int toread(int fd, void *buf, int len) { int l; - for( l = 0 ; l < len ; l += read(fd, buf + l, len - l) ) - ; + for( l = 0 ; len > 0 ; ) + if( (l = read(fd, buf, len)) < 0 ) + return -1; + else{ + buf += l; + len -= l; + } return len; } diff --git a/cacheserver/utmpsync.c b/cacheserver/utmpsync.c new file mode 100644 index 00000000..3d4de841 --- /dev/null +++ b/cacheserver/utmpsync.c @@ -0,0 +1,58 @@ +/* $Id$ */ +#include "bbs.h" +#include <err.h> + +extern SHM_t *SHM; +int towrite(int fd, void *buf, int len); +int toconnect(char *host, int port); + +int main(int argc, char **argv) +{ + int sfd, index, i; + attach_SHM(); + if( (sfd = toconnect(OUTTACACHEHOST, OUTTACACHEPORT)) < 0 ) + return 1; + + index = -1; + towrite(sfd, &index, sizeof(index)); + for( i = 0 ; i < MAX_ACTIVE ; ++i ) + if( !towrite(sfd, &SHM->uinfo[i].uid, sizeof(SHM->uinfo[i].uid)) || + !towrite(sfd, SHM->uinfo[i].friend, sizeof(SHM->uinfo[i].friend))|| + !towrite(sfd, SHM->uinfo[i].reject, sizeof(SHM->uinfo[i].reject))){ + fprintf(stderr, "sync error %d\n", i); + } + return 0; +} + +/* utils */ +int towrite(int fd, void *buf, int len) +{ + int l; + for( l = 0 ; len > 0 ; ) + if( (l = write(fd, buf, len)) < 0 ) + return -1; + else{ + buf += l; + len -= l; + } + return len; +} + +int toconnect(char *host, int port) +{ + int sock; + struct sockaddr_in serv_name; + if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ + perror("socket"); + return -1; + } + + serv_name.sin_family = AF_INET; + serv_name.sin_addr.s_addr = inet_addr(host); + serv_name.sin_port = htons(port); + if( connect(sock, (struct sockaddr*)&serv_name, sizeof(serv_name)) < 0 ){ + close(sock); + return -1; + } + return sock; +} |