diff options
-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; +} |