This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-mbse/mbsebbs/exitinfo.c
2001-11-02 22:08:33 +00:00

415 lines
9.3 KiB
C

/*****************************************************************************
*
* File ..................: bbs/exitinfo.c
* Purpose ...............: Exitinfo functions
* Last modification date : 26-Oct-2001
*
*****************************************************************************
* Copyright (C) 1997-2001
*
* Michiel Broek FIDO: 2:280/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 "../lib/libs.h"
#include "../lib/mbse.h"
#include "../lib/structs.h"
#include "../lib/records.h"
#include "../lib/common.h"
#include "../lib/clcomm.h"
#include "funcs.h"
#include "funcs4.h"
#include "language.h"
#include "oneline.h"
#include "misc.h"
#include "bye.h"
#include "timeout.h"
#include "timecheck.h"
#include "exitinfo.h"
extern int LC_Download, LC_Upload, LC_Read, LC_Chat, LC_Olr, LC_Door;
/*
* Copy usersrecord into ~/tmp/.bbs-exitinfo.tty
*/
void InitExitinfo()
{
FILE *pUsrConfig, *pExitinfo;
char *temp;
long offset;
temp = calloc(PATH_MAX, sizeof(char));
sprintf(temp, "%s/etc/users.data", getenv("MBSE_ROOT"));
if ((pUsrConfig = fopen(temp,"r+b")) == NULL) {
WriteError("$Can't open %s for writing", temp);
free(temp);
return;
}
fread(&usrconfighdr, sizeof(usrconfighdr), 1, pUsrConfig);
offset = usrconfighdr.hdrsize + (grecno * usrconfighdr.recsize);
if(fseek(pUsrConfig, offset, 0) != 0) {
WriteError("$Can't move pointer in %s", temp);
free(temp);
Good_Bye(1);
}
fread(&usrconfig, usrconfighdr.recsize, 1, pUsrConfig);
exitinfo = usrconfig;
fclose(pUsrConfig);
sprintf(temp, "%s/tmp/.bbs-exitinfo.%s", getenv("MBSE_ROOT"), pTTY);
mkdirs(temp);
if ((pExitinfo = fopen(temp, "w+b")) == NULL)
WriteError("$Can't open %s for writing", temp);
else {
fwrite(&exitinfo, sizeof(exitinfo), 1, pExitinfo);
fclose(pExitinfo);
}
free(temp);
}
/*
* Function will re-read users file in memory, so the latest information
* is available to other functions
*/
void ReadExitinfo()
{
FILE *pExitinfo;
char *temp;
temp = calloc(PATH_MAX, sizeof(char));
sprintf(temp, "%s/tmp/.bbs-exitinfo.%s", getenv("MBSE_ROOT"), pTTY);
mkdirs(temp);
if(( pExitinfo = fopen(temp,"r+b")) == NULL)
InitExitinfo();
else {
fflush(stdin);
fread(&exitinfo, sizeof(exitinfo), 1, pExitinfo);
fclose(pExitinfo);
}
free(temp);
}
/*
* Function will rewrite userinfo from memory, so the latest information
* is available to other functions
*/
void WriteExitinfo()
{
FILE *pExitinfo;
char *temp;
temp = calloc(PATH_MAX, sizeof(char));
sprintf(temp, "%s/tmp/.bbs-exitinfo.%s", getenv("MBSE_ROOT"), pTTY);
if(( pExitinfo = fopen(temp,"w+b")) == NULL)
WriteError("$WriteExitinfo() failed");
else {
fwrite(&exitinfo, sizeof(exitinfo), 1, pExitinfo);
fclose(pExitinfo);
}
free(temp);
}
/*
* Function to display what users are currently On-Line and what they
* are busy doing
*/
void WhosOn(char *OpData)
{
FILE *pExitinfo;
DIR *Directory;
char *Heading, *Underline, *temp, *tmp, *device;
struct dirent *Dir;
int i, x;
Underline = calloc(81, sizeof(char));
Heading = calloc(81, sizeof(char));
temp = calloc(PATH_MAX, sizeof(char));
tmp = calloc(PATH_MAX, sizeof(char));
WhosDoingWhat(WHOSON);
clear();
Enter(1);
colour(15, 0);
sprintf(Heading, "%s%s", (char *) Language(414), CFG.bbs_name);
Center(Heading);
x = strlen(Heading);
for(i = 0; i < x; i++)
sprintf(Underline, "%s%c", Underline, exitinfo.GraphMode ? 196 : 45);
colour(12, 0);
Center(Underline);
printf("\n");
pout(10, 0, (char *) Language(415));
Enter(1);
colour(2, 0);
fLine(79);
sprintf(tmp, "%s/tmp", getenv("MBSE_ROOT"));
if ((Directory = opendir(tmp)) != NULL)
while ((Dir = readdir( Directory )) != NULL)
if((strstr(Dir->d_name, ".bbs-exitinfo.")) != NULL) {
sprintf(temp, "%s/%s", tmp, Dir->d_name);
if(( pExitinfo = fopen(temp, "rb")) != NULL) {
fread(&exitinfo, sizeof(exitinfo), 1, pExitinfo);
colour(11, 0);
if((strcmp(OpData, "/H")) == 0) {
if((strcmp(exitinfo.sHandle, "") != 0 && *(exitinfo.sHandle) != ' '))
printf("%-30s", exitinfo.sHandle);
else
printf("%-30s", exitinfo.sUserName);
} else
printf("%-30s", exitinfo.sUserName);
colour(9, 0);
if((device = strstr(Dir->d_name, "tty")) != NULL)
printf("%-9s", device);
else
printf("%-9s", "None");
colour(15, 0);
/* Browseng */
if(exitinfo.iStatus == BROWSING)
printf("%-15s", (char *) Language(418));
/* Downloading */
else if(exitinfo.iStatus == DOWNLOAD)
printf("%-15s", (char *) Language(419));
/* Uploading */
else if(exitinfo.iStatus == UPLOAD)
printf("%-15s", (char *) Language(420));
/* Msg Section */
else if(exitinfo.iStatus == READ_POST)
printf("%-15s", (char *) Language(421));
/* External Door */
else if(exitinfo.iStatus == DOOR)
printf("%-15s", (char *) Language(422));
/* Chatting */
else if(exitinfo.iStatus == SYSOPCHAT)
printf("%-15s", (char *) Language(423));
/* Listing Files */
else if(exitinfo.iStatus == FILELIST)
printf("%-15s", (char *) Language(424));
/* Banking Door */
else if(exitinfo.iStatus == TIMEBANK)
printf("%-15s", (char *) Language(426));
/* Safe Door */
else if(exitinfo.iStatus == SAFE)
printf("%-15s", (char *) Language(427));
/* WhosOn List */
else if(exitinfo.iStatus == WHOSON)
printf("%-15s", (char *) Language(428));
/* Idle */
else
printf("%s", (char *) Language(429));
colour(12, 0);
printf("%-25s\n", exitinfo.sLocation);
fclose(pExitinfo);
}
}
closedir(Directory);
ReadExitinfo();
colour(2, 0);
fLine(79);
free(tmp);
free(temp);
free(Underline);
free(Heading);
printf("\n");
}
/*
* Function will update users file and and update exitinfo.iStatus
*/
void WhosDoingWhat(int iStatus)
{
char *temp;
temp = calloc(PATH_MAX, sizeof(char));
ReadExitinfo();
exitinfo.iStatus = iStatus;
WriteExitinfo();
switch(iStatus) {
case BROWSING:
strcpy(temp, "Browsing Menus");
break;
case DOWNLOAD:
strcpy(temp, "Downloading");
LC_Download = TRUE;
break;
case UPLOAD:
strcpy(temp, "Uploading");
LC_Upload = TRUE;
break;
case READ_POST:
strcpy(temp, "Read/post Messages");
LC_Read = TRUE;
break;
case DOOR:
strcpy(temp, "External Door");
LC_Door = TRUE;
break;
case SYSOPCHAT:
strcpy(temp, "Sysop Chat");
LC_Chat = TRUE;
break;
case FILELIST:
strcpy(temp, "List Files");
break;
case TIMEBANK:
strcpy(temp, "Time Bank");
LC_Door = TRUE;
break;
case SAFE:
strcpy(temp, "Safe Cracker");
LC_Door = TRUE;
break;
case WHOSON:
strcpy(temp, "View Whoson List");
break;
case OLR:
strcpy(temp, "Offline Reader");
LC_Olr = TRUE;
break;
}
IsDoing(temp);
free(temp);
}
/*
* Function will allow a user to send a on-line message to another user
* It will prompt the user for the username. The message is sent thru
* mbsed, from the resonse message we can see if we succeeded.
*/
void SendOnlineMsg(char *OpData)
{
static char buf[128];
char *User, *String;
User = calloc(36, sizeof(char));
String = calloc(77, sizeof(char));
WhosOn(OpData);
/* Please enter username to send message to: */
pout(3, 0, (char *) Language(430));
colour(CFG.InputColourF, CFG.InputColourB);
fflush(stdout);
GetstrC(User, 35);
if (!strcmp(User, "")) {
free(User);
free(String);
return;
}
/* Please enter message to send (Max 76 Characters) */
pout(10, 0, (char *)Language(433));
pout(10, 0, (char *)"\n> ");
colour(CFG.InputColourF, CFG.InputColourB);
fflush(stdout);
GetstrC(String, 76);
if ((strcmp(String, "")) != 0) {
buf[0] = '\0';
sprintf(buf, "CSPM:3,%s,%s,%s;", strcmp(OpData, "/H") != 0 ? exitinfo.sUserName : \
strcmp(exitinfo.sHandle, "") == 0 ? exitinfo.sUserName : \
exitinfo.sHandle, User, String);
if (socket_send(buf) == 0) {
strcpy(buf, socket_receive());
if (strncmp(buf, "100:1,3;", 8) == 0) {
/* Sorry, there is no user on */
printf("\n%s %s\n\n", (char *) Language(431), User);
}
if (strncmp(buf, "100:1,2;", 8) == 0) {
printf("\nNo more room in users message buffer\n\n");
}
if (strncmp(buf, "100:1,1;", 8) == 0) {
colour(12, 0);
/* doesn't wish to be disturbed */
printf("\n%s %s\n", User, (char *) Language(432));
}
if (strncmp(buf, "100:0;", 6) == 0) {
printf("Message Sent!\n");
Syslog('+', "Online msg to %s: \"%s\"", User, String);
}
}
}
free(User);
free(String);
Pause();
}