#include <newudp.h>
#ifdef CDLIB
#include <const.h>
#define MANHEAD "/doc/man/"
#endif
void udp_man(mapping data) {
INETD->send_udp(data[NAME], ([
REQUEST: REPLY,
RECIPIENT: data[SENDER],
ID: data[ID],
#ifdef CDLIB
DATA: this_object()->man(data[DATA])
#else
DATA: "/bin/cmds/_man"->get_man_string(data[DATA])
#endif
]) );
}
#ifdef CDLIB
man(string page)
{
string *chaparr;
string path;
int i, g_mannum;
string man_chapt, str;
mixed *man_arr;
seteuid(getuid());
if (file_size(MANHEAD + page) < 0)
{
chaparr = (string *)MANCTRL->get_chapters();
for (i = 0 ; i < sizeof(chaparr) ; i++)
{
man_chapt = chaparr[i];
man_arr = (mixed *)MANCTRL->get_keywords(man_chapt,
page)[1];
if (sizeof(man_arr) > 0)
break;
}
if (!sizeof(man_arr) && member_array(page, chaparr) >= 0)
{
man_arr = MANCTRL->get_index(page)[1];
g_mannum = 2;
str = implode(man_arr, "\n");
return "Available subjects:\n" +
sprintf("%-*#s\n", 76, str);
}
if (sizeof(man_arr) == 0)
return "No such man page: " + page + "\n";
else
{
path = MANHEAD + man_chapt + "/" + man_arr[0];
if (file_size(path) < 0)
return "No such man page: " + page + "\n";
else
{
return "File: " + path + "\n" + read_file(path);
}
}
}
else
{
return "File: " + MANHEAD + page + "\n" + read_file(MANHEAD + page);
}
return 1;
}
#endif