/* vi: set ts=4 sw=4 ai: */
/*
* adds.c
*
* Lotos v1.2.3 : (c) 1999-2003 Pavol Hluchy (Lopo)
* last update : 30.1.2003
* email : lotos@losys.sk
* homepage : lotos.losys.sk
*/
#ifndef __ADDS_C__
#define __ADDS_C__ 1
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "define.h"
#include "prototypes.h"
#include "obj_ur.h"
#include "obj_rm.h"
#include "obj_tr.h"
#include "obj_pl.h"
#include "obj_sys.h"
#include "obj_syspp.h"
#include "adds.h"
#include "comvals.h"
#include "prototypes.h"
/* any testing algoritmus can be writed here by developing */
#ifdef DEBUG
void test(UR_OBJECT user, char *inpstr)
{
set_crash();
write_user(user, "This is a testing function\n");
}
#endif
/* Writes STR to users of LEVEL and higher who are in ROOM except for USER */
void write_duty(int level, char *str, RM_OBJECT room, UR_OBJECT user, int cr)
{
UR_OBJECT u;
set_crash();
if (level<WIZ) level=WIZ;
for (u=user_first;u!=NULL;u=u->next) {
if (u->login
|| u->type==CLONE_TYPE
|| u->type==BOT_TYPE
|| u->level<level
|| u==user
|| u->room==NULL
|| (u->room!=room && room!=NULL)
|| ((user!=NULL)
&& (check_igusers(u,user)!=-1)
&& (user->level>GOD)
)
|| u->ignore.all
) continue;
write_user(u,str);
}
}
/*** Write usage of a command ***/
void write_usage(UR_OBJECT user, char *str, ...)
{
va_list args;
set_crash();
vtext[0]='\0';
va_start(args, str);
vsprintf(vtext, str, args);
va_end(args);
strcpy(text, vtext);
vwrite_user(user, "~OL>Pouzitie: ~FT%s\n", text);
}
int lotos_load(void)
{
int tmp=-1;
set_crash();
if (init_ossmain()) tmp=0; /* Initialize main system */
if (tmp==-1) {
printf("Lotos: Main system did not initialize in lotos_load()!!\n BOOT ABORTED.\n\n");
exit(0);
}
load_plugins();
printf("Verifikujem pluginy ");
oss_versionVerify();
printf("System plugin registry initialized.\n");
return 1;
}
int init_ossmain(void)
{
set_crash();
printf("\nVerifikujem systemove komponenty a premenne. . .\n");
/* check modular colorcode index checksum */
if ((CDEFAULT+CHIGHLIGHT+CTEXT+CBOLD+CSYSTEM+CSYSBOLD+CWARNING+CWHOUSER+CWHOINFO+
CPEOPLEHI+CPEOPLE+CUSER+CSELF+CEMOTE+CSEMOTE+CPEMOTE+CTHINK+CTELLUSER+
CTELLSELF+CTELL+CSHOUT+CMAILHEAD+CMAILDATE+CBOARDHEAD+CBOARDDATE)!=300)
{ printf("Lotos: Chybny sucet modularnych indexov color-kodov\n"); return 0; }
/* check system registry index checksum */
if ((TALKERNAME+SERIALNUM+REGUSER+SERVERDNS+SERVERIP+TALKERMAIL+TALKERHTTP+SYSOPNAME+SYSOPUNAME+PUEBLOWEB+PUEBLOPIC)!=66)
{printf("Lotos: System information registry index checksum FAILED.\n"); return 0; }
/* check system registry master entry */
if (reg_sysinfo[0][0]!='*') { printf("Lotos: System registry master entry (0) must be '*'.\n -- Temporarily fixed.");
reg_sysinfo[0][0]='*'; reg_sysinfo[0][1]='\0'; }
printf("Lotos verzia %s inicializovana.\n\n", OSSVERSION);
return 1;
}
void oss_versionVerify(void)
{
PL_OBJECT plugin,p;
CM_OBJECT com;
set_crash();
for (plugin=plugin_first; plugin!=NULL; plugin=p) {
p=plugin->next;
if (atoi(RUN_VER) < atoi(plugin->req_ver)) {
printf("\nLotos: Plugin '%s' pozaduje vyssiu verziu Lotos.\n",plugin->name);
write_syslog(SYSLOG, 0, "Lotos: Plugin '%s' pozaduje Lotos verzie %s.\n",plugin->name,plugin->req_ver);
for (com=cmds_first; com!=NULL; com=com->next) if (com->plugin==plugin) destroy_pl_cmd(com);
destroy_plugin(plugin);
}
printf(".");
}
printf(" OK\n");
}
void create_systempp(void)
{
set_crash();
if ((syspp=(SYSPP_OBJECT)malloc(sizeof(struct syspp_struct)))==NULL) {
fprintf(stderr,"Lotos: Failed to create systempp object in create_systempp().\n");
boot_exit(21);
}
syspp->oss_highlev_debug=0;
syspp->debug_input=0; // POZOR !!! Nikdy nenastavovat na 1 !!!
syspp->highlev_debug_on=0;
#ifdef PUEBLO
syspp->pueblo_enh=0;
syspp->pblo_usr_mm_def=0;
syspp->pblo_usr_pg_def=0;
#endif
syspp->kill_msgs=0;
syspp->sys_access=1;
syspp->wiz_access=1;
syspp->auto_afk=0;
syspp->auto_afk_time=0;
syspp->reboot_time=0;
}
int show_file(UR_OBJECT user, char *fname)
{
FILE *fp;
char line[ARR_SIZE+1];
set_crash();
if (!(fp=fopen(fname, "r"))) return 0;
fgets(line, ARR_SIZE, fp);
while (!feof(fp)) {
line[strlen(line)-1]='\0';
strcat(line, "\n");
write_user(user, line);
fgets(line, ARR_SIZE, fp);
}
fclose(fp);
return 1;
}
void write_room_except2(RM_OBJECT rm, char *str, UR_OBJECT user, UR_OBJECT user2)
{
UR_OBJECT u;
set_crash();
for (u=user_first; u!=NULL; u=u->next) {
if (u->login
|| u->room==NULL
|| (u->room!=rm && rm!=NULL)
|| (u->ignore.all && !force_listen)
|| (u->ignore.shouts && (com_num==SHOUT || com_num==SEMOTE || com_num==SHOUTTO))
|| (u->ignore.logons && logon_flag)
|| (u->ignore.greets && com_num==GREET)
|| u==user
|| u==user2) continue;
if ((check_igusers(u,user))!=-1 && user->level<ARCH) continue;
if (u->type==CLONE_TYPE) {
if (u->clone_hear==CLONE_HEAR_NOTHING || u->owner->ignore.all) continue;
/* Ignore anything not in clones room, eg shouts, system messages
and semotes since the clones owner will hear them anyway. */
if (rm!=u->room) continue;
if (u->clone_hear==CLONE_HEAR_SWEARS) {
if (!contains_swearing(str)) continue;
}
sprintf(text, "~FT[ %s ]:~RS %s",u->room->name,str);
write_user(u->owner, text);
}
else write_user(u,str);
} /* end for */
}
/* zobrazenie sklonovania nicku */
void show_nick_grm(UR_OBJECT user, UR_OBJECT u)
{
set_crash();
vwrite_user(user, "2. p - G: %s\n", u->nameg);
vwrite_user(user, "3. p - D: %s\n", u->named);
vwrite_user(user, "4. p - A: %s\n", u->namea);
vwrite_user(user, "6. p - L: %s\n", u->namel);
vwrite_user(user, "7. p - I: %s\n", u->namei);
vwrite_user(user, "privl. pre muzsky rod : %s\n", u->namex);
vwrite_user(user, "privl. pre zensky rod : %s\n", u->namey);
vwrite_user(user, "privl. pre stredny rod: %s\n", u->namez);
}
void com_nick_grm(UR_OBJECT user)
{
UR_OBJECT u;
int on;
set_crash();
if ((word_count<2) || (user->level<GOD)) {
u=user;
on=1;
}
else {
if (!(u=get_user(word[1]))) {
if ((u=create_user())==NULL) {
vwrite_user(user,"%s: nemozem vytvorit docasny user objekt.\n",syserror);
write_syslog(ERRLOG,1,"Unable to create temporary user object in examine().\n");
return;
}
strcpy(u->name,word[1]);
if (!load_user_details(u)) {
write_user(user,nosuchuser);
destruct_user(u);
destructed=0;
return;
}
on=0;
}
else on=1;
}
vwrite_user(user, "2. p - G: %s\n", u->nameg);
vwrite_user(user, "3. p - D: %s\n", u->named);
vwrite_user(user, "4. p - A: %s\n", u->namea);
vwrite_user(user, "6. p - L: %s\n", u->namel);
vwrite_user(user, "7. p - I: %s\n", u->namei);
vwrite_user(user, "privl. pre muzsky rod : %s\n", u->namex);
vwrite_user(user, "privl. pre zensky rod : %s\n", u->namey);
vwrite_user(user, "privl. pre stredny rod: %s\n", u->namez);
if (!on) {
destruct_user(u);
destructed=0;
}
return;
}
int port_connect(char *host, int port)
{
int portsocket;
struct sockaddr_in sin;
struct hostent *he;
set_crash();
he=gethostbyname(host);
if (he==NULL) return -1;
bzero((char *)&sin,sizeof(sin));
bcopy(he->h_addr,(char *)&sin.sin_addr,he->h_length);
sin.sin_family=he->h_addrtype;
sin.sin_port=htons(port);
portsocket=socket(AF_INET, SOCK_STREAM, 0);
if (portsocket==-1) return -1;
if(connect(portsocket,(struct sockaddr *)&sin,sizeof(sin))==-1) return -1;
return portsocket;
}
char *getanswer(FILE *popfp, char *buff, int eol)
{
int ch;
char *in=buff;
set_crash();
for (;;) {
ch=getc(popfp);
if ((eol==1) || (ch=='\n')) {
*in='\0';
eol=0;
return buff;
}
else {
*in=(char)ch;
in++;
}
}
}
/*** Load swear words list from file ***/
void load_swear_file(UR_OBJECT user)
{
FILE *fp;
char line[WORD_LEN+1];
int i;
set_crash();
for (i=0; i<MAX_SWEARS; i++)
swear_words[i][0]='\0';
i=0;
if (user==NULL) printf("Loading swear words file ... ");
else write_user(user,">>>Loading swear words file ... ");
if (!(fp=fopen(SWEARFILE, "r"))) {
strcpy(swear_words[0],"*");
if (user==NULL) printf(" not found.\n");
else write_user(user," not found.\n");
return;
}
fgets(line,WORD_LEN+2,fp);
while (!feof(fp)) {
line[strlen(line)-1]='\0';
strcpy(swear_words[i],line);
i++;
if (i>=MAX_SWEARS) break;
fgets(line,WORD_LEN+2,fp);
}
fclose(fp);
strcpy(swear_words[i],"*");
if (user==NULL) printf(" done (%d words).\n",i);
else vwrite_user(user," done ( ~FT%d~RS words ).\n",i);
}
int backup_talker(void)
{
char fname[6][FNAME_LEN];
int i;
set_crash();
switch (double_fork()) {
case -1 :
sprintf(text,"~OLSYSTEM: backup_talker(): Failed to fork backup process...\n");
write_level(ARCH, 1, text, NULL);
write_syslog(ERRLOG, 1, "backup_talker(): Failed to fork process...\n");
return 0; /* double_fork() failed */
case 0 : /* Start Backup Of Files */
sprintf(fname[0], "%s/%s.tgz", BACKUPDIR, BACKUPFILE);
sprintf(fname[1], "%s/%s.log1", LOGFILES, BACKUPFILE);
sprintf(fname[2], "%s/%s.log2", LOGFILES, BACKUPFILE);
sprintf(fname[3], "%s/%s.tgz", TEMPFILES, BACKUPFILE);
sprintf(fname[4], "%s/%s.log1", TEMPFILES, BACKUPFILE);
sprintf(fname[5], "%s/%s.log2", TEMPFILES, BACKUPFILE);
for (i=0; i<6; i++) unlink(fname[i]);
write_syslog(SYSLOG, 1, "Backing Up Talker Files To : %s/%s.tgz\n",BACKUPDIR,BACKUPFILE);
write_syslog(SYSLOG, 1, "For Zip Progress, Read File: %s/%s.log\n",LOGFILES,BACKUPFILE);
// sprintf(text,"zip -v -9 -r %s/%s.zip * > %s/%s/%s.log", BACKUPDIR, BACKUPFILE, ROOTDIR, LOGFILES, BACKUPFILE);
sprintf(text, "tar -zcfp '%s' '%s' 1> '%s' 2> '%s'", fname[3], ROOTDIR, fname[4], fname[5]);
system(text);
for (i=0; i<3; i++)
rename(fname[i+3], fname[i]);
_exit(1);
return 1;
}
return 0;
}
void follow(UR_OBJECT user)
{
UR_OBJECT ur;
int i;
set_crash();
for (ur=user_first; ur!=NULL; ur=ur->next) {
if (strcmp(ur->follow, user->name)) continue;
if (ur->room==user->room) continue; /* inac by (asi) vznikol nekonecny cyklus */
if (ur->level<command_table[FOLLOW].level) { /* kvoli demote */
ur->follow[0]='\0';
continue;
}
if (!has_room_access(ur, user->room)) {
vwrite_user(ur, "Smola, ale %s is%s do miestnosti, kde ty nemas pristup,\nnemozes %s uz dalej sledovat ...\n",
user->name, grm_gnd(7, user->gender), grm_gnd(8, user->gender));
ur->follow[0]='\0';
continue;
}
if (ur->level<WIZ) { /* len ak je do roomy linka */
if (user->room->transp!=NULL) {
if ((user->room->transp->go) || user->room->link[user->room->transp->out]!=ur->room) {
vwrite_user(ur, "Smola, ale %s is%s do miestnosti, kde sa teraz odtialto nedostanes,\nnemozes %s dalej sledovat ...\n",
user->name, grm_gnd(7, user->gender), grm_gnd(8, user->gender));
continue;
}
vwrite_user(ur, "Sledujes %s do miestnosti %s\n",
user->name, user->room->name);
move_user(ur, user->room, 0);
follow(ur);
continue;
}
else {
for (i=0; i<MAX_LINKS; ++i) {
if (ur->room->link[i]==user->room) {
vwrite_user(ur, "Sledujes %s do miestnosti %s\n",
user->name, user->room->name);
move_user(ur, user->room, 0);
follow(ur);
continue;
}
}
}
vwrite_user(ur, "Smola, ale %s is%s do miestnosti, kde sa teraz odtialto nedostanes,\nnemozes %s dalej sledovat ...\n",
user->name, grm_gnd(7, user->gender), grm_gnd(8, user->gender));
continue;
}
vwrite_user(ur, "Sledujes %s do miestnosti %s\n",
user->name, user->room->name);
move_user(ur, user->room, 0);
follow(ur); /* ak aj jeho niekto sleduje */
continue;
}
}
void myxterm(UR_OBJECT user, char *inpstr)
{
set_crash();
if (!user->terminal.xterm) {
write_user(user, "Ved nemas povoleny xterm !!!\n");
return;
}
vwrite_user(user, "\033]0;%s\007", inpstr);
}
void allxterm(UR_OBJECT user, char *inpstr)
{
UR_OBJECT u;
set_crash();
for (u=user_first; u!=NULL; u=u->next) {
if (u->login || u->type==CLONE_TYPE) continue;
if (u->terminal.xterm) vwrite_user(u, "\033]0;%s\007", inpstr);
else vwrite_user(user, "Window titlebar & icon changed to ~OL%s\n", inpstr);
}
}
int inroom(RM_OBJECT rm)
{
UR_OBJECT u;
int users=0;
set_crash();
for (u=user_first; u!=NULL; u=u->next) {
if (u->login) continue;
if (u->room==rm) users++;
}
return users;
}
int file_exists(char *fname)
{
FILE *fp;
set_crash();
if ((fp=fopen(fname, "r"))==NULL) return 0;
fclose(fp);
return 1;
}
/* Restore a user to his original rank from a temp promote. S.C. 09/27/99 */
void restore(UR_OBJECT user)
{
UR_OBJECT u;
set_crash();
if (word_count<2) {
write_usage(user,"restore <user>");
return;
}
if (!(u=get_user_name(user,word[1]))) {
write_user(user, notloggedon);
return;
}
if (u->level>u->real_level) {
u->level=u->real_level;
vwrite_user(user,"%s Ma odteraz svoj originalny level.\n", u->name);
vwrite_room_except(u->room,u,"%s begins fading as their power is restored to normal.\n",u->name);
vwrite_user(u,"Bol obnoveny tvoj originalny level.\n");
write_syslog(SYSLOG, 1, "%s restored %s to their original level.\n",user->name,u->name);
sprintf(text,"Had their level restored by %s.\n",user->name);
add_history(u->name,1,text);
return;
}
else {
write_user(user,"You can't restore a person to their original rank if they're already there.\n");
return;
}
}
#ifdef DEBUG
void s_crash(char *file, int line)
{
if (!strcmp(crash[crash_step].lastfile, file)
&& crash[crash_step].lastline==line
&& crash[crash_step].n<=254)
crash[crash_step].n++;
else {
crash_step++;
if (crash_step>=1024) crash_step=0;
strcpy(crash[crash_step].lastfile, file);
crash[crash_step].lastline=line;
crash[crash_step].n=1;
}
}
void crash_dump(void)
{
FILE *fp;
int i;
char fname[FNAME_LEN];
set_crash();
sprintf(fname, "%s/crash_dump.%4d_%02d_%02d_%02d_%02d_%02d", LOGFILES, tyear, tmonth, tday, thour, tmin, tsec);
if ((fp=fopen(fname, "w"))==NULL) {
write_syslog(ERRLOG, 1, "Nemozem otvorit subor %s na zapis v crash_dump()\n", fname);
return;
}
fprintf(fp, "id file line cnt\n");
for (i=crash_step+1;; i++) {
if (i==CRASH_HISTORY) i=0;
fprintf(fp, "%4.4d %-13.13s %8d %3d\n", i, crash[i].lastfile, crash[i].lastline, crash[i].n);
fflush(fp);
if (i==crash_step) break;
}
fclose(fp);
}
#endif
/* allows a user to rename their room */
void personal_room_rename(UR_OBJECT user,char *inpstr) {
char name[ROOM_NAME_LEN+1];
RM_OBJECT rm;
if (!amsys->personal_rooms) {
write_user(user,"Personal room functions are currently disabled.\n");
return;
}
if (word_count<2) {
write_usage(user, "%s <nazov>\n", command_table[MYNAME].name);
return;
}
sprintf(name,"(%s)",user->name);
strtolower(name);
/* get room that user is in */
if ((rm=get_room_full(name))==NULL) {
write_user(user,"Sorry, but you cannot use the room renaming feature at this time.\n");
return;
}
if (user->room!=rm) {
write_user(user,"You have to be in your personal room to rename it.\n");
return;
}
if (strlen(inpstr)>PERSONAL_ROOMNAME_LEN) {
write_user(user,"You cannot have a room name that long.\n");
return;
}
strcpy(rm->real_name,inpstr);
vwrite_user(user,"You have now renamed your room to: %s\n",rm->real_name);
if (!personal_room_store(user->name,1,rm))
write_syslog(SYSLOG,1,"ERROR: Unable to save personal room status in personal_room_rename()\n");
}
/* Show users who owns what room by Michael Doig*/
void room_owner(UR_OBJECT user)
{
RM_OBJECT rm;
int rmcnt, pcnt;
char usrname[USER_NAME_LEN+1];
char *line="--==[*]-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-[*]==--\n";
if (!amsys->personal_rooms) {
write_user(user,"Personal room functions are currently disabled.\n");
return;
}
strtolower(word[1]);
rmcnt=0;
write_user(user,"~OL~FG _ _ \n");
write_user(user,"~OL~FG|_) _ _ ._ _ / \\ ._ _ .__\n");
write_user(user,"~OL~FG| \\(_)(_)| | | \\_/\\/\\/| |(/_|_>\n");
write_user(user, line);
write_user(user," ~OL~FGPersonal Room Owner Personal Room Name \n");
write_user(user, line);
for (rm=room_first; rm!=NULL; rm=rm->next) {
if (is_personal_room(rm)) {
pcnt=room_visitor_count(rm);
midcpy(rm->name,usrname,1,strlen(rm->name)-2);
usrname[0]=toupper(usrname[0]);
vwrite_user(user," ~OL%-*s~RS ~OL%-*s~RS ~OL~FB\n", USER_NAME_LEN,usrname,ROOM_NAME_LEN,rm->real_name);
rmcnt++;
}
}
if (!rmcnt) write_user(user," ~OL~FB ~RS~FRNo personal rooms are currently in memory.\n");
write_user(user, line);
write_user(user," ~RSTo visit a room, type ~FR.visit username ~FTeg. ~FR.visit andy\n");
write_user(user, line);
return;
}
#endif /* __ADDS_C__ */