diff options
author | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-04-02 16:26:51 +0800 |
---|---|---|
committer | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-04-02 16:26:51 +0800 |
commit | 707e67e3a0b48a851669969bd1819eaf18f0262b (patch) | |
tree | 944dbbc5de5965a4a9f396835c0677601f4b890a | |
parent | 711021d57ac7ee0cf482edc43e3757f37200b87d (diff) | |
download | pttbbs-707e67e3a0b48a851669969bd1819eaf18f0262b.tar pttbbs-707e67e3a0b48a851669969bd1819eaf18f0262b.tar.gz pttbbs-707e67e3a0b48a851669969bd1819eaf18f0262b.tar.bz2 pttbbs-707e67e3a0b48a851669969bd1819eaf18f0262b.tar.lz pttbbs-707e67e3a0b48a851669969bd1819eaf18f0262b.tar.xz pttbbs-707e67e3a0b48a851669969bd1819eaf18f0262b.tar.zst pttbbs-707e67e3a0b48a851669969bd1819eaf18f0262b.zip |
commit utmpserver
git-svn-id: http://opensvn.csie.org/pttbbs/branches/outtacache@1680 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | cacheserver/Makefile | 11 | ||||
-rw-r--r-- | cacheserver/utmpserver.c | 86 |
2 files changed, 93 insertions, 4 deletions
diff --git a/cacheserver/Makefile b/cacheserver/Makefile index a3f14888..2427b610 100644 --- a/cacheserver/Makefile +++ b/cacheserver/Makefile @@ -1,13 +1,16 @@ # $Id$ .include "../pttbbs.mk" -all: cacheserver +all: cacheserver utmpserver cacheserver: cacheserver.c ${CC} ${CFLAGS} ${LDFLAGS} -o cacheserver cacheserver.c avltree.c +utmpserver: utmpserver.c + ${CC} ${CFLAGS} ${LDFLAGS} -o utmpserver utmpserver.c + clean: - rm -f cacheserver *~ + rm -f cacheserver utmpserver *~ -test: cacheserver - ./cacheserver -f /home/backup/ptt2/PASSWDS.NEW -p 5120 +test: utmpserver + ./utmpserver diff --git a/cacheserver/utmpserver.c b/cacheserver/utmpserver.c new file mode 100644 index 00000000..1f1dd11c --- /dev/null +++ b/cacheserver/utmpserver.c @@ -0,0 +1,86 @@ +/* $Id$ */ +#include "bbs.h" + +int tobind(int); +int toread(int fd, char *buf, int len); + +struct { + char userid[IDLEN + 1]; + short nFriends, nRejects; + int friend[MAX_FRIEND]; + int reject[MAX_REJECT] +} utmp[MAX_ACTIVE]; + +int main(int argc, char **argv) +{ + struct sockaddr_in clientaddr; + int ch, port = 5120, sfd, cfd, len, index, i; + char buf[2048]; + + while( (ch = getopt(argc, argv, "p:h")) != -1 ) + switch( ch ){ + case 'p': + port = atoi(port); + break; + + case 'h': + default: + fprintf(stderr, "usage: utmpserver [-p port]\n"); + return 1; + } + + if( (sfd = tobind(port)) < 0 ) + return 1; + + while( 1 ){ + if( (cfd = accept(sfd, (struct sockaddr *)&clientaddr, &len)) < 0 ){ + if( errno != EINTR ) + sleep(1); + continue; + } + 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)) && + 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; + close(cfd); + continue; + } + } + return 0; +} + +/* utils */ +int tobind(int port) +{ + int i, sockfd, val; + struct sockaddr_in servaddr; + + if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) + err(1, NULL); + setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, + (char *)&val, sizeof(val)); + bzero(&servaddr, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); + if( bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) + err(1, NULL); + if( listen(sockfd, 5) < 0 ) + err(1, NULL); + + return sockfd; +} + +int toread(int fd, char *buf, int len) +{ + int l; + for( l = 0 ; l < len ; l += read(fd, &buf[l], len - l) ) + ; + return len; +} |