From 0cf00e1716935ddf11db577f34c1920d34402193 Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Thu, 20 Mar 2003 22:43:40 +0000 Subject: [PATCH] Added sysop page commands --- ChangeLog | 11 +- lang/Language.xref | 4 +- lang/dutch.txt | 2 +- lang/english.txt | 2 +- lang/galego.txt | 2 +- lang/german.txt | 2 +- lang/italian.txt | 2 +- lang/spanish.txt | 2 +- mbmon/mutil.c | 167 ++++++++++++--------- mbsebbs/Makefile | 14 +- mbsebbs/chat.c | 6 +- mbsebbs/chat.h | 6 +- mbsebbs/mbchat.c | 259 -------------------------------- mbsebbs/menu.c | 4 +- mbsebbs/page.c | 153 +++++++++++-------- mbtask/taskcomm.c | 234 ++++++++++++++++------------- mbtask/taskregs.c | 365 +++++++++++++++++++++++++++++---------------- mbtask/taskregs.h | 15 +- 18 files changed, 591 insertions(+), 659 deletions(-) delete mode 100644 mbsebbs/mbchat.c diff --git a/ChangeLog b/ChangeLog index 7f4893b3..3eec9768 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ $Id$ menus do not work. All other users on Intel machines (99,9% I think) can use this version. + WARNING, sysop chat doesn't work right now. + v0.37.2 23-Feb-2003. @@ -49,10 +51,14 @@ v0.37.2 23-Feb-2003. Added email reply when reading new (e)mail. With the CIPM and CSPM mbtask commands added the parameter for the chat channel. + To page the sysop, the CPAG and CCAN commands to mbtask are now + used. mbmon: Reports sysop available or left the system when mbmon starts or stops. + Reports a page from a user in row 3 of the screen (but doesn't + do chat right now). mbtask: Safer logging of user log messages. @@ -61,9 +67,12 @@ v0.37.2 23-Feb-2003. In personal message text the text after a ; character is not ignored anymore. Added CSYS command to report if sysop is available. + Added CPAG command to page the sysop. + Added CCAN command to cancel the sysop page. + Added CCKP command to check for a page. lang: - Changed language prompts 15 and 16. + Changed language prompts 15, 16 and 152. v0.37.1 14-Jan-2003 - 23-Feb-2003 diff --git a/lang/Language.xref b/lang/Language.xref index d7fcc740..76dccb16 100644 --- a/lang/Language.xref +++ b/lang/Language.xref @@ -150,9 +150,9 @@ 149 newuser.c |User name already exists 150 mail.c |Checking your mail box ... 151 page.c | MBSE BBS Chat -152 page.c |The SysOp is currently speaking to somebody else on +152 page.c |The SysOp is currently speaking to somebody else. 153 page.c |Try paging him again in a few minutes ... -154 page.c ||You have paged the Sysop the maximum times allowed. +154 page.c |You have paged the Sysop the maximum times allowed. 155 page.c |Sysop currently is not available ... please leave a comment 156 mail.c |Posting message in area: 157 mail.c |From : diff --git a/lang/dutch.txt b/lang/dutch.txt index e39d5d3c..a7292c9e 100644 --- a/lang/dutch.txt +++ b/lang/dutch.txt @@ -150,7 +150,7 @@ JN|berichten, nu de post lezen? [J/n]: |Gebruikersnaam bestaat al |Even in Uw postbus kijken ... | MBSE BBS Kletsen -|De Sysop is nu even met iemand anders in gesprek op +|De Sysop is nu even met iemand anders in gesprek. |Probeer het opnieuw in enkele minuten ... |U heeft de Sysop meer dan het maximaal aantal keren geroepen. |De Sysop is niet aanwezig ... laat een bericht achter diff --git a/lang/english.txt b/lang/english.txt index eaa23a58..03a96182 100644 --- a/lang/english.txt +++ b/lang/english.txt @@ -150,7 +150,7 @@ YN|messages, read your mail now? [Y/n]: |User name already exists |Checking your mail box ... | MBSE BBS Chat -|The SysOp is currently speaking to somebody else on +|The SysOp is currently speaking to somebody else. |Try paging him again in a few minutes ... |You have paged the Sysop the maximum times allowed. |Sysop currently is not available ... please leave a comment diff --git a/lang/galego.txt b/lang/galego.txt index fee88dd2..03119179 100644 --- a/lang/galego.txt +++ b/lang/galego.txt @@ -150,7 +150,7 @@ SN|mensaxes, |O nome xa existe |Buscando correo novo ... | Charla de MBSE BBS -|O Sysop est  falando con outro usuario en +|O Sysop est  falando con outro usuario. |Intenta chamalo de novo dentro de un pouco ... |Xa chamacves moitas veces. |O SysOp non est  ... ¨por que non lle deixas unha mensaxe? diff --git a/lang/german.txt b/lang/german.txt index 0c178d34..bc12f527 100644 --- a/lang/german.txt +++ b/lang/german.txt @@ -150,7 +150,7 @@ JN|Mitteilungen, moechten Sie jetzt Ihre Post lesen? [J/n]: |Dieser Benutzername existiert bereits |Suchen nach persoenlichen Mitteilungen, bitte warten ... | MBSE BBS Chat -|Der SysOp spricht gerade mit einem anderen User auf +|Der SysOp spricht gerade mit einem anderen User. |Bitte versuchen Sie es in einigen Minuten nochmals ... |Ihre maximale Anzahl von Sysop-Anrufen ist erreicht. |Sysop ist zurzeit nicht erreichbar. Bitte hinterlassen Sie eine Mitteilung... diff --git a/lang/italian.txt b/lang/italian.txt index 01c584da..cb11235c 100644 --- a/lang/italian.txt +++ b/lang/italian.txt @@ -150,7 +150,7 @@ SN|nuovi messaggi, vuoi leggere la posta ora? [S/n]: |Nome utente gia' in uso |Sto controllando la tua mail box ... | MBSE BBS Chat -|Il SysOp sta parlando con un altro utente su +|Il SysOp sta parlando con un altro utente. |Prova a chiamarlo di nuovo fra pochi minuti ... |Hai gia' chiamato il SysOp per il massimo numero di volte consentito. |Il SysOp non e' al momento disponibile ... lascia un messaggio diff --git a/lang/spanish.txt b/lang/spanish.txt index 115d8dff..2db9e77a 100644 --- a/lang/spanish.txt +++ b/lang/spanish.txt @@ -150,7 +150,7 @@ SN|mensajes, |El nombre ya existe |Buscando correo nuevo ... | Charla de mbsebbs -|El Sysop est  hablando con otro usuario en +|El Sysop est  hablando con otro usuario. |Intenta llamarlo de nuevo dentro de un rato ... |Ya has llamado muchas veces. |El SysOp no est  ... ¨por que no le dejas un mensaje? diff --git a/mbmon/mutil.c b/mbmon/mutil.c index cfa53c9b..3e5f17a1 100644 --- a/mbmon/mutil.c +++ b/mbmon/mutil.c @@ -41,39 +41,39 @@ int bbs_free; unsigned char readkey(int y, int x, int fg, int bg) { - int rc = -1, i; - unsigned char ch = 0; + int rc = -1, i; + unsigned char ch = 0; - if ((ttyfd = open("/dev/tty", O_RDWR|O_NONBLOCK)) < 0) { - perror("open /dev/tty"); - exit(MBERR_TTYIO_ERROR); - } - Setraw(); + if ((ttyfd = open("/dev/tty", O_RDWR|O_NONBLOCK)) < 0) { + perror("open /dev/tty"); + exit(MBERR_TTYIO_ERROR); + } + Setraw(); - i = 0; - while (rc == -1) { - if ((i % 10) == 0) - show_date(fg, bg, 0, 0); + i = 0; + while (rc == -1) { + if ((i % 10) == 0) + show_date(fg, bg, 0, 0); - locate(y, x); - fflush(stdout); - rc = Waitchar(&ch, 5); - if ((rc == 1) && (ch != KEY_ESCAPE)) - break; + locate(y, x); + fflush(stdout); + rc = Waitchar(&ch, 5); + if ((rc == 1) && (ch != KEY_ESCAPE)) + break; - if ((rc == 1) && (ch == KEY_ESCAPE)) - rc = Escapechar(&ch); + if ((rc == 1) && (ch == KEY_ESCAPE)) + rc = Escapechar(&ch); - if (rc == 1) - break; - i++; - Nopper(); - } + if (rc == 1) + break; + i++; + Nopper(); + } - Unsetraw(); - close(ttyfd); + Unsetraw(); + close(ttyfd); - return ch; + return ch; } @@ -369,48 +369,79 @@ void set_color(int f, int b) static time_t lasttime; /* - * Show the current date & time in the second status row + * Show the current date & time in the second status row. + * Show user paging status in third screen row. */ void show_date(int fg, int bg, int y, int x) { - time_t now; - char *p, buf[128]; + time_t now; + char *p, buf[128], *pid, *page, *reason; - now = time(NULL); - if (now != lasttime) { - lasttime = now; - set_color(LIGHTGREEN, BLUE); - p = ctime(&now); - Striplf(p); - mvprintw(1, 44, (char *)"%s TZUTC %s", p, gmtoffset(now)); - p = asctime(gmtime(&now)); - Striplf(p); - mvprintw(2, 44, (char *)"%s UTC", p); + now = time(NULL); + if (now != lasttime) { + lasttime = now; + set_color(LIGHTGREEN, BLUE); + p = ctime(&now); + Striplf(p); + mvprintw(1, 44, (char *)"%s TZUTC %s", p, gmtoffset(now)); + p = asctime(gmtime(&now)); + Striplf(p); + mvprintw(2, 44, (char *)"%s UTC", p); - /* - * Indicator if bbs is free - */ - strcpy(buf, SockR("SFRE:0;")); - if (strncmp(buf, "100:0;", 6) == 0) { - strcpy(buf, SockR("SBBS:0;")); - if (strncmp(buf, "100:2,1", 7) == 0) { - set_color(WHITE, RED); - mvprintw(2,74, (char *)" Down "); - } else { - set_color(WHITE, BLUE); - mvprintw(2,74, (char *)" Free "); - } - bbs_free = TRUE; - } else { - set_color(WHITE, RED); - mvprintw(2,74, (char *)" Busy "); - bbs_free = FALSE; - } - - if (y && x) - locate(y, x); - set_color(fg, bg); + /* + * Indicator if bbs is free + */ + strcpy(buf, SockR("SFRE:0;")); + if (strncmp(buf, "100:0;", 6) == 0) { + strcpy(buf, SockR("SBBS:0;")); + if (strncmp(buf, "100:2,1", 7) == 0) { + set_color(WHITE, RED); + mvprintw(2,74, (char *)" Down "); + } else { + set_color(WHITE, BLUE); + mvprintw(2,74, (char *)" Free "); + } + bbs_free = TRUE; + } else { + set_color(WHITE, RED); + mvprintw(2,74, (char *)" Busy "); + bbs_free = FALSE; } + + /* + * Check paging status + */ + strcpy(buf, SockR("CCKP:0;")); + if (strcmp(buf, "100:0;") == 0) { + locate(3, 1); + set_color(LIGHTGRAY, BLACK); + clrtoeol(); + } else { + pid = strtok(buf, ","); + pid = strtok(NULL, ","); + page = strtok(NULL, ","); + reason = strtok(NULL, "\0"); + reason[strlen(reason)-1] = '\0'; + if (strlen(reason) > 60) + reason[60] = '\0'; + + locate(3, 1); + if (strcmp(page, "1")) { + set_color(RED, BLACK); + mvprintw(3, 1, " Old page (%s) %-60s", pid, reason); + if ((now % 10) == 0) /* Every 10 seconds */ + putchar(7); + } else { + set_color(LIGHTRED, BLACK); + mvprintw(3, 1, " Sysop page (%s) %-60s", pid, reason); + putchar(7); /* Each second */ + } + } + + if (y && x) + locate(y, x); + set_color(fg, bg); + } } @@ -528,13 +559,13 @@ void working(int txno, int y, int x) */ void clr_index() { - int i; + int i; - set_color(LIGHTGRAY, BLACK); - for (i = 3; i <= (LINES - 1); i++) { - locate(i, 1); - clrtoeol(); - } + set_color(LIGHTGRAY, BLACK); + for (i = 4; i <= (LINES - 1); i++) { + locate(i, 1); + clrtoeol(); + } } diff --git a/mbsebbs/Makefile b/mbsebbs/Makefile index 13f86004..31cc61bb 100644 --- a/mbsebbs/Makefile +++ b/mbsebbs/Makefile @@ -10,7 +10,7 @@ SRCS = signature.c filesub.c language.c mbtoberep.c \ bye.c funcs.c mail.c \ newuser.c pinfo.c timecheck.c change.c \ exitinfo.c mball.c mbsebbs.c menu.c pop3.c lastcallers.c \ - timeout.c chat.c file.c mbchat.c mbstat.c misc.c \ + timeout.c chat.c file.c mbstat.c misc.c \ offline.c user.c mbnewusr.c input.c whoson.c \ door.c dispfile.c userlist.c timestats.c logentry.c HDRS = signature.h filesub.h language.h mbsebbs.h misc.h offline.h \ @@ -38,8 +38,6 @@ MBALL_OBJS = mball.o MBALL_LIBS = ../lib/libmemwatch.a ../lib/libclcomm.a ../lib/libcommon.a ../lib/libdbase.a MBLANG_OBJS = mblang.o MBLANG_LIBS = ../lib/libmemwatch.a ../lib/libclcomm.a ../lib/libcommon.a ../lib/libdbase.a -MBCHAT_OBJS = mbchat.o -MBCHAT_LIBS = ../lib/libmemwatch.a ../lib/libclcomm.a ../lib/libcommon.a ../lib/libdbase.a MBSTAT_OBJS = mbstat.o MBSTAT_LIBS = ../lib/libmemwatch.a ../lib/libclcomm.a ../lib/libcommon.a ../lib/libdbase.a MBTOBE_OBJS = mbtoberep.o @@ -47,7 +45,7 @@ MBTOBE_LIBS = ../lib/libmemwatch.a ../lib/libclcomm.a ../lib/libcommon.a ../lib/ MBUSER_OBJS = mbuser.o MBUSER_LIBS = ../lib/libmemwatch.a ../lib/libclcomm.a ../lib/libcommon.a ../lib/libdbase.a OTHER = Makefile -TARGET = mbsebbs mbnewusr mball mblang mbchat mbstat mbtoberep mbuser +TARGET = mbsebbs mbnewusr mball mblang mbstat mbtoberep mbuser ############################################################################################################# @@ -75,10 +73,6 @@ mblang: ${MBLANG_OBJS} ${MBLANG_LIBS} ${CC} -o mblang ${MBLANG_OBJS} ${LIBS} ${MBLANG_LIBS} strip mblang -mbchat: ${MBCHAT_OBJS} ${MBCHAT_LIBS} - ${CC} -o mbchat ${MBCHAT_OBJS} ${LIBS} ${MBCHAT_LIBS} - strip mbchat - mbstat: ${MBSTAT_OBJS} ${MBSTAT_LIBS} ${CC} -o mbstat ${MBSTAT_OBJS} ${LIBS} ${MBSTAT_LIBS} strip mbstat @@ -99,11 +93,10 @@ install: all ${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 6711 mbnewusr ${BINDIR} ${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0711 mball ${BINDIR} ${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0711 mblang ${BINDIR} - ${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0711 mbchat ${BINDIR} ${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0711 mbstat ${BINDIR} ${INSTALL} -c -s -o ${OWNER} -g ${GROUP} -m 0711 mbtoberep ${BINDIR} ${INSTALL} -c -s -o `id -un` -g `id -gn` -m 6711 mbuser ${BINDIR} - @rm -f mbuseradd mbpasswd mblogin + @rm -f mbuseradd mbpasswd mblogin mbchat filelist: Makefile BASE=`pwd`; \ @@ -164,7 +157,6 @@ lastcallers.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/ timeout.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/msg.h timeout.h funcs.h bye.h filesub.h language.h chat.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h chat.h funcs.h input.h language.h misc.h whoson.h file.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h filesub.h file.h funcs.h input.h language.h misc.h timeout.h exitinfo.h whoson.h change.h -mbchat.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/structs.h ../lib/common.h ../lib/clcomm.h ../lib/mberrors.h mbstat.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/mberrors.h mbstat.h misc.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h ../lib/mberrors.h funcs.h input.h language.h misc.h timeout.h exitinfo.h offline.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/structs.h ../lib/mbse.h ../lib/users.h ../lib/records.h ../lib/bluewave.h ../lib/common.h ../lib/clcomm.h ../lib/msgtext.h ../lib/msg.h mail.h funcs.h input.h language.h file.h filesub.h exitinfo.h timeout.h msgutil.h pop3.h offline.h whoson.h diff --git a/mbsebbs/chat.c b/mbsebbs/chat.c index 8bf035f5..575f33bb 100644 --- a/mbsebbs/chat.c +++ b/mbsebbs/chat.c @@ -49,9 +49,7 @@ #define DEVICE "/tmp/chatdev" - - -void Chat(void) +void Chat(int channel) { FILE *pGetDev, *pLog, *pBusy, *pChat; int ch; @@ -60,7 +58,7 @@ void Chat(void) char *sLog = NULL; char temp[81] = ""; - if(CFG.iAutoLog) + if (CFG.iAutoLog) sLog = calloc(56, sizeof(char)); WhosDoingWhat(SYSOPCHAT); diff --git a/mbsebbs/chat.h b/mbsebbs/chat.h index 766333be..29d347be 100644 --- a/mbsebbs/chat.h +++ b/mbsebbs/chat.h @@ -1,8 +1,8 @@ #ifndef _CHAT_H #define _CHAT_H -void Chat(void); /* Chat Function */ +/* $Id$ */ + +void Chat(int); /* Chat Function */ #endif - - diff --git a/mbsebbs/mbchat.c b/mbsebbs/mbchat.c deleted file mode 100644 index dc204365..00000000 --- a/mbsebbs/mbchat.c +++ /dev/null @@ -1,259 +0,0 @@ -/***************************************************************************** - * - * $Id$ - * Purpose ...............: Sysop chat utility. - * - ***************************************************************************** - * Copyright (C) 1997-2002 - * - * Michiel Broek FIDO: 2:2801/2802 - * Beekmansbos 10 - * 1971 BV IJmuiden - * the Netherlands - * - * This file is part of MBSE BBS. - * - * This BBS is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * MBSE BBS is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MBSE BBS; see the file COPYING. If not, write to the Free - * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - *****************************************************************************/ - -#include "../config.h" -#include "../lib/libs.h" -#include "../lib/memwatch.h" -#include "../lib/structs.h" -#include "../lib/common.h" -#include "../lib/clcomm.h" -#include "../lib/mberrors.h" - - -char *ttime2(void); /* Returns current time HH:MM */ - -struct sysconfig CFG; - - -int main(int argc, char **argv) -{ - FILE *fp1, *pChatDev, *pPid, *pLog; - FILE *pDataFile; - int ch; - int iLetter = 0; - short ipid; - char *tty; - char *sStr1= (char *)""; - char pid[81]; - char pid1[20]; - char sTTY[10]; - char *sLog= (char *)""; - char *Config, *FileName, *LogName; - char *BBSpath; - -#ifdef MEMWATCH - mwInit(); -#endif - - FileName = calloc(PATH_MAX, sizeof(char)); - Config = calloc(PATH_MAX, sizeof(char)); - LogName = calloc(PATH_MAX, sizeof(char)); - - if ((BBSpath = getenv("MBSE_ROOT")) == NULL) { - printf("Could not get MBSE_ROOT environment variable\n"); - printf("Please set the environment variable ie:\n\n"); - printf("\"MBSE_ROOT=/usr/local/mbse;export MBSE_ROOT\"\n\n"); -#ifdef MEMWATCH - mwTerm(); -#endif - exit(MBERR_INIT_ERROR); - } - - sprintf(FileName, "%s/etc/config.data", BBSpath); - - if ((pDataFile = fopen(FileName, "rb")) == NULL) { - perror("\n\nFATAL ERROR: Can't open config.data for reading!!!"); - printf("Please run mbsetup to create configuration file.\n"); - printf("Or check that your MBSE_ROOT variable is set to the BBS Path!\n"); -#ifdef MEMWATCH - mwTerm(); -#endif - exit(MBERR_CONFIG_ERROR); - } - fread(&CFG, sizeof(CFG), 1, pDataFile); - fclose(pDataFile); - free(Config); - free(FileName); - - if(CFG.iAutoLog) - sLog = calloc(56, sizeof(char)); - - if(argc != 2) { - printf("\nSCHAT: MBSE BBS %s Sysop chat facilty\n", VERSION); - printf(" %s\n", COPYRIGHT); - - printf("\nCommand-line parameters:\n\n"); - - printf(" %s ", *(argv)); - - printf("\n"); -#ifdef MEMWATCH - mwTerm(); -#endif - exit(MBERR_COMMANDLINE); - } - - printf("\f"); - - if (strncmp( (tty = *(argv+1)), "/dev/", 5 ) == 0 ) { - tty+=5; - sprintf(pid,"%s/bbs/exitinfo", CFG.bbs_usersdir); - strcpy(sTTY,""); - } else { - sprintf(pid,"%s/bbs/exitinfo", CFG.bbs_usersdir); - strcpy(sTTY,"/dev/"); - } - - strcat(sTTY, *(argv + 1)); - - if(( fp1 = fopen(sTTY,"w")) == NULL) - perror("Error"); - - if(( pPid = fopen(pid,"r")) == NULL) { - printf("\nThere is no user on %s\n", pid); -#ifdef MEMWATCH - mwTerm(); -#endif - exit(MBERR_COMMANDLINE); - } else { - fgets(pid1,19,pPid); - fclose(pPid); - } - - ipid = atoi(pid1); - - if(( pChatDev = fopen("/tmp/chatdev","w")) == NULL) - perror("Can't open file"); - else { - sStr1=ttyname(1); - fprintf(pChatDev,"%s", sStr1); - fclose(pChatDev); - } - - if(!CFG.iExternalChat || (strlen(CFG.sExternalChat) < 1) || \ - (access(CFG.sExternalChat, X_OK) != 0)) { - printf("Users chatting device: %s\n", sTTY); - printf("Wait until the user is ready"); - printf("Press ESC to exit chat\n\n"); - - umask(00000); - chmod("/tmp/chatdev", 00777); - chmod(sStr1, 00777); - - sleep(2); - - Setraw(); - - sleep(2); - - while (1) { - ch = getc(stdin); - ch &= '\377'; - if (ch == '\033') - break; - putchar(ch); - putc(ch, fp1); - - if(CFG.iAutoLog) { - if(ch != '\b') - iLetter++; /* Count the letters user presses for logging */ - sprintf(sLog, "%s%c", sLog, ch); - } - - if (ch == '\n') { - ch = '\r'; - putchar(ch); - putc(ch, fp1); - } - - if (ch == '\r') { - ch = '\n'; - putchar(ch); - putc(ch, fp1); - } - - if (ch == '\b') { - ch = ' '; - putchar(ch); - putc(ch, fp1); - ch = '\b'; - putchar(ch); - putc(ch, fp1); - - if(CFG.iAutoLog) - sLog[--iLetter] = '\0'; - } - - /* Check if log chat is on and if so log chat to disk */ - if(CFG.iAutoLog) { - if(iLetter >= 55 || ch == '\n') { - iLetter = 0; - sprintf(LogName, "%s/log/chat.log", BBSpath); - if(( pLog = fopen(LogName, "a+")) != NULL) { - fflush(pLog); - fprintf(pLog, "%s [%s]: %s\n", CFG.sysop_name, ttime2(), sLog); - fclose(pLog); - strcpy(sLog, ""); - } else - perror("\nCan't open chat.log"); - } - } - } /* while chatting */ -// fprintf(fp1, "The sysop ended the chat, press a key.\n"); - } else { - system(CFG.sExternalChat); - printf("\n\n"); - } - - fclose(fp1); - sleep(2); - Unsetraw(); - sleep(2); - unlink("/tmp/chatdev"); - unlink("/tmp/.BusyChatting"); - fclose(fp1); - printf("Done chatting.\n"); -#ifdef MEMWATCH - mwTerm(); -#endif - exit(MBERR_OK); -} - - - -/* - * This function returns the date for today, to test against other functions - * HH:MM (HOUR-MINUTE) - */ -char *ttime2() -{ - struct tm *l_date; /* Structure for Date */ - time_t Time_Now; - static char Ttime2[9]; - - Time_Now = time(NULL); - l_date = localtime(&Time_Now); - - sprintf(Ttime2, "%02d:%02d", l_date->tm_hour,l_date->tm_min); - - return(Ttime2); -} - - diff --git a/mbsebbs/menu.c b/mbsebbs/menu.c index 75b619b3..5daf86e3 100644 --- a/mbsebbs/menu.c +++ b/mbsebbs/menu.c @@ -196,8 +196,8 @@ void menu() * before calling chat(). Make sure if a second user * logs in, that .BusyChatting does exist. */ - if(CFG.iChatPromptChk && (access("/tmp/chatdev", R_OK) == 0) && (access("/tmp/.BusyChatting", F_OK) != 0)) - Chat(); + if (CFG.iChatPromptChk && (access("/tmp/chatdev", R_OK) == 0) && (access("/tmp/.BusyChatting", F_OK) != 0)) + Chat(0); /* * Check users timeleft diff --git a/mbsebbs/page.c b/mbsebbs/page.c index bd15904f..f76ed1c4 100644 --- a/mbsebbs/page.c +++ b/mbsebbs/page.c @@ -47,19 +47,22 @@ #include "language.h" +extern pid_t mypid; + + /* * Function to Page Sysop */ void Page_Sysop(char *String) { - FILE *pWritingDevice; - int i, iOpenDevice = FALSE; /* Flag to check if you can write to CFG.sChatDevice */ - char *Reason, temp[81]; + int i; + char *Reason, temp[81]; + static char buf[128]; Reason = calloc(81, sizeof(char)); clear(); - colour(12, 0); + colour(LIGHTRED, BLACK); /* MBSE BBS Chat */ Center((char *) Language(151)); @@ -99,24 +102,10 @@ void Page_Sysop(char *String) Syslog('+', "Chat Reason: %s", temp); strcpy(Reason, temp); + } else { + sprintf(Reason, "User want's to chat"); } -// if (access("/tmp/.BusyChatting", F_OK) == 0) { -// if((pBusy = fopen("/tmp/.BusyChatting", "r")) == NULL) -// WriteError("Unable to open BusyChatting file", pTTY); -// else { -// fscanf(pBusy, "%10s", temp); -// fclose(pBusy); -// } -// colour(13, 0); -// printf("%s%s\n", (char *) Language(152), temp); -// pout(10, 0, (char *) Language(153)); -// Enter(2); -// Syslog('+', "SysOp was busy chatting to user on %s", temp); -// Pause(); -// free(Reason); -// return; -// } CFG.iMaxPageTimes--; @@ -124,70 +113,106 @@ void Page_Sysop(char *String) if (!DisplayFile((char *)"maxpage")) { /* If i is FALSE display hard coded message */ Enter(1); + /* You have paged the Sysop the maximum times allowed. */ pout(WHITE, BLACK, (char *) Language(154)); Enter(2); } Syslog('!', "Attempted to page Sysop, above maximum page limit."); Pause(); - } else { - locate(14, ((80 - strlen(String) ) / 2 - 2)); - pout(WHITE, BLACK, (char *)"["); - pout(LIGHTGRAY, BLACK, String); - pout(WHITE, BLACK, (char *)"]"); + free(Reason); + return; + } + + locate(14, ((80 - strlen(String) ) / 2 - 2)); + pout(WHITE, BLACK, (char *)"["); + pout(LIGHTGRAY, BLACK, String); + pout(WHITE, BLACK, (char *)"]"); - locate(16, ((80 - CFG.iPageLength) / 2 - 2)); - pout(WHITE, BLACK, (char *)"["); - colour(BLUE, BLACK); - for (i = 0; i < CFG.iPageLength; i++) - printf("%c", 176); - pout(WHITE, BLACK, (char *)"]"); + locate(16, ((80 - CFG.iPageLength) / 2 - 2)); + pout(WHITE, BLACK, (char *)"["); + colour(BLUE, BLACK); + for (i = 0; i < CFG.iPageLength; i++) + printf("%c", 176); + pout(WHITE, BLACK, (char *)"]"); - locate(16, ((80 - CFG.iPageLength) / 2 - 2) + 1); + locate(16, ((80 - CFG.iPageLength) / 2 - 2) + 1); - if ((pWritingDevice = fopen(CFG.sChatDevice, "w")) != NULL) { - fprintf(pWritingDevice, "\n\n\n%s is trying to page you on %s.\n", \ - usrconfig.sUserName, pTTY); + sprintf(buf, "CPAG:2,%d,%s;", mypid, Reason); + if (socket_send(buf)) { + Syslog('+', "Failed to send message to mbtask"); + free(Reason); + return; + } + strcpy(buf, socket_receive()); - fprintf(pWritingDevice, "Type: '%s/bin/schat %s' to talk to him, you have", \ - getenv("MBSE_ROOT"), pTTY); - fprintf(pWritingDevice, "\n%d seconds to respond!\n\n", CFG.iPageLength); - fprintf(pWritingDevice, "%s\n", temp); - iOpenDevice = TRUE; - } + /* + * Check if sysop is busy + */ + if (strcmp(buf, "100:1,1;") == 0) { + /* The SysOp is currently speaking to somebody else */ + pout(LIGHTMAGENTA, BLACK, (char *) Language(152)); + /* Try paging him again in a few minutes ... */ + pout(LIGHTGREEN, BLACK, (char *) Language(153)); + Enter(2); + Syslog('+', "SysOp was busy chatting with another user"); + Pause(); + free(Reason); + return; + } + /* + * Check if sysop is not available + */ + if (strcmp(buf, "100:1,2;") == 0) { + Syslog('+', "Sysop is not available for chat"); + } + + /* + * Check for other errors + */ + if (strcmp(buf, "100:1,3;") == 0) { + colour(LIGHTRED, BLACK); + printf("Internal system error, the sysop is informed"); + Enter(2); + Syslog('!', "Got error on page sysop command"); + Pause(); + free(Reason); + return; + } + + if (strcmp(buf, "100:0;") == 0) { + /* + * Page accpeted, wait until sysop responds + */ colour(LIGHTBLUE, BLACK); for (i = 0; i < CFG.iPageLength; i++) { - printf("\x07"); - /* If there weren't any problems opening the writing device */ - if (iOpenDevice) { - fprintf(pWritingDevice, "\x07"); - fflush(pWritingDevice); - } printf("%c", 219); fflush(stdout); sleep(1); - if (access("/tmp/chatdev", R_OK) == 0) { - fclose(pWritingDevice); - Chat(); - free(Reason); - return; - } + + // if drop into chat + // Chat(); + // free(Reason); + // return; } - if (iOpenDevice) { - fclose(pWritingDevice); - iOpenDevice = 0; - } - PageReason(); - printf("\n\n\n"); - Pause(); - if (strlen(Reason)) - SysopComment(Reason); - else - SysopComment((char *)"Failed chat"); + /* + * Cancel page request + */ + sprintf(buf, "CCAN:1,%d", mypid); + socket_send(buf); + strcpy(buf, socket_receive()); } + PageReason(); + printf("\n\n\n"); + Pause(); + if (strlen(Reason)) + SysopComment(Reason); + else + SysopComment((char *)"Failed chat"); + free(Reason); Pause(); } diff --git a/mbtask/taskcomm.c b/mbtask/taskcomm.c index 73edff96..83ce206e 100644 --- a/mbtask/taskcomm.c +++ b/mbtask/taskcomm.c @@ -4,7 +4,7 @@ * Purpose ...............: MBSE BBS Daemon * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -241,7 +241,7 @@ char *exe_cmd(char *in) /* * The chat commands * - * Used channels: -1 Personal messages between ordinary users. + * Used channels: -1 Personal messages between ordinary users. * 0 Sysop/user chat * 1..99 Chatting channels * @@ -259,11 +259,9 @@ char *exe_cmd(char *in) * 100:0; */ if (strncmp(cmd, "CSPM", 4) == 0) { - if ((result = reg_spm(token))) { + if ((result = reg_spm(token))) sprintf(obuf, "100:1,%d;", result); - return obuf; - } else - return obuf; + return obuf; } /* @@ -276,6 +274,31 @@ char *exe_cmd(char *in) return obuf; } + /* + * CPAG:2,pid,reason; Page sysop for a chat + * 100:1,n; 1=busy, 2=sysop not available, 3=error + * 100:0; Ok + */ + if (strncmp(cmd, "CPAG", 4) == 0) { + if ((result = reg_page(token))) { + sprintf(obuf, "100:1,%d;", result); + Syslog('+', "%s", obuf); + } + return obuf; + } + + /* + * CCAN:1,pid; Cancel sysop page + * 100:0; Always Ok + */ + if (strncmp(cmd, "CCAN", 4) == 0) { + reg_cancel(token); + return obuf; + } + + if (strncmp(cmd, "CCKP", 4) == 0) { + return reg_checkpage(token); + } /* * The G(lobal) commands. @@ -364,125 +387,122 @@ char *exe_cmd(char *in) } - /* - * The (S)tatus commands. - * - * SBBS:0; - * 100:2,n,status message; - */ - if (strncmp(cmd, "SBBS", 4) == 0) { - switch(stat_bbs_stat()) { - case 0: - sprintf(obuf, "100:2,0,The system is open for use;"); - break; - case 1: - sprintf(obuf, "100:2,1,The system is closed right now!;"); - break; - case 2: - sprintf(obuf, "100:2,2,The system is closed for Zone Mail Hour!;"); - break; - } - return obuf; + /* + * The (S)tatus commands. + * + * SBBS:0; + * 100:2,n,status message; + */ + if (strncmp(cmd, "SBBS", 4) == 0) { + switch(stat_bbs_stat()) { + case 0: sprintf(obuf, "100:2,0,The system is open for use;"); + break; + case 1: sprintf(obuf, "100:2,1,The system is closed right now!;"); + break; + case 2: sprintf(obuf, "100:2,2,The system is closed for Zone Mail Hour!;"); + break; } + return obuf; + } - /* - * SOPE:0; - * 100:0; - */ - if (strncmp(cmd, "SOPE", 4) == 0) { - stat_set_open(1); - return obuf; - } + /* + * SOPE:0; + * 100:0; + */ + if (strncmp(cmd, "SOPE", 4) == 0) { + stat_set_open(1); + return obuf; + } - /* - * SCLO:1,message; - * 100:0; - */ - if (strncmp(cmd, "SCLO", 4) == 0) { - stat_set_open(0); - return obuf; - } + /* + * SCLO:1,message; + * 100:0; + */ + if (strncmp(cmd, "SCLO", 4) == 0) { + stat_set_open(0); + return obuf; + } - /* - * SFRE:0; - * 100:1,Running utilities: n Active users: n; - * 100:0; - * 201:1,16; - */ - if (strncmp(cmd, "SFRE", 4) == 0) { - return reg_fre(); - } + /* + * SFRE:0; + * 100:1,Running utilities: n Active users: n; + * 100:0; + * 201:1,16; + */ + if (strncmp(cmd, "SFRE", 4) == 0) { + return reg_fre(); + } - /* - * SSEQ:0; - * 100:1,number; - * 200:1,16; - */ - if (strncmp(cmd, "SSEQ", 4) == 0) { - return getseq(); - } + /* + * SSEQ:0; + * 100:1,number; + * 200:1,16; + */ + if (strncmp(cmd, "SSEQ", 4) == 0) { + return getseq(); + } - /* - * SEST:1,semafore; Get status of semafore - * 100:1,n; 1 = set, 0 = not set - * 200:1,16; - */ - if (strncmp(cmd, "SEST", 4) == 0) { - return sem_status(token); - } + /* + * SEST:1,semafore; Get status of semafore + * 100:1,n; 1 = set, 0 = not set + * 200:1,16; + */ + if (strncmp(cmd, "SEST", 4) == 0) { + return sem_status(token); + } - /* - * SECR:1,semafore; Set semafore - * 100:0; - * 200:1,16; - */ - if (strncmp(cmd, "SECR", 4) == 0) { - return sem_create(token); - } + /* + * SECR:1,semafore; Set semafore + * 100:0; + * 200:1,16; + */ + if (strncmp(cmd, "SECR", 4) == 0) { + return sem_create(token); + } - /* - * SERM:1,semafore; Remove semafore - * 100:0; - * 200:1,16; - */ - if (strncmp(cmd, "SERM", 4) == 0) { - return sem_remove(token); - } + /* + * SERM:1,semafore; Remove semafore + * 100:0; + * 200:1,16; + */ + if (strncmp(cmd, "SERM", 4) == 0) { + return sem_remove(token); + } - /* - * If we got this far, there must be an error. - */ - stat_inc_serr(); - return ebuf; + /* + * If we got this far, there must be an error. + */ + stat_inc_serr(); + return ebuf; } void do_cmd(char *cmd) { - char buf[SS_BUFSIZE]; - int slen, tries = 0; + char buf[SS_BUFSIZE]; + int slen, tries = 0; - if (logtrans) - Syslog('-', "< %s", cmd); - sprintf(buf, "%s", exe_cmd(cmd)); - if (logtrans) - Syslog('-', "> %s", buf); + if (logtrans) + Syslog('-', "< %s", cmd); + sprintf(buf, "%s", exe_cmd(cmd)); + if (logtrans) + Syslog('-', "> %s", buf); - for (;;) { - slen = sendto(sock, buf, strlen(buf), 0, &from, fromlen); - if (slen == -1) - Syslog('?', "$do_cmd(): sendto error %d %s", tries, from.sun_path); - else if (slen != strlen(buf)) - Syslog('?', "do_cmd(): send %d of %d bytes, try=%d", slen, strlen(buf), tries); - else - return; - tries++; - if (tries == 3) - return; - sleep(1); - } + for (;;) { + slen = sendto(sock, buf, strlen(buf), 0, &from, fromlen); + if (slen == -1) + Syslog('?', "$do_cmd(): sendto error %d %s", tries, from.sun_path); + else if (slen != strlen(buf)) + Syslog('?', "do_cmd(): send %d of %d bytes, try=%d", slen, strlen(buf), tries); + else + return; + tries++; + if (tries == 3) + return; + sleep(1); + } } diff --git a/mbtask/taskregs.c b/mbtask/taskregs.c index e9245cf9..8feacf9d 100644 --- a/mbtask/taskregs.c +++ b/mbtask/taskregs.c @@ -36,6 +36,7 @@ #include "taskutil.h" extern reg_info reginfo[MAXCLIENT]; /* Array with clients */ +extern struct sysconfig CFG; /* System config */ static int entrypos = 0; /* Status pointer */ static int mailers = 0; /* Registered mailers */ static int sysop_present = 0; /* Sysop present */ @@ -193,19 +194,19 @@ void reg_check(void) */ int reg_doing(char *data) { - char *cnt, *pid, *line; - int rec; + char *cnt, *pid, *line; + int rec; - cnt = strtok(data, ","); - pid = strtok(NULL, ","); - line = strtok(NULL, ";"); + cnt = strtok(data, ","); + pid = strtok(NULL, ","); + line = strtok(NULL, ";"); - if ((rec = reg_find(pid)) == -1) - return -1; + if ((rec = reg_find(pid)) == -1) + return -1; - strncpy(reginfo[rec].doing, line, 35); - reginfo[rec].lastcon = time(NULL); - return 0; + strncpy(reginfo[rec].doing, line, 35); + reginfo[rec].lastcon = time(NULL); + return 0; } @@ -238,16 +239,16 @@ int reg_ip(char *data) */ int reg_nop(char *data) { - char *cnt, *pid; - int rec; + char *cnt, *pid; + int rec; - cnt = strtok(data, ","); - pid = strtok(NULL, ";"); - if ((rec = reg_find(pid)) == -1) - return -1; + cnt = strtok(data, ","); + pid = strtok(NULL, ";"); + if ((rec = reg_find(pid)) == -1) + return -1; - reginfo[rec].lastcon = time(NULL); - return 0; + reginfo[rec].lastcon = time(NULL); + return 0; } @@ -257,31 +258,31 @@ int reg_nop(char *data) */ int reg_timer(int Set, char *data) { - char *pid; - int cnt, rec, val; + char *pid; + int cnt, rec, val; - cnt = atoi(strtok(data, ",")); - if (Set) { - if (cnt != 2) - return -1; - pid = strtok(NULL, ","); - val = atoi(strtok(NULL, ";")); - if (val < 600) - val = 600; - } else { - if (cnt != 1) - return -1; - pid = strtok(NULL, ";"); - val = 600; - } + cnt = atoi(strtok(data, ",")); + if (Set) { + if (cnt != 2) + return -1; + pid = strtok(NULL, ","); + val = atoi(strtok(NULL, ";")); + if (val < 600) + val = 600; + } else { + if (cnt != 1) + return -1; + pid = strtok(NULL, ";"); + val = 600; + } - if ((rec = reg_find(pid)) == -1) - return -1; + if ((rec = reg_find(pid)) == -1) + return -1; - reginfo[rec].altime = val; - reginfo[rec].lastcon = time(NULL); - Syslog('r', "Set timeout value for %d to %d", reginfo[rec].pid, val); - return 0; + reginfo[rec].altime = val; + reginfo[rec].lastcon = time(NULL); + Syslog('r', "Set timeout value for %d to %d", reginfo[rec].pid, val); + return 0; } @@ -291,19 +292,19 @@ int reg_timer(int Set, char *data) */ int reg_tty(char *data) { - char *cnt, *pid, *tty; - int rec; + char *cnt, *pid, *tty; + int rec; - cnt = strtok(data, ","); - pid = strtok(NULL, ","); - tty = strtok(NULL, ";"); + cnt = strtok(data, ","); + pid = strtok(NULL, ","); + tty = strtok(NULL, ";"); - if ((rec = reg_find(pid)) == -1) - return -1; + if ((rec = reg_find(pid)) == -1) + return -1; - strncpy((char *)®info[rec].tty, tty, 6); - reginfo[rec].lastcon = time(NULL); - return 0; + strncpy((char *)®info[rec].tty, tty, 6); + reginfo[rec].lastcon = time(NULL); + return 0; } @@ -313,19 +314,19 @@ int reg_tty(char *data) */ int reg_silent(char *data) { - char *cnt, *pid, *line; - int rec; + char *cnt, *pid, *line; + int rec; - cnt = strtok(data, ","); - pid = strtok(NULL, ","); - line = strtok(NULL, ";"); + cnt = strtok(data, ","); + pid = strtok(NULL, ","); + line = strtok(NULL, ";"); - if ((rec = reg_find(pid)) == -1) - return -1; + if ((rec = reg_find(pid)) == -1) + return -1; - reginfo[rec].silent = atoi(line); - reginfo[rec].lastcon = time(NULL); - return 0; + reginfo[rec].silent = atoi(line); + reginfo[rec].lastcon = time(NULL); + return 0; } @@ -335,21 +336,21 @@ int reg_silent(char *data) */ int reg_user(char *data) { - char *cnt, *pid, *user, *city; - int rec; + char *cnt, *pid, *user, *city; + int rec; - cnt = strtok(data, ","); - pid = strtok(NULL, ","); - user = strtok(NULL, ","); - city = strtok(NULL, ";"); + cnt = strtok(data, ","); + pid = strtok(NULL, ","); + user = strtok(NULL, ","); + city = strtok(NULL, ";"); - if ((rec = reg_find(pid)) == -1) - return -1; + if ((rec = reg_find(pid)) == -1) + return -1; - strncpy((char *)®info[rec].uname, user, 35); - strncpy((char *)®info[rec].city, city, 35); - reginfo[rec].lastcon = time(NULL); - return 0; + strncpy((char *)®info[rec].uname, user, 35); + strncpy((char *)®info[rec].city, city, 35); + reginfo[rec].lastcon = time(NULL); + return 0; } @@ -413,36 +414,41 @@ char *reg_ipm(char *data) */ int reg_spm(char *data) { - char *cnt, *from, *too, *txt; - int ch, i; + char *cnt, *ch, *from, *too, *txt, *log; + int i; cnt = strtok(data, ","); - ch = atoi(strtok(NULL, ",")); + ch = strtok(NULL, ","); from = strtok(NULL, ","); too = strtok(NULL, ","); txt = strtok(NULL, "\0"); txt[strlen(txt)-1] = '\0'; Syslog('-', "SIPM:%s,%d,%s,%s,%s;", cnt, ch, from, too, txt); - + log = calloc(PATH_MAX, sizeof(char)); + sprintf(log, "%s/log/%s", getenv("MBSE_ROOT"), CFG.chat_log); + for (i = 0; i < MAXCLIENT; i++) { /* * Personal messages and sysop/user chat messages. */ - if (reginfo[i].pid && (strcasecmp(reginfo[i].uname, too) == 0) && ((ch == -1) || (ch == 0)) && (ch == reginfo[i].channel)) { + if (reginfo[i].pid && (strcasecmp(reginfo[i].uname, too) == 0) && + ((atoi(ch) == -1) || (atoi(ch) == 0)) && (atoi(ch) == reginfo[i].channel)) { /* * If the in and out pointers are the same and the * message present flag is still set, then this user * can't get anymore new messages. */ if (reginfo[i].ismsg && (reginfo[i].ptr_in == reginfo[i].ptr_out)) { + free(log); return 2; } /* * If user has the "do not distrurb" flag set, but the sysop ignore's this. */ - if (reginfo[i].silent && (ch == -1)) { + if (reginfo[i].silent && (atoi(ch) == -1)) { + free(log); return 1; } @@ -457,14 +463,19 @@ int reg_spm(char *data) reginfo[i].ptr_in = 0; reginfo[i].ismsg = TRUE; + if (CFG.iAutoLog && strlen(CFG.chat_log)) { + ulog(log, (char *)"+", from, ch, txt); + } + Syslog('+', "reg_spm: in=%d out=%d ismsg=%d", reginfo[i].ptr_in, reginfo[i].ptr_out, reginfo[i].ismsg); + free(log); return 0; } /* * Chat messages, they are send to each user that is chatting in the right channel. */ - if (reginfo[i].pid && reginfo[i].chatting && reginfo[i].channel == ch) { + if (reginfo[i].pid && reginfo[i].chatting && reginfo[i].channel == atoi(ch)) { if (reginfo[i].ismsg && (reginfo[i].ptr_in == reginfo[i].ptr_out)) { Syslog('!', "reg_spm: buffer full for %s", reginfo[i].uname); } else { @@ -475,13 +486,19 @@ int reg_spm(char *data) else reginfo[i].ptr_in = 0; reginfo[i].ismsg = TRUE; + + if (CFG.iAutoLog && strlen(CFG.chat_log)) { + ulog(log, (char *)"+", from, ch, txt); + } + Syslog('+', "reg_spm: user=%s in=%d out=%d ismsg=%d", reginfo[i].uname, reginfo[i].ptr_in, reginfo[i].ptr_out, reginfo[i].ismsg); } } } - if ((ch == -1) || (ch == 0)) + free(log); + if ((atoi(ch) == -1) || (atoi(ch) == 0)) return 3; // Error return 0; // Ok } @@ -490,37 +507,37 @@ int reg_spm(char *data) char *reg_fre(void) { - static char buf[80]; - int i, users = 0, utils = 0; + static char buf[80]; + int i, users = 0, utils = 0; - buf[0] = '\0'; + buf[0] = '\0'; - for (i = 1; i < MAXCLIENT; i++) { - if (reginfo[i].pid) { - if ((!strncmp(reginfo[i].prg, "mbsebbs", 7)) || - (!strncmp(reginfo[i].prg, "mbnewusr", 8)) || - (!strncmp(reginfo[i].prg, "mbftpd", 6))) - users++; + for (i = 1; i < MAXCLIENT; i++) { + if (reginfo[i].pid) { + if ((!strncmp(reginfo[i].prg, "mbsebbs", 7)) || + (!strncmp(reginfo[i].prg, "mbnewusr", 8)) || + (!strncmp(reginfo[i].prg, "mbftpd", 6))) + users++; - if ((!strncmp(reginfo[i].prg, "mbfido", 6)) || - (!strncmp(reginfo[i].prg, "mbmail", 6)) || - (!strncmp(reginfo[i].prg, "mball", 5)) || - (!strncmp(reginfo[i].prg, "mbaff", 5)) || - (!strncmp(reginfo[i].prg, "mbcico", 6)) || - (!strncmp(reginfo[i].prg, "mbfile", 6)) || - (!strncmp(reginfo[i].prg, "mbmsg", 5)) || - (!strncmp(reginfo[i].prg, "mbindex", 7)) || - (!strncmp(reginfo[i].prg, "mbdiff", 6)) || - (!strncmp(reginfo[i].prg, "mbuser", 6))) - utils++; - } + if ((!strncmp(reginfo[i].prg, "mbfido", 6)) || + (!strncmp(reginfo[i].prg, "mbmail", 6)) || + (!strncmp(reginfo[i].prg, "mball", 5)) || + (!strncmp(reginfo[i].prg, "mbaff", 5)) || + (!strncmp(reginfo[i].prg, "mbcico", 6)) || + (!strncmp(reginfo[i].prg, "mbfile", 6)) || + (!strncmp(reginfo[i].prg, "mbmsg", 5)) || + (!strncmp(reginfo[i].prg, "mbindex", 7)) || + (!strncmp(reginfo[i].prg, "mbdiff", 6)) || + (!strncmp(reginfo[i].prg, "mbuser", 6))) + utils++; } + } - if (users || utils) - sprintf(buf, "100:1,Running utilities: %02d Active users: %02d;", utils, users); - else - sprintf(buf, "100:0;"); - return buf; + if (users || utils) + sprintf(buf, "100:1,Running utilities: %02d Active users: %02d;", utils, users); + else + sprintf(buf, "100:0;"); + return buf; } @@ -532,35 +549,131 @@ char *reg_fre(void) */ char *get_reginfo(int first) { - static char buf[256]; + static char buf[256]; - memset(&buf, 0, sizeof(buf)); - sprintf(buf, "100:0;"); + memset(&buf, 0, sizeof(buf)); + sprintf(buf, "100:0;"); - /* - * Loop forever until an error occours, eof is reached or - * the data is valid. Only in the last case valid data is - * returned to the caller. - */ - for (;;) { - if (first == 1) - entrypos = 0; - else - entrypos++; + /* + * Loop forever until an error occours, eof is reached or + * the data is valid. Only in the last case valid data is + * returned to the caller. + */ + for (;;) { + if (first == 1) + entrypos = 0; + else + entrypos++; - if (entrypos == MAXCLIENT) - return buf; + if (entrypos == MAXCLIENT) + return buf; - if ((int)reginfo[entrypos].pid != 0) { - sprintf(buf, "100:7,%d,%s,%s,%s,%s,%s,%d;", + if ((int)reginfo[entrypos].pid != 0) { + sprintf(buf, "100:7,%d,%s,%s,%s,%s,%s,%d;", reginfo[entrypos].pid, reginfo[entrypos].tty, reginfo[entrypos].uname, reginfo[entrypos].prg, reginfo[entrypos].city, reginfo[entrypos].doing, (int)reginfo[entrypos].started); - return buf; - } + return buf; } - /* never reached */ + } + /* never reached */ +} + + + +/* + * Page sysop for a chat + */ +int reg_page(char *data) +{ + char *cnt, *pid, *reason; + int i, rec; + + cnt = strtok(data, ","); + pid = strtok(NULL, ","); + reason = strtok(NULL, "\0"); + reason[strlen(reason)-1] = '\0'; + + Syslog('+', "reg_page: pid=%d, reason=\"%s\"", pid, reason); + + if (!sysop_present) + return 2; + + /* + * Check if another user is pagin the sysop or is already + * chatting with the sysop, if so, mark sysop busy. + */ + for (i = 1; i < MAXCLIENT; i++) { + if (reginfo[i].pid && (reginfo[i].pid != atoi(pid)) && (reginfo[i].channel == 0) && (reginfo[i].chatting)) + return 1; + if (reginfo[i].pid && (reginfo[i].pid != atoi(pid)) && (reginfo[i].paging)) + return 1; + } + + if ((rec = reg_find(pid)) == -1) + return 3; + + /* + * All seems well, accept the page + */ + reginfo[rec].paging = TRUE; + reginfo[rec].channel = 0; + strncpy(reginfo[rec].reason, reason, 80); + reginfo[rec].lastcon = time(NULL); + return 0; +} + + + +/* + * Cancel page sysop for a chat + */ +int reg_cancel(char *data) +{ + char *cnt, *pid; + int rec; + + cnt = strtok(data, ","); + pid = strtok(NULL, ";"); + + Syslog('+', "reg_cancel: pid=%d", pid); + + if ((rec = reg_find(pid)) == -1) + return -1; + + if (reginfo[rec].paging) { + reginfo[rec].paging = FALSE; + reginfo[rec].haspaged = TRUE; + reginfo[rec].channel = -1; + } + reginfo[rec].lastcon = time(NULL); + return 0; +} + + + +/* + * Check paging status for from mbmon + */ +char *reg_checkpage(char *data) +{ + static char buf[128]; + int i; + + memset(&buf, 0, sizeof(buf)); + for (i = 1; i < MAXCLIENT; i++) { + if (reginfo[i].pid && reginfo[i].paging) { + sprintf(buf, "100:3,%d,1,%s;", reginfo[i].pid, reginfo[i].reason); + return buf; + } + if (reginfo[i].pid && reginfo[i].haspaged) { + sprintf(buf, "100:3,%d,0,%s;", reginfo[i].pid, reginfo[i].reason); + return buf; + } + } + sprintf(buf, "100:0;"); + return buf; } diff --git a/mbtask/taskregs.h b/mbtask/taskregs.h index 01baaa00..a4ed40df 100644 --- a/mbtask/taskregs.h +++ b/mbtask/taskregs.h @@ -50,12 +50,15 @@ int reg_nop(char *); int reg_timer(int, char *); int reg_tty(char *); int reg_user(char *); -int reg_silent(char *); -char *reg_ipm(char *); -int reg_spm(char *); -char *reg_fre(void); -char *get_reginfo(int); -int reg_sysop(char *); +int reg_silent(char *); /* Set/Reset do not disturb */ +char *reg_ipm(char *); /* Check for personal/chat msg */ +int reg_spm(char *); /* Send personal/chat message */ +char *reg_fre(void); /* Check if system is free */ +char *get_reginfo(int); /* Get registration info */ +int reg_sysop(char *); /* Registrate sysop presence */ +int reg_page(char *); /* Page sysop for chat */ +int reg_cancel(char *); /* Cancel sysop page */ +char *reg_checkpage(char *); /* Check paging status */ #endif