chatfuncs.c 3.16 KiB
#include <sys/types.h>
#include <sys/uio.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
#include <utime.h>
#include <unistd.h>
#include "sbbs.h"
#include "chatfuncs.h"
#define PCHAT_LEN 1000
char usrname[128];
static node_t node;
static int nodenum;
static int in,out;
static char inpath[MAX_PATH+1];
static char outpath[MAX_PATH+1];
static scfg_t cfg;
static int togglechat(int on)
{
static int org_act;
int nodefile;
if(getnodedat(&cfg,nodenum,&node,&nodefile))
return(-1);
if(on) {
org_act=node.action;
if(org_act==NODE_PCHT)
org_act=NODE_MAIN;
node.misc|=NODE_LCHAT;
}
else {
node.action=org_act;
node.misc&=~NODE_LCHAT;
}
if(putnodedat(&cfg,nodenum,&node,nodefile))
return(-1);
return(0);
}
int chat_open(int node_num, char *ctrl_dir)
{
char *p;
char str[1024];
/* Read .cfg files here */
memset(&cfg,0,sizeof(cfg));
cfg.size=sizeof(cfg);
SAFECOPY(cfg.ctrl_dir,ctrl_dir);
if(!load_cfg(&cfg, NULL, TRUE, str))
return(-1);
nodenum=node_num;
if(getnodedat(&cfg,nodenum,&node,NULL))
return(-1);
username(&cfg,node.useron,usrname);
sprintf(outpath,"%slchat.dab",cfg.node_path[nodenum-1]);
if((out=sopen(outpath,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE
,S_IREAD|S_IWRITE))==-1) {
return(-1);
}
sprintf(inpath,"%schat.dab",cfg.node_path[nodenum-1]);
if((in=sopen(inpath,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE
,S_IREAD|S_IWRITE))==-1) {
close(out);
return(-1);
}
if((p=(char *)malloc(PCHAT_LEN))==NULL) {
close(in);
close(out);
return(-1);
}
memset(p,0,PCHAT_LEN);
write(in,p,PCHAT_LEN);
write(out,p,PCHAT_LEN);
free(p);
lseek(in,0,SEEK_SET);
lseek(out,0,SEEK_SET);
if(togglechat(TRUE))
return(-1);
return(0);
}
int chat_check_remote(void)
{
time_t now;
static time_t last_nodechk=0;
now=time(NULL);
if(now!=last_nodechk) {
if(getnodedat(&cfg,nodenum,&node,NULL)!=0)
return(-1); /* Failed to read nodedat! */
last_nodechk=now;
}
if(node.misc&NODE_LCHAT)
return(1); /* Still Waiting */
if(node.status==NODE_WFC || node.status>NODE_QUIET || node.action!=NODE_PCHT)
return(0); /* Remote has gone away */
if(in==-1)
return(0); /* Remote has gone away */
if(out==-1)
return(-1); /* Write error or some such */
return(2); /* Everything is good! */
}
int chat_read_byte(void)
{
unsigned char ch=0;
if(in==-1)
return(-1);
utime(inpath,NULL);
switch(read(in,&ch,1)) {
case -1:
close(in);
in=-1;
return(-1);
case 0:
if(lseek(in,0,SEEK_SET)==-1); /* Wrapped */
return(-1);
switch(read(in,&ch,1)) {
case -1:
close(in);
in=-1;
return(-1);
}
/* Fall-through */
case 1:
lseek(in,-1L,SEEK_CUR);
if(ch) {
write(in,"",1);
return(ch);
}
}
return(0);
}
int chat_write_byte(unsigned char ch)
{
if(out==-1)
return(-1);
if(lseek(out,0,SEEK_CUR)>=PCHAT_LEN)
lseek(out,0,SEEK_SET);
switch(write(out,&ch,1)) {
case -1:
close(out);
out=-1;
return(-1);
}
utime(outpath,NULL);
return(0);
}
int chat_close(void)
{
if(in != -1)
close(in);
if(out != -1)
close(out);
return(togglechat(FALSE));
}