summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-04-02 16:26:51 +0800
committerin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-04-02 16:26:51 +0800
commit707e67e3a0b48a851669969bd1819eaf18f0262b (patch)
tree944dbbc5de5965a4a9f396835c0677601f4b890a
parent711021d57ac7ee0cf482edc43e3757f37200b87d (diff)
downloadpttbbs-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/Makefile11
-rw-r--r--cacheserver/utmpserver.c86
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;
+}