#include "mod_ptt.h"
extern SHM_t *SHM;
extern int *GLOBALVAR;
extern int numboards;
extern boardheader_t *bcache;
typedef struct excfg {
int cmode; /* Environment to which record applies (directory,
* server, or combination).
*/
#define CONFIG_MODE_SERVER 1
#define CONFIG_MODE_DIRECTORY 2
#define CONFIG_MODE_COMBO 3 /* Shouldn't ever happen. */
int local; /* Boolean: "Example" directive declared here? */
int congenital; /* Boolean: did we inherit an "Example"? */
char *trace; /* Pointer to trace string. */
char *loc; /* Location to which this record applies. */
} excfg;
static const char *trace = NULL;
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)
{
return (excfg *) ap_get_module_config(r->per_dir_config, &ptt_module);
}
static void setup_module_cells()
{
if (ptt_pool == NULL) {
ptt_pool = ap_make_sub_pool(NULL);
};
if (static_calls_made == NULL) {
static_calls_made = ap_make_table(ptt_pool, 16);
};
}
static int xml_header(request_rec *r)
{
r->content_type = "text/xml";
ap_send_http_header(r);
ap_rputs(" \n", r);
ap_rprintf(r, "", SHM->max_user );
}
static int userlist(request_rec *r)
{
int i,offset=0;
userinfo_t *ptr;
xml_header(r);
if (r->header_only) {
return OK;
}
if(r->args) offset=atoi(r->args);
if(offset<0 || offset>SHM->UTMPnumber)offset=0;
ap_rprintf(r,"");
for(i=offset;iUTMPnumber && i<50+offset;i++)
{
ptr= (userinfo_t *)SHM->sorted[SHM->currsorted][0][i];
if(!ptr || ptr->userid[0]==0 || ptr->invisible ) continue;
ap_rprintf(r,"\n");
ap_rprintf(r," %d\n",i+1);
ap_rprintf(r," %d\n",SHM->UTMPnumber);
ap_rprintf(r," %d\n",ptr->uid);
ap_rprintf(r," %s\n",ptr->userid);
ap_rprintf(r," %s\n",
ap_escape_html(r->pool,ptr->username));
ap_rprintf(r," %s\n",ptr->from);
ap_rprintf(r," %d\n",ptr->from_alias);
ap_rprintf(r," %d\n",ptr->mailalert);
ap_rprintf(r," %s\n",ap_escape_html(r->pool,ptr->mind));
ap_rprintf(r,"");
}
ap_rprintf(r,"");
}
static int showboard(request_rec *r, int id)
{
int i;
boardheader_t *bptr=NULL;
id=id-1;
ap_rprintf(r,"");
bptr = (boardheader_t *)bcache[id].firstchild[0];
for(; bptr!= (boardheader_t*)~0; )
{
if((bcache[id].brdattr&BRD_HIDE)||
bcache[id].level&& !(bcache[id].brdattr & BRD_POSTMASK )) continue;
ap_rprintf(r,"\n");
i=(bptr-bcache);
ap_rprintf(r," %d",i+1);
ap_rprintf(r," %s\n",bptr->brdname);
ap_rprintf(r," %s\n",ap_escape_html(r->pool,bptr->title));
ap_rprintf(r," %d\n",bptr->nuser);
ap_rprintf(r," %d\n",bptr->gid);
ap_rprintf(r," %d\n",bptr->childcount);
ap_rprintf(r," %s\n",bptr->BM);
ap_rprintf(r," %d\n",bptr->brdattr);
ap_rprintf(r," %d\n",SHM->total[i]);
ap_rprintf(r,"\n");
bptr=(boardheader_t*)bptr->next[0];
}
ap_rprintf(r,"");
}
static int showpost(request_rec *r,int bid,int id, int num)
{
int i;
num=256;
id=1;
char path[512];
fileheader_t headers[256];
memset(headers,0, sizeof(fileheader_t)*256);
sprintf(path,BBSHOME"/boards/%c/%s/.DIR",
bcache[bid-1].brdname[0],bcache[bid-1].brdname);
get_records(path, headers, sizeof(fileheader_t)*256, id,num);
ap_rprintf(r,"");
for(i=0;i<256;i++)
{
ap_rprintf(r,"\n");
ap_rprintf(r," %d",i+1);
ap_rprintf(r," %s\n",headers[i].filename);
ap_rprintf(r," %s\n",headers[i].owner);
ap_rprintf(r," %s\n",headers[i].date);
ap_rprintf(r," %s\n",
ap_escape_html(r->pool,headers[i].title));
ap_rprintf(r," %d\n",headers[i].money);
ap_rprintf(r," %c\n",headers[i].filemode);
ap_rprintf(r," %d\n",headers[i].recommend);
ap_rprintf(r,"\n");
}
ap_rprintf(r,"");
}
static int showmenujs(request_rec *r)
{
int i;
boardheader_t *bptr;
r->content_type = "text/text";
ap_send_http_header(r);
ap_rputs("d=new dTree('d');\n",r);
ap_rputs("d.add(0,-1,'Class','');\n",r);
for(i=1;i<=numboards;i++)
{
bptr=&bcache[i-1];
if(!isalpha(bptr->brdname[0]))continue;
ap_rprintf(r,"d.add(%d,%d,\"%s %s..\",'/boards?%s');\n",
i,bptr->gid-1,
bptr->gid==1?"":bptr->brdname,
ap_escape_quotes(r->pool,
ap_escape_html(r->pool,bptr->title+7)),i);
}
ap_rputs("d.draw()\n",r);
return OK;
}
static int showxml(request_rec *r)
{
int bid=1;
xml_header(r);
if (r->header_only) {
return OK;
}
if(r->args) bid=atoi(r->args);
if(bid<1 || bid>numboards)bid=1;
if(
!(bcache[bid-1].brdattr&BRD_HIDE)&&
!(bcache[bid-1].level&&!(bcache[bid-1].brdattr & BRD_POSTMASK)))
if( bid==1||bcache[bid-1].brdattr&BRD_GROUPBOARD)
showboard(r,bid);
else
showpost(r,bid,0,0);
return OK;
}
static int ptt_handler(request_rec *r)
{
excfg *dcfg;
dcfg = our_dconfig(r);
ap_soft_timeout("send ptt call trace", r);
if(!strncmp(r->unparsed_uri,"/menu",5))
showmenujs(r);
else if(!strncmp(r->unparsed_uri,"/userlist",9))
userlist(r);
else
showxml(r);
ap_kill_timeout(r);
return OK;
}
/* 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. */
static void ptt_child_init(server_rec *s, pool *p)
{
char *note;
char *sname = s->server_hostname;
attach_SHM();
setup_module_cells();
sname = (sname != NULL) ? sname : "";
note = ap_pstrcat(p, "ptt_child_init(", sname, ")", NULL);
}
static void ptt_child_exit(server_rec *s, pool *p)
{
char *note;
char *sname = s->server_hostname;
/*
* 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_exit(", sname, ")", NULL);
}
static const handler_rec ptt_handlers[] =
{
{"ptt_h", ptt_handler},
{NULL}
};
module MODULE_VAR_EXPORT ptt_module =
{
STANDARD_MODULE_STUFF,
NULL, /* module initializer */
NULL, /* per-directory config creator */
NULL, /* dir config merger */
NULL, /* server config creator */
NULL, /* server config merger */
NULL, /* command table */
ptt_handlers, /* [9] list of handlers */
NULL, /* [2] filename-to-URI translation */
NULL, /* [5] check/validate user_id */
NULL, /* [6] check user_id is valid *here* */
NULL, /* [4] check access by host address */
NULL, /* [7] MIME type checker/setter */
NULL, /* [8] fixups */
NULL, /* [10] logger */
#if MODULE_MAGIC_NUMBER >= 19970103
NULL, /* [3] header parser */
#endif
#if MODULE_MAGIC_NUMBER >= 19970719
ptt_child_init, /* process initializer */
#endif
#if MODULE_MAGIC_NUMBER >= 19970728
ptt_child_exit, /* process exit/cleanup */
#endif
#if MODULE_MAGIC_NUMBER >= 19970902
NULL
#endif
};