summaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/Makefile2
-rw-r--r--web/mod_ptt.c94
-rw-r--r--web/mod_ptt.h6
-rwxr-xr-xweb/util_cache.c520
-rwxr-xr-xweb/util_passwd.c141
-rwxr-xr-xweb/util_record.c246
6 files changed, 15 insertions, 994 deletions
diff --git a/web/Makefile b/web/Makefile
index 42a1a84a..095610b3 100644
--- a/web/Makefile
+++ b/web/Makefile
@@ -1,5 +1,5 @@
all: mod_ptt.c mod_ptt.h
- apxs -I ../include -c mod_ptt.c util_cache.c util_passwd.c util_record.c
+ apxs -I ../include -c mod_ptt.c ../util/util_cache.c ../util/util_passwd.c ../util/util_record.c
cp mod_ptt.so /usr/local/libexec/apache/mod_ptt.so
chmod 775 /usr/local/libexec/apache/mod_ptt.so
clean:
diff --git a/web/mod_ptt.c b/web/mod_ptt.c
index be4a8071..ee32ede4 100644
--- a/web/mod_ptt.c
+++ b/web/mod_ptt.c
@@ -20,6 +20,7 @@ static table *static_calls_made = NULL;
static pool *ptt_pool = NULL;
static pool *ptt_subpool = NULL;
+
module MODULE_VAR_EXPORT ptt_module;
excfg * our_dconfig(request_rec *r)
{
@@ -29,16 +30,9 @@ excfg * our_dconfig(request_rec *r)
static void setup_module_cells()
{
- /*
- * If we haven't already allocated our module-private pool, do so now.
- */
if (ptt_pool == NULL) {
ptt_pool = ap_make_sub_pool(NULL);
};
- /*
- * Likewise for the table of routine/environment pairs we visit outside of
- * request context.
- */
if (static_calls_made == NULL) {
static_calls_made = ap_make_table(ptt_pool, 16);
};
@@ -51,34 +45,18 @@ static int ptt_handler(request_rec *r)
int i;
excfg *dcfg;
+
dcfg = our_dconfig(r);
- //resolve_utmp();
- //resolve_boards();
- // resolve_garbage();
- // resolve_fcache();
r->content_type = "text/html";
-
ap_soft_timeout("send ptt call trace", r);
ap_send_http_header(r);
-#ifdef CHARSET_EBCDIC
- /* Server-generated response, converted */
- ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, r->ebcdic.conv_out = 1);
-#endif
- /*
- * If we're only supposed to send header information (HEAD request), we're
- * already there.
- */
if (r->header_only) {
ap_kill_timeout(r);
return OK;
}
- /*
- * Now send our actual output. Since we tagged this as being
- * "text/html", we need to embed any HTML.
- */
ap_rputs(" ptt3 <P>\n", r);
ap_rprintf(r, " Apache HTTP Server version: \"%s\"\n",
@@ -92,79 +70,33 @@ static int ptt_handler(request_rec *r)
ap_rprintf(r,"r->unparsed_uri : %s <br>",r->unparsed_uri);
ap_rprintf(r,"r->handler : %s <br>",r->handler);
ap_rprintf(r,"r->content_type : %s <br>",r->content_type);
- ap_rprintf(r, " Server built: \"%s\"\n", ap_get_server_built());
- for(i = 0; i++ < numboards; i++)
- ap_rprintf(r,"%s %s<br>",bcache[i].brdname,bcache[i].title);
- /*
- * We're all done, so cancel the timeout we set. Since this is probably
- * the end of the request we *could* assume this would be done during
- * post-processing - but it's possible that another handler might be
- * called and inherit our outstanding timer. Not good; to each its own.
- */
+
+ ap_rprintf(r, " Server built: \"%s\"<br>", ap_get_server_built());
+ ap_rprintf(r, " numboards: \"%d\"<br>", numboards);
+
+ for(i = 0; i < 10; i++)
+ ap_rprintf(r,"%d. %s %s<br>",i,bcache[i].brdname,bcache[i].title);
+
+ // for(i = 0; i < 10 /*numboards*/; i++)
+ // ap_rprintf(r,"%s %s<br>",bcache[i].brdname,bcache[i].title);
ap_kill_timeout(r);
- /*
- * We did what we wanted to do, so tell the rest of the server we
- * succeeded.
- */
return OK;
}
-/*--------------------------------------------------------------------------*/
-/* */
-/* Now let's declare routines for each of the callback phase in order. */
-/* (That's the order in which they're listed in the callback list, *not */
-/* the order in which the server calls them! See the command_rec */
-/* declaration near the bottom of this file.) Note that these may be */
-/* called for situations that don't relate primarily to our function - in */
-/* other words, the fixup handler shouldn't assume that the request has */
-/* to do with "example" stuff. */
-/* */
-/* With the exception of the content handler, all of our routines will be */
-/* called for each request, unless an earlier handler from another module */
-/* aborted the sequence. */
-/* */
-/* Handlers that are declared as "int" can return the following: */
-/* */
/* OK Handler accepted the request and did its thing with it. */
/* DECLINED Handler took no action. */
/* HTTP_mumble Handler looked at request and found it wanting. */
-/* */
-/* What the server does after calling a module handler depends upon the */
-/* handler's return value. In all cases, if the handler returns */
-/* DECLINED, the server will continue to the next module with an handler */
-/* for the current phase. However, if the handler return a non-OK, */
-/* non-DECLINED status, the server aborts the request right there. If */
-/* the handler returns OK, the server's next action is phase-specific; */
-/* see the individual handler comments below for details. */
-/* */
-/*--------------------------------------------------------------------------*/
-/*
- * This function is called during server initialisation. Any information
- * that needs to be recorded must be in static cells, since there's no
- * configuration record.
- *
- * There is no return value.
- */
static void ptt_child_init(server_rec *s, pool *p)
{
char *note;
char *sname = s->server_hostname;
+ attach_SHM();
+
- //resolve_utmp();
- //resolve_boards();
- //resolve_garbage();
- //resolve_fcache();
- /*
- * Set up any module cells that ought to be initialised.
- */
setup_module_cells();
- /*
- * The arbitrary text we add to our trace entry indicates for which server
- * we're being called.
- */
sname = (sname != NULL) ? sname : "";
note = ap_pstrcat(p, "ptt_child_init(", sname, ")", NULL);
}
diff --git a/web/mod_ptt.h b/web/mod_ptt.h
index 2d7946b9..125046d6 100644
--- a/web/mod_ptt.h
+++ b/web/mod_ptt.h
@@ -5,11 +5,7 @@
#include "http_main.h"
#include "http_protocol.h"
#include "util_script.h"
-#include "config.h"
-#include "pttstruct.h"
-#include "modes.h"
-#include "common.h"
-#include "proto.h"
+#include "bbs.h"
#include <stdio.h>
diff --git a/web/util_cache.c b/web/util_cache.c
deleted file mode 100755
index 7bfb67cc..00000000
--- a/web/util_cache.c
+++ /dev/null
@@ -1,520 +0,0 @@
-/* $Id: util_cache.c,v 1.2 2003/03/24 20:44:09 ptt Exp $ */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <errno.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/sem.h>
-
-#ifdef __FreeBSD__
-#include <machine/param.h>
-#endif
-
-#include "config.h"
-#include "pttstruct.h"
-#include "common.h"
-#include "perm.h"
-#include "modes.h"
-#include "proto.h"
-
-/* the reason for "safe_sleep" is that we may call sleep during
- SIGALRM handler routine, while SIGALRM is blocked.
- if we use the original sleep, we'll never wake up. */
-unsigned int safe_sleep(unsigned int seconds) {
- /* jochang sleep有問題時用*/
- sigset_t set,oldset;
-
- sigemptyset(&set);
- sigprocmask(SIG_BLOCK, &set, &oldset);
- if(sigismember(&oldset, SIGALRM)) {
- unsigned long retv;
- sigemptyset(&set);
- sigaddset(&set,SIGALRM);
- sigprocmask(SIG_UNBLOCK,&set,NULL);
- retv=sleep(seconds);
- sigprocmask(SIG_BLOCK,&set,NULL);
- return retv;
- }
- return sleep(seconds);
-}
-
-void setapath(char *buf, char *boardname) {
- sprintf(buf, "man/boards/%c/%s", boardname[0], boardname);
-}
-
-static char *str_dotdir = ".DIR";
-
-void setadir(char *buf, char *path) {
- sprintf(buf, "%s/%s", path, str_dotdir);
-}
-
-static void attach_err(int shmkey, char *name) {
- fprintf(stderr, "[%s error] key = %x\n", name, shmkey);
- fprintf(stderr, "errno = %d: %s\n", errno, strerror(errno));
- exit(1);
-}
-
-void *attach_shm(int shmkey, int shmsize) {
- void *shmptr;
- int shmid;
-
- char *empty_addr;
- /* set up one page in-accessible -- jochang */
- {
- int fd = open("/dev/zero",O_RDONLY);
- int size = ((shmsize + 4095) / 4096) * 4096;
-
- munmap(
- (empty_addr=mmap(0,4096+size,PROT_NONE,MAP_PRIVATE,fd,0))+4096
- ,size);
-
- close(fd);
- }
-
- shmid = shmget(shmkey, shmsize, 0);
- if(shmid < 0) {
- shmid = shmget(shmkey, shmsize, IPC_CREAT | 0600);
- if(shmid < 0)
- attach_err(shmkey, "shmget");
- shmptr = (void *)shmat(shmid, NULL, 0);
- if(shmptr == (void *)-1)
- attach_err(shmkey, "shmat");
- } else {
- shmptr = (void *)shmat(shmid, NULL, 0);
- if(shmptr == (void *)-1)
- attach_err(shmkey, "shmat");
- }
-
- /* unmap the page -- jochang */
- {
- munmap(empty_addr,4096);
- }
- return shmptr;
-}
-
-#ifndef __FreeBSD__
-/* according to X/OPEN we have to define it ourselves */
-union semun {
- int val; /* value for SETVAL */
- struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
- unsigned short int *array; /* array for GETALL, SETALL */
- struct seminfo *__buf; /* buffer for IPC_INFO */
-};
-#endif
-
-#define SEM_FLG 0600 /* semaphore mode */
-
-/* ----------------------------------------------------- */
-/* semaphore : for critical section */
-/* ----------------------------------------------------- */
-void sem_init(int semkey,int *semid) {
- union semun s;
-
- s.val=1;
- *semid = semget(semkey, 1, 0);
- if(*semid == -1) {
- *semid = semget(semkey, 1, IPC_CREAT | SEM_FLG);
- if(*semid == -1)
- attach_err(semkey, "semget");
- semctl(*semid, 0, SETVAL, s);
- }
-}
-
-void sem_lock(int op,int semid) {
- struct sembuf sops;
-
- sops.sem_num = 0;
- sops.sem_flg = SEM_UNDO;
- sops.sem_op = op;
- semop(semid, &sops, 1);
-}
-
-SHM_t *SHM;
-int *GLOBALVAR;
-boardheader_t *bcache;
-int numboards = -1;
-
-void attach_SHM(void)
-{
- SHM = attach_shm(SHM_KEY, sizeof(SHM_t));
- if( !SHM->loaded ) /* (uhash) assume fresh shared memory is zeroed */
- exit(1);
- if( SHM->Btouchtime == 0 )
- SHM->Btouchtime = 1;
- bcache = SHM->bcache;
-
- GLOBALVAR = SHM->GLOBALVAR;
- if( SHM->Ptouchtime == 0 )
- SHM->Ptouchtime = 1;
-
- if( SHM->Ftouchtime == 0 )
- SHM->Ftouchtime = 1;
-
- bcache = SHM->bcache;
- numboards = SHM->Bnumber;
-}
-
-int setumoney(int uid, int money) {
- SHM->money[uid-1]=money;
- passwd_update_money(uid);
- return SHM->money[uid-1];
-}
-
-int deumoney(int uid, int money) {
- if(money<0 && SHM->money[uid-1]<-money)
- return setumoney(uid,0);
- else
- return setumoney(uid,SHM->money[uid-1]+money);
-}
-int moneyof(int uid){ /* ptt 改進金錢處理效率 */
- return SHM->money[uid-1];
-}
-
-static unsigned string_hash(unsigned char *s) {
- unsigned int v=0;
- while(*s) {
- v = (v << 8) | (v >> 24);
- v ^= toupper(*s++); /* note this is case insensitive */
- }
- return (v * 2654435769UL) >> (32 - HASH_BITS);
-}
-
-void add_to_uhash(int n, char *id) {
- int *p, h = string_hash(id);
- strcpy(SHM->userid[n], id);
-
- p = &(SHM->hash_head[h]);
-
- while(*p != -1)
- p = &(SHM->next_in_hash[*p]);
-
- SHM->next_in_hash[*p = n] = -1;
-}
-
-/* note: after remove_from_uhash(), you should add_to_uhash()
- (likely with a different name) */
-void remove_from_uhash(int n) {
- int h = string_hash(SHM->userid[n]);
- int *p = &(SHM->hash_head[h]);
-
- while(*p != -1 && *p != n)
- p = &(SHM->next_in_hash[*p]);
- if(*p == n)
- *p = SHM->next_in_hash[n];
-}
-
-int searchuser(char *userid) {
- int h,p;
-
- if(SHM == NULL)
- attach_SHM(); /* for sloopy util programs */
-
- h = string_hash(userid);
- p = SHM->hash_head[h];
-
- while(p != -1) {
- if(strcasecmp(SHM->userid[p],userid) == 0) {
- strcpy(userid,SHM->userid[p]);
- return p + 1;
- }
- p = SHM->next_in_hash[p];
- }
- return 0;
-}
-userec_t xuser;
-
-int getuser(char *userid) {
- int uid;
- if((uid = searchuser(userid)))
- passwd_query(uid, &xuser);
- return uid;
-}
-
-void setuserid(int num, char *userid) {
- if(num > 0 && num <= MAX_USERS) {
- if(num > SHM->number)
- SHM->number = num;
- else
- remove_from_uhash(num-1);
- add_to_uhash(num-1,userid);
- }
-}
-
-/*-------------------------------------------------------*/
-/* .UTMP cache */
-/*-------------------------------------------------------*/
-void resolve_utmp() {
- if(SHM == NULL) {
- attach_SHM();
- if(SHM->UTMPuptime == 0)
- SHM->UTMPuptime = SHM->UTMPnumber = 1;
- }
-}
-
-userinfo_t *currutmp = NULL;
-
-void getnewutmpent(userinfo_t *up) {
- extern int errno;
- register int i;
- register userinfo_t *uentp;
-
- resolve_utmp();
-
- for(i = 0; i < USHM_SIZE; i++) {
- uentp = &(SHM->uinfo[i]);
- if(!(uentp->pid)) {
- memcpy(uentp, up, sizeof(userinfo_t));
- currutmp = uentp;
- SHM->number++;
- return;
- }
- }
- exit(1);
-}
-
-int apply_ulist(int (*fptr)(userinfo_t *)) {
- register userinfo_t *uentp;
- register int i, state;
-
- resolve_utmp();
- for(i = 0; i < USHM_SIZE; i++) {
- uentp = &(SHM->uinfo[i]);
- if(uentp->pid && (PERM_HIDE(currutmp) || !PERM_HIDE(uentp)))
- if((state = (*fptr) (uentp)))
- return state;
- }
- return 0;
-}
-
-userinfo_t *search_ulist(int uid) {
- register int i;
- register userinfo_t *uentp;
-
- resolve_utmp();
- for(i = 0; i < USHM_SIZE; i++) {
- uentp = &(SHM->uinfo[i]);
- if(uid==uentp->uid)
- return uentp;
- }
- return 0;
-}
-
-/*-------------------------------------------------------*/
-/* .BOARDS cache */
-/*-------------------------------------------------------*/
-char *fn_board=BBSHOME"/"FN_BOARD;
-static void reload_bcache() {
- if(SHM->Bbusystate) {
- safe_sleep(1);
- }
- else{
- puts("bcache is not loaded? resolve_boards() fail");
- exit(1);
- }
-}
-
-void resolve_boards() {
- if(SHM == NULL) {
- attach_SHM();
- if(SHM->Btouchtime == 0)
- SHM->Btouchtime = 1;
- }
-
- while(SHM->Buptime < SHM->Btouchtime)
- reload_bcache();
- numboards = SHM->Bnumber;
-}
-
-void touch_boards() {
- time(&(SHM->Btouchtime));
- numboards = -1;
- resolve_boards();
-}
-void reset_board(int bid)
-{
- int fd;
- boardheader_t bh;
- if(--bid<0)return;
- if(SHM->Bbusystate==0)
- {
- SHM->Bbusystate = 1;
- if((fd = open(fn_board, O_RDONLY)) > 0) {
- lseek(fd, (off_t)(bid * sizeof(boardheader_t)), SEEK_SET);
- read(fd, &bh , sizeof(boardheader_t));
- close(fd);
- if(bh.brdname[0] && !strcmp(bh.brdname,bcache[bid].brdname))
- memcpy(&bcache[bid],&bh, sizeof(boardheader_t));
- }
- SHM->Bbusystate = 0;
- }
-}
-boardheader_t *getbcache(int bid) { /* Ptt改寫 */
- return bcache + bid - 1;
-}
-
-void touchbtotal(int bid) {
- SHM->total[bid - 1] = 0;
- SHM->lastposttime[bid - 1] = 0;
-}
-
-
-int getbnum(char *bname) {
- register int i;
- register boardheader_t *bhdr;
-
- for(i = 0, bhdr = bcache; i++ < numboards; bhdr++)
- if(
- !strcasecmp(bname, bhdr->brdname))
- return i;
- return 0;
-}
-
-/*-------------------------------------------------------*/
-/* PTT cache */
-/*-------------------------------------------------------*/
-/* cachefor 動態看版 */
-void reload_pttcache(void)
-{
- if(SHM->Pbusystate)
- safe_sleep(1);
- else { /* jochang: temporary workaround */
- fileheader_t item, subitem;
- char pbuf[256], buf[256], *chr;
- FILE *fp, *fp1, *fp2;
- int id, section = 0;
-
- SHM->Pbusystate = 1;
- SHM->max_film = 0;
- bzero(SHM->notes, sizeof SHM->notes);
- setapath(pbuf, "Note");
- setadir(buf, pbuf);
- id = 0;
- if((fp = fopen(buf, "r"))) {
- while(fread(&item, sizeof(item), 1, fp)) {
- if(item.title[3]=='<' && item.title[8]=='>') {
- sprintf(buf,"%s/%s", pbuf, item.filename);
- setadir(buf, buf);
- if(!(fp1 = fopen(buf, "r")))
- continue;
- SHM->next_refresh[section] = SHM->n_notes[section] = id;
- section ++;
- while(fread(&subitem, sizeof(subitem), 1, fp1)) {
- sprintf(buf,"%s/%s/%s", pbuf, item.filename ,
- subitem.filename);
- if(!(fp2=fopen(buf,"r")))
- continue;
- fread(SHM->notes[id],sizeof(char), 200*11, fp2);
- SHM->notes[id][200*11 - 1]=0;
- id++;
- fclose(fp2);
- if(id >= MAX_MOVIE)
- break;
- }
- fclose(fp1);
- if(id >= MAX_MOVIE || section >= MAX_MOVIE_SECTION)
- break;
- }
- }
- fclose(fp);
- }
- SHM->next_refresh[section] = -1;
- SHM->n_notes[section] = SHM->max_film = id-1;
- SHM->max_history = SHM->max_film - 2;
- if(SHM->max_history > MAX_HISTORY - 1)
- SHM->max_history = MAX_HISTORY - 1;
- if(SHM->max_history <0) SHM->max_history=0;
-
- fp = fopen("etc/today_is","r");
- if(fp) {
- fgets(SHM->today_is,15,fp);
- if((chr = strchr(SHM->today_is,'\n')))
- *chr = 0;
- SHM->today_is[15] = 0;
- fclose(fp);
- }
-
- /* 等所有資料更新後再設定 uptime */
-
- SHM->Puptime = SHM->Ptouchtime ;
- SHM->Pbusystate = 0;
- }
-}
-
-void resolve_garbage() {
- int count=0;
-
- if(SHM == NULL) {
- attach_SHM();
- if(SHM->Ptouchtime == 0)
- SHM->Ptouchtime = 1;
- }
- while(SHM->Puptime < SHM->Ptouchtime) { /* 不用while等 */
- reload_pttcache();
- if(count ++ > 10 && SHM->Pbusystate) {
-/* Ptt: 這邊會有問題 load超過10 秒會所有進loop的process都讓 busystate = 0
- 這樣會所有prcosee都會在load 動態看板 會造成load大增
- 但沒有用這個function的話 萬一load passwd檔的process死了 又沒有人把他
- 解開 同樣的問題發生在reload passwd
-*/
- SHM->Pbusystate = 0;
- }
- }
-}
-
-/*-------------------------------------------------------*/
-/* PTT's cache */
-/*-------------------------------------------------------*/
-/* cachefor from host 與最多上線人數 */
-static void reload_fcache() {
- if(SHM->Fbusystate)
- safe_sleep(1);
- else {
- FILE *fp;
-
- SHM->Fbusystate = 1;
- bzero(SHM->domain, sizeof SHM->domain);
- if((fp = fopen("etc/domain_name_query","r"))) {
- char buf[101],*po;
-
- SHM->top=0;
- while(fgets(buf,100,fp)) {
- if(buf[0] && buf[0] != '#' && buf[0] != ' ' &&
- buf[0] != '\n') {
- sscanf(buf,"%s",SHM->domain[SHM->top]);
- po = buf + strlen(SHM->domain[SHM->top]);
- while(*po == ' ')
- po++;
- strncpy(SHM->replace[SHM->top],po,49);
- SHM->replace[SHM->top]
- [strlen(SHM->replace[SHM->top])-1] = 0;
- (SHM->top)++;
- }
- }
- }
-
- SHM->max_user=0;
-
- /* 等所有資料更新後再設定 uptime */
- SHM->Fuptime = SHM->Ftouchtime;
- SHM->Fbusystate = 0;
- }
-}
-
-void resolve_fcache() {
- if(SHM == NULL) {
- attach_SHM();
- if(SHM->Ftouchtime == 0)
- SHM->Ftouchtime = 1;
- }
- while(SHM->Fuptime < SHM->Ftouchtime)
- reload_fcache();
-}
diff --git a/web/util_passwd.c b/web/util_passwd.c
deleted file mode 100755
index 6fa94302..00000000
--- a/web/util_passwd.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/* $Id: util_passwd.c,v 1.2 2003/03/24 20:44:09 ptt Exp $ */
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <sys/ipc.h>
-#include <sys/sem.h>
-#include "config.h"
-#include "pttstruct.h"
-#include "modes.h"
-#include "common.h"
-#include "proto.h"
-
-#ifndef SEM_R
-#define SEM_R 0400
-#endif
-
-#ifndef SEM_A
-#define SEM_A 0200
-#endif
-
-#ifndef __FreeBSD__
-union semun {
- int val; /* value for SETVAL */
- struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
- u_short *array; /* array for GETALL & SETALL */
- struct seminfo *__buf; /* buffer for IPC_INFO */
-};
-#endif
-
-static userec_t *passwd_image = NULL;
-static int passwd_image_size;
-static int semid = -1;
-
-int passwd_mmap(void) {
- int fd;
-
- if(passwd_image!=NULL) return 0;
- fd = open(FN_PASSWD, O_RDWR);
- if(fd > 0) {
- struct stat st;
-
- fstat(fd, &st);
- passwd_image_size = st.st_size;
- passwd_image = mmap(NULL, passwd_image_size,
- PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- if(passwd_image == (userec_t *)-1) {
- perror("mmap");
- return -1;
- }
- close(fd);
- semid = semget(PASSWDSEM_KEY, 1, SEM_R | SEM_A | IPC_CREAT | IPC_EXCL);
- if(semid == -1) {
- if(errno == EEXIST) {
- semid = semget(PASSWDSEM_KEY, 1, SEM_R | SEM_A);
- if(semid == -1) {
- perror("semget");
- exit(1);
- }
- } else {
- perror("semget");
- exit(1);
- }
- } else {
- union semun s;
-
- s.val = 1;
- if(semctl(semid, 0, SETVAL, s) == -1) {
- perror("semctl");
- exit(1);
- }
- }
- } else {
- perror(FN_PASSWD);
- return -1;
- }
- return 0;
-}
-int passwd_update_money(int num) {
- int money;
- if(num < 1 || num > MAX_USERS)
- return -1;
- money = moneyof(num);
- memcpy(&passwd_image[num - 1].money, &money, sizeof(int));
- return 0;
-}
-
-int passwd_update(int num, userec_t *buf) {
- if(num < 1 || num > MAX_USERS)
- return -1;
- buf->money = moneyof(num);
- memcpy(&passwd_image[num - 1], buf, sizeof(userec_t));
- return 0;
-}
-
-int passwd_query(int num, userec_t *buf) {
- if(num < 1 || num > MAX_USERS)
- return -1;
- memcpy(buf, &passwd_image[num - 1], sizeof(userec_t));
- return 0;
-}
-
-int passwd_apply(int (*fptr)(userec_t *)) {
- int i;
-
- for(i = 0; i < MAX_USERS; i++)
- if((*fptr)(&passwd_image[i]) == QUIT)
- return QUIT;
- return 0;
-}
-
-int passwd_apply2(int (*fptr)(int, userec_t *)) {
- int i;
-
- for(i = 0; i < MAX_USERS; i++)
- if((*fptr)(i, &passwd_image[i]) == QUIT)
- return QUIT;
- return 0;
-}
-
-void passwd_lock() {
- struct sembuf buf = { 0, -1, SEM_UNDO };
-
- if(semop(semid, &buf, 1)) {
- perror("semop");
- exit(1);
- }
-}
-
-void passwd_unlock() {
- struct sembuf buf = { 0, 1, SEM_UNDO };
-
- if(semop(semid, &buf, 1)) {
- perror("semop");
- exit(1);
- }
-}
diff --git a/web/util_record.c b/web/util_record.c
deleted file mode 100755
index 93d060e0..00000000
--- a/web/util_record.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/* $Id: util_record.c,v 1.2 2003/03/24 20:44:09 ptt Exp $ */
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-#include "config.h"
-#include "pttstruct.h"
-#include "modes.h"
-#include "proto.h"
-
-#undef HAVE_MMAP
-#define BUFSIZE 512
-
-extern char *str_reply;
-
-static void PttLock(int fd, int size, int mode) {
- static struct flock lock_it;
- int ret;
-
- lock_it.l_whence = SEEK_CUR; /* from current point */
- lock_it.l_start = 0; /* -"- */
- lock_it.l_len = size; /* length of data */
- lock_it.l_type = mode; /* set exclusive/write lock */
- lock_it.l_pid = 0; /* pid not actually interesting */
- while((ret = fcntl(fd, F_SETLKW, &lock_it)) < 0 && errno == EINTR);
-}
-
-#define safewrite write
-
-int get_num_records(char *fpath, int size) {
- struct stat st;
- if(stat(fpath, &st) == -1)
- return 0;
- return st.st_size / size;
-}
-
-int get_sum_records(char* fpath, int size) {
- struct stat st;
- long ans = 0;
- FILE* fp;
- fileheader_t fhdr;
- char buf[200], *p;
-
- if(!(fp = fopen(fpath, "r")))
- return -1;
-
- strcpy(buf, fpath);
- p = strrchr(buf, '/') + 1;
-
- while(fread(&fhdr, size, 1, fp) == 1) {
- strcpy(p, fhdr.filename);
- if(stat(buf, &st) == 0 && S_ISREG(st.st_mode) && st.st_nlink == 1)
- ans += st.st_size;
- }
- fclose(fp);
- return ans / 1024;
-}
-
-int get_record(char *fpath, void *rptr, int size, int id) {
- int fd = -1;
-
- if(id < 1 || (fd = open(fpath, O_RDONLY, 0)) != -1) {
- if(lseek(fd, (off_t)(size * (id - 1)), SEEK_SET) != -1) {
- if(read(fd, rptr, size) == size) {
- close(fd);
- return 0;
- }
- }
- close(fd);
- }
- return -1;
-}
-
-int get_records(char *fpath, void *rptr, int size, int id, int number) {
- int fd;
-
- if(id < 1 || (fd = open(fpath, O_RDONLY, 0)) == -1)
- return -1;
-
- if(lseek(fd, (off_t)(size * (id - 1)), SEEK_SET) == -1) {
- close(fd);
- return 0;
- }
- if((id = read(fd, rptr, size * number)) == -1) {
- close(fd);
- return -1;
- }
- close(fd);
- return id / size;
-}
-
-int substitute_record(char *fpath, void *rptr, int size, int id) {
- int fd;
-
-#ifdef POSTBUG
- if(size == sizeof(fileheader) && (id > 1) && ((id - 1) % 4 == 0))
- saverecords(fpath, size, id);
-#endif
-
- if(id < 1 || (fd = open(fpath, O_WRONLY | O_CREAT, 0644)) == -1)
- return -1;
-
-#ifdef HAVE_REPORT
- if(lseek(fd, (off_t)(size * (id - 1)), SEEK_SET) == -1)
- report("substitute_record failed!!! (lseek)");
- PttLock(fd, size, F_WRLCK);
- if(safewrite(fd, rptr, size) != size)
- report("substitute_record failed!!! (safewrite)");
- PttLock(fd, size, F_UNLCK);
-#else
- lseek(fd, (off_t) (size * (id - 1)), SEEK_SET);
- PttLock(fd, size, F_WRLCK);
- safewrite(fd, rptr, size);
- PttLock(fd, size, F_UNLCK);
-#endif
- close(fd);
-
-#ifdef POSTBUG
- if(size == sizeof(fileheader) && (id > 1) && ((id - 1) % 4 == 0))
- restorerecords(fpath, size, id);
-#endif
-
- return 0;
-}
-
-int apply_record(char *fpath, int (*fptr)(), int size) {
- char abuf[BUFSIZE];
- FILE* fp;
-
- if(!(fp = fopen(fpath, "r")))
- return -1;
-
- while(fread(abuf, 1, size, fp) == size)
- if((*fptr) (abuf) == QUIT) {
- fclose(fp);
- return QUIT;
- }
- fclose(fp);
- return 0;
-}
-
-/* mail / post 時,依據時間建立檔案,加上郵戳 */
-int stampfile(char *fpath, fileheader_t *fh) {
- register char *ip = fpath;
- time_t dtime;
- struct tm *ptime;
- int fp = 0;
-
- if(access(fpath, X_OK | R_OK | W_OK))
- mkdir(fpath, 0755);
-
- time(&dtime);
- while (*(++ip));
- *ip++ = '/';
- do {
- sprintf(ip, "M.%ld.A.%3.3X", ++dtime, rand()&0xfff );
- if(fp == -1 && errno != EEXIST)
- return -1;
- } while((fp = open(fpath, O_CREAT | O_EXCL | O_WRONLY, 0644)) == -1);
- close(fp);
- memset(fh, 0, sizeof(fileheader_t));
- strcpy(fh->filename, ip);
- ptime = localtime(&dtime);
- sprintf(fh->date, "%2d/%02d", ptime->tm_mon + 1, ptime->tm_mday);
- return 0;
-}
-
-void stampdir(char *fpath, fileheader_t *fh) {
- register char *ip = fpath;
- time_t dtime;
- struct tm *ptime;
-
- if(access(fpath, X_OK | R_OK | W_OK))
- mkdir(fpath, 0755);
-
- time(&dtime);
- while(*(++ip));
- *ip++ = '/';
- do {
- sprintf(ip, "D%lX", ++dtime & 07777);
- } while(mkdir(fpath, 0755) == -1);
- memset(fh, 0, sizeof(fileheader_t));
- strcpy(fh->filename, ip);
- ptime = localtime(&dtime);
- sprintf(fh->date, "%2d/%02d", ptime->tm_mon + 1, ptime->tm_mday);
-}
-
-void stamplink(char *fpath, fileheader_t *fh) {
- register char *ip = fpath;
- time_t dtime;
- struct tm *ptime;
-
- if(access(fpath, X_OK | R_OK | W_OK))
- mkdir(fpath, 0755);
-
- time(&dtime);
- while(*(++ip));
- *ip++ = '/';
- do {
- sprintf(ip, "S%lX", ++dtime );
- } while(symlink("temp", fpath) == -1);
- memset(fh, 0, sizeof(fileheader_t));
- strcpy(fh->filename, ip);
- ptime = localtime(&dtime);
- sprintf(fh->date, "%2d/%02d", ptime->tm_mon + 1, ptime->tm_mday);
-}
-
-int do_append(char *fpath, fileheader_t *record, int size) {
- int fd;
-
- if((fd = open(fpath, O_WRONLY | O_CREAT, 0644)) == -1) {
- perror("open");
- return -1;
- }
- flock(fd, LOCK_EX);
- lseek(fd, 0, SEEK_END);
-
- safewrite(fd, record, size);
-
- flock(fd, LOCK_UN);
- close(fd);
- return 0;
-}
-
-int append_record(char *fpath, fileheader_t *record, int size) {
-#ifdef POSTBUG
- int numrecs = (int)get_num_records(fpath, size);
-
- bug_possible = 1;
- if(size == sizeof(fileheader) && numrecs && (numrecs % 4 == 0))
- saverecords(fpath, size, numrecs + 1);
-#endif
- do_append(fpath,record,size);
-
-#ifdef POSTBUG
- if(size == sizeof(fileheader) && numrecs && (numrecs % 4 == 0))
- restorerecords(fpath, size, numrecs + 1);
- bug_possible = 0;
-#endif
- return 0;
-}