summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-04-02 17:04:07 +0800
committerin2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-04-02 17:04:07 +0800
commit300e4e2b21bf2ff69d02b18b38e85de37299279c (patch)
tree10213a282da892e39be793537c670669a6dd24cf
parent55869bf54864c9b7aebca3ca427e1e0b05c3ab48 (diff)
downloadpttbbs-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/Makefile20
-rw-r--r--cacheserver/utmpserver.c15
-rw-r--r--cacheserver/utmpsync.c58
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;
+}