diff options
author | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2002-08-19 22:47:41 +0800 |
---|---|---|
committer | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2002-08-19 22:47:41 +0800 |
commit | 11c514e8ff96536fee3d2e7fea089cbe1dfbe350 (patch) | |
tree | 8d8a294c0eeecac720bcda2c3414fec6329e775d /mbbsd/cache.c | |
parent | ad652344be2baad5b929a1c53dfff0e28b3ee34f (diff) | |
download | pttbbs-11c514e8ff96536fee3d2e7fea089cbe1dfbe350.tar pttbbs-11c514e8ff96536fee3d2e7fea089cbe1dfbe350.tar.gz pttbbs-11c514e8ff96536fee3d2e7fea089cbe1dfbe350.tar.bz2 pttbbs-11c514e8ff96536fee3d2e7fea089cbe1dfbe350.tar.lz pttbbs-11c514e8ff96536fee3d2e7fea089cbe1dfbe350.tar.xz pttbbs-11c514e8ff96536fee3d2e7fea089cbe1dfbe350.tar.zst pttbbs-11c514e8ff96536fee3d2e7fea089cbe1dfbe350.zip |
cache server2
git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk/pttbbs@477 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/cache.c')
-rw-r--r-- | mbbsd/cache.c | 105 |
1 files changed, 85 insertions, 20 deletions
diff --git a/mbbsd/cache.c b/mbbsd/cache.c index 27202de7..c824b4f6 100644 --- a/mbbsd/cache.c +++ b/mbbsd/cache.c @@ -1,4 +1,4 @@ -/* $Id: cache.c,v 1.47 2002/08/07 09:32:38 in2 Exp $ */ +/* $Id: cache.c,v 1.48 2002/08/19 14:47:41 in2 Exp $ */ #include "bbs.h" #ifndef __FreeBSD__ @@ -1131,35 +1131,100 @@ mdcacheopen(char *fpath) #endif #ifdef OUTTA_CACHE -void outta_swapout(void **ptr, int length, char cacheid) +#include <err.h> +static ssize_t Read(int fd, void *BUF, size_t nbytes) { - char fn[64]; + char *buf = (char *)BUF; + ssize_t thisgot, totalgot = nbytes; + while( nbytes > 0 ){ + if( (thisgot = read(fd, buf, nbytes)) <= 0 ) + err(1, "read from socket: "); + nbytes -= thisgot; + buf += thisgot; + } + return totalgot; +} + +static ssize_t Write(int fd, void *BUF, size_t nbytes) +{ + char *buf = (char *)BUF; + ssize_t thisgot, totalgot = nbytes; + while( nbytes > 0 ){ + if( (thisgot = write(fd, buf, nbytes)) <= 0 ) + err(1, "read from socket: "); + nbytes -= thisgot; + buf += thisgot; + } + return totalgot; +} + +int connectserver(char *host, int port) +{ + struct sockaddr_in servaddr; int fd; + + if( (fd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) + err(1, "socket"); + bzero(&servaddr, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + inet_pton(AF_INET, host, &servaddr.sin_addr); + servaddr.sin_port = htons(port); + if( connect(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) + err(1, "connect"); + return fd; +} + +void *outta_malloc(size_t size, char id) +{ + OCbuf_t *ptr = (OCbuf_t *)malloc(OC_HEADERLEN + size); #ifdef DEBUG - vmsg("swap out (%c) %d bytes", cacheid, length); + vmsg("outta_malloc(%d, %c)", size, id); #endif - sprintf(fn, "cache/" MYHOSTNAME "%c%d", cacheid, currpid); - if( (fd = open(fn, O_WRONLY | O_CREAT, 0600)) < 0 ) - abort_bbs(0); - write(fd, *ptr, length); + ptr->key.pid = getpid(); + ptr->key.cacheid = id; + ptr->length = size; + return ptr->buf; +} + +void outta_swapout(void **inptr) +{ + OCbuf_t *ptr = (OCbuf_t *)(*inptr - OC_HEADERLEN); + int fd, len; + fd = connectserver("10.2.1.2", 1477); + len = ptr->length + OC_HEADERLEN; +#ifdef DEBUG + vmsg("outta_swapout(%d)", len); +#endif + Write(fd, &len, sizeof(len)); + Write(fd, ptr, len); close(fd); - free(*ptr); - *ptr = NULL; + free(ptr); + *inptr = NULL; } -void outta_swapin(void **ptr, int length, char cacheid) +void *outta_swapin(void **inptr, char cacheid) { - char fn[64]; - int fd; + char buf[OC_HEADERLEN]; + OCbuf_t *ptr = (OCbuf_t *)buf; + int fd, len; + + fd = connectserver("10.2.1.2", 1477); + ptr->key.pid = getpid() + OC_pidadd; + ptr->key.cacheid = cacheid; + ptr->length = 0; + len = OC_HEADERLEN; + Write(fd, &len, sizeof(len)); + Write(fd, ptr, OC_HEADERLEN); + + Read(fd, &len, sizeof(len)); #ifdef DEBUG - vmsg("swap in (%c) %d bytes", cacheid, length); + vmsg("outta_swapin(%d)", len); #endif - sprintf(fn, "cache/" MYHOSTNAME "%c%d", cacheid, currpid); - if( (fd = open(fn, O_RDONLY)) < 0 ) - abort_bbs(0); - *ptr = (void *)malloc(length); - read(fd, *ptr, length); + ptr = (OCbuf_t *)malloc(len); + Read(fd, ptr, len); close(fd); - unlink(fn); + + return (*inptr = ptr->buf); } + #endif |