blob: 88c4b577edc158488b207f3034561cba0274f561 [file] [log] [blame]
#pragma strict_types
#include <udp.h>
#include <daemon.h>
#define MAX_READ_FILE_LEN 50000
// TEMPORARY
#include <udp_language.h>
#include <logging.h>
#ifndef LOCAL_NAME
#define LOCAL_NAME "MorgenGrauen"
#endif
#ifndef INETD_INVALID_ACCESS
#define INETD_INVALID_ACCESS INTERMUDLOG("INVALID_ACCESS")
#endif
#ifndef INVALID_ACCESS
#define INVALID_ACCESS(x) \
log_file(INETD_INVALID_ACCESS, \
sprintf(INETD_INV_ACCESS_MSG "TI: %O PO: %O\n", \
ctime()[4..15],this_interactive(), \
previous_object()))
#endif
// END TEMPORARY
void udp_man(mapping data)
{
mapping pages;
int index;
string manpage,ret;
string|string* tmp;
if (previous_object()!=find_object(INETD))
{
INVALID_ACCESS(Man);
return;
}
manpage=data[DATA];
tmp=explode(manpage,"/");
if (sizeof(tmp)>1)
{
if (file_size(MAND_DOCDIR+manpage)>=0)
tmp=({tmp[<1],manpage});
else
tmp=({});
}
else
tmp=(string *)call_other(MAND,"locate",data[DATA],0);
pages=([]);
index=sizeof(tmp);
while(index--)
{
if (tmp[1][0..1]!="g.") pages[tmp[index]]=tmp[index-1];
index--;
}
switch(sizeof(pages))
{
case 0:
ret=sprintf(INETD_NO_MANPAGE,LOCAL_NAME,manpage);
break;
case 1:
tmp=m_indices(pages)[0];
ret=sprintf(INETD_MANPAGE_FOUND,LOCAL_NAME,pages[tmp]);
index=0;
while(manpage=read_file(MAND_DOCDIR+tmp,index))
{
ret+=manpage;
index+=MAX_READ_FILE_LEN;
}
break;
default:
ret=sprintf(INETD_MANPAGES,LOCAL_NAME,"",
break_string(implode(m_values(pages)," "),78),"");
break;
}
INETD->_send_udp(data[NAME],
([
REQUEST: REPLY,
RECIPIENT: data[SENDER],
ID: data[ID],
DATA: ret
]));
}
string send_request(string mudname, string pagename)
{
return (INETD->_send_udp(mudname,
([REQUEST: "man",
DATA: pagename,
SENDER: getuid(previous_object())]),1)||
sprintf(INETD_MAN_REQUESTED,pagename,mudname));
}