Added support for external message editor
This commit is contained in:
@@ -30,7 +30,7 @@ MBSEBBS_OBJS = bank.o bbslist.o chat.o file.o funcs.o mail.o menu.o \
|
||||
MBSEBBS_LIBS = ../lib/libmemwatch.a ../lib/libclcomm.a ../lib/libcommon.a ../lib/libmsgbase.a \
|
||||
../lib/libdbase.a ../lib/libmbinet.a
|
||||
MBNEWUSR_OBJS = mbnewusr.o newuser.o language.o timeout.o dispfile.o oneline.o \
|
||||
timecheck.o input.o exitinfo.o funcs.o misc.o change.o \
|
||||
timecheck.o input.o exitinfo.o funcs.o misc.o change.o door.o \
|
||||
filesub.o mail.o email.o msgutil.o pop3.o lineedit.o fsedit.o whoson.o
|
||||
MBNEWUSR_LIBS = ../lib/libmemwatch.a ../lib/libclcomm.a ../lib/libcommon.a ../lib/libmsgbase.a \
|
||||
../lib/libdbase.a ../lib/libmbinet.a
|
||||
@@ -150,7 +150,7 @@ mbuser.o: ../lib/libs.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/
|
||||
page.o: ../lib/libs.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h dispfile.h input.h chat.h page.h timeout.h mail.h language.h
|
||||
bye.o: ../lib/libs.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h dispfile.h misc.h language.h bye.h
|
||||
funcs.o: ../lib/libs.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/msgtext.h ../lib/msg.h ../lib/clcomm.h funcs.h
|
||||
mail.o: ../lib/libs.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/msgtext.h ../lib/clcomm.h ../lib/msg.h mail.h funcs.h input.h language.h misc.h timeout.h oneline.h exitinfo.h lineedit.h fsedit.h filesub.h msgutil.h pop3.h email.h whoson.h
|
||||
mail.o: ../lib/libs.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/msgtext.h ../lib/clcomm.h ../lib/msg.h mail.h funcs.h input.h language.h misc.h timeout.h oneline.h exitinfo.h lineedit.h fsedit.h filesub.h msgutil.h pop3.h email.h door.h whoson.h
|
||||
newuser.o: ../lib/libs.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h funcs.h input.h newuser.h language.h timeout.h change.h dispfile.h
|
||||
pinfo.o: ../lib/libs.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h pinfo.h input.h
|
||||
timecheck.o: ../lib/libs.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h timecheck.h funcs.h bye.h exitinfo.h language.h input.h
|
||||
|
@@ -392,27 +392,53 @@ void Chg_FileCheck()
|
||||
|
||||
|
||||
/*
|
||||
* Toggle Fullscreen Editor
|
||||
* Choose Message Editor
|
||||
*/
|
||||
void Chg_FsMsged()
|
||||
{
|
||||
ReadExitinfo();
|
||||
Enter(2);
|
||||
int z;
|
||||
|
||||
if (exitinfo.FsMsged) {
|
||||
exitinfo.FsMsged = FALSE;
|
||||
/* Fullscreen Editor is now OFF */
|
||||
pout(10, 0, (char *) Language(373));
|
||||
} else {
|
||||
exitinfo.FsMsged = TRUE;
|
||||
/* Fullscreen Editor is now ON */
|
||||
pout(10, 0, (char *) Language(372));
|
||||
}
|
||||
ReadExitinfo();
|
||||
Enter(2);
|
||||
|
||||
Enter(2);
|
||||
sleep(2);
|
||||
Syslog('+', "Fullscreen Editor changed to %s", exitinfo.FsMsged ?"True":"False");
|
||||
WriteExitinfo();
|
||||
/* Now using the */
|
||||
pout(LIGHTMAGENTA, BLACK, (char *)Language(372));
|
||||
/* Line/Fullscreen/External */
|
||||
colour(LIGHTCYAN, BLACK);
|
||||
printf(" %s ", Language(387 + (exitinfo.MsgEditor & 3)));
|
||||
/* Editor */
|
||||
pout(LIGHTMAGENTA, BLACK, (char *)Language(390));
|
||||
Enter(1);
|
||||
|
||||
pout(WHITE, BLACK, (char *)Language(373));
|
||||
fflush(stdout);
|
||||
alarm_on();
|
||||
z = toupper(Getone());
|
||||
|
||||
if (z == Keystroke(373, 0)) {
|
||||
exitinfo.MsgEditor = LINEEDIT;
|
||||
Syslog('+', "User selected line editor");
|
||||
} else if (z == Keystroke(373, 1)) {
|
||||
exitinfo.MsgEditor = FSEDIT;
|
||||
Syslog('+', "User selected fullscreen editor");
|
||||
} else if (z == Keystroke(373, 2)) {
|
||||
exitinfo.MsgEditor = EXTEDIT;
|
||||
Syslog('+', "User selected external editor");
|
||||
}
|
||||
|
||||
Enter(2);
|
||||
|
||||
/* Now using the */
|
||||
pout(LIGHTMAGENTA, BLACK, (char *)Language(372));
|
||||
/* Line/Fullscreen/External */
|
||||
colour(LIGHTCYAN, BLACK);
|
||||
printf(" %s ", Language(387 + (exitinfo.MsgEditor & 3)));
|
||||
/* Editor */
|
||||
pout(LIGHTMAGENTA, BLACK, (char *)Language(390));
|
||||
|
||||
Enter(2);
|
||||
sleep(2);
|
||||
WriteExitinfo();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -391,7 +391,15 @@ void ControlCodeU(int ch)
|
||||
break;
|
||||
|
||||
case '3':
|
||||
printf("%s", exitinfo.FsMsged ? (char *) Language(147) : (char *) Language(148));
|
||||
switch(exitinfo.MsgEditor) {
|
||||
case LINEEDIT: printf(Language(387));
|
||||
break;
|
||||
case FSEDIT: printf(Language(388));
|
||||
break;
|
||||
case EXTEDIT: printf(Language(389));
|
||||
break;
|
||||
default: printf("?");
|
||||
}
|
||||
break;
|
||||
|
||||
case '4':
|
||||
|
@@ -95,7 +95,7 @@ char *Rdate(char *ind, int Y2K)
|
||||
/*
|
||||
* Function will run a external program or door
|
||||
*/
|
||||
void ExtDoor(char *Program, int NoDoorsys, int Y2Kdoorsys, int Comport, int NoSuid)
|
||||
void ExtDoor(char *Program, int NoDoorsys, int Y2Kdoorsys, int Comport, int NoSuid, int NoPrompt)
|
||||
{
|
||||
char *String, *String1;
|
||||
int i, rc;
|
||||
@@ -232,7 +232,9 @@ void ExtDoor(char *Program, int NoDoorsys, int Y2Kdoorsys, int Comport, int NoSu
|
||||
|
||||
free(temp1);
|
||||
printf("\n\n");
|
||||
Pause();
|
||||
|
||||
if (!NoPrompt)
|
||||
Pause();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -3,7 +3,7 @@
|
||||
#ifndef _DOOR_H
|
||||
#define _DOOR_H
|
||||
|
||||
void ExtDoor(char *, int, int, int, int); /* Run external door */
|
||||
void ExtDoor(char *, int, int, int, int, int); /* Run external door */
|
||||
int exec_nosuid(char *); /* Execute as real user */
|
||||
|
||||
#endif
|
||||
|
@@ -58,6 +58,7 @@
|
||||
#include "msgutil.h"
|
||||
#include "pop3.h"
|
||||
#include "email.h"
|
||||
#include "door.h"
|
||||
#include "whoson.h"
|
||||
|
||||
|
||||
@@ -375,10 +376,12 @@ void SysopComment(char *Cmt)
|
||||
*/
|
||||
int Edit_Msg()
|
||||
{
|
||||
if (exitinfo.FsMsged)
|
||||
return Fs_Edit();
|
||||
else
|
||||
return Line_Edit();
|
||||
switch (exitinfo.MsgEditor) {
|
||||
case LINEEDIT: return Line_Edit();
|
||||
case FSEDIT: return Fs_Edit();
|
||||
case EXTEDIT: return Ext_Edit();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2218,3 +2221,85 @@ void SetMsgArea(unsigned long AreaNum)
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* External Message Editor
|
||||
*/
|
||||
int Ext_Edit()
|
||||
{
|
||||
int changed;
|
||||
int j, i;
|
||||
char *l, *tmpname;
|
||||
FILE *fd;
|
||||
struct stat st1,st2;
|
||||
|
||||
changed=FALSE;
|
||||
|
||||
tmpname = calloc(PATH_MAX, sizeof(char));
|
||||
|
||||
sprintf(tmpname, "%s/%s/%s", CFG.bbs_usersdir, exitinfo.Name, "data.msg");
|
||||
if ((fd = fopen(tmpname, "w")) == NULL) {
|
||||
Syslog('+',"EXT_EDIT: Unable to open %s for writing", tmpname);
|
||||
} else {
|
||||
fprintf(fd,"AREA='%s'\n",sMsgAreaDesc);
|
||||
fprintf(fd,"AREANUM='%d'\n",iMsgAreaNumber+1);
|
||||
fprintf(fd,"AREATYPE='%d'\n",iMsgAreaType);
|
||||
fprintf(fd,"MSGFROM='%s'\n",Msg.From);
|
||||
fprintf(fd,"MSGTO='%s'\n",Msg.To);
|
||||
fprintf(fd,"MSGTOADDR='%s'\n",Msg.ToAddress);
|
||||
fprintf(fd,"MSGSUBJECT='%s'\n",Msg.Subject);
|
||||
fprintf(fd,"BBSLANGUAGE='%c'\n",exitinfo.iLanguage);
|
||||
fprintf(fd,"BBSFSEDKEYS='%d'\n",exitinfo.FSemacs);
|
||||
fclose(fd);
|
||||
}
|
||||
|
||||
sprintf(tmpname, "%s/%s/%s", CFG.bbs_usersdir, exitinfo.Name, "edit.msg");
|
||||
if ((fd = fopen(tmpname, "w")) == NULL) {
|
||||
Syslog('+',"EXT_EDIT: Unable to open %s for writing", tmpname);
|
||||
} else {
|
||||
for (i = 1; i <= Line; i++) {
|
||||
fprintf(fd,"%s\n",Message[i]);
|
||||
}
|
||||
fclose(fd);
|
||||
stat( tmpname, &st1 );
|
||||
ExtDoor(CFG.externaleditor,FALSE,TRUE,TRUE,FALSE,TRUE);
|
||||
stat( tmpname, &st2 );
|
||||
}
|
||||
|
||||
if ( st1.st_mtime != st2.st_mtime ) {
|
||||
l = calloc(81, sizeof(char));
|
||||
if ((fd = fopen(tmpname, "r")) == NULL) {
|
||||
Syslog('+',"EXT_EDIT: Unable to open %s for reading", tmpname);
|
||||
} else {
|
||||
i=1;
|
||||
while ( (fgets(l,80,fd) != NULL) && (i < TEXTBUFSIZE ) ) {
|
||||
for (j = 0; i < strlen(l); j++) {
|
||||
if (*(l + j) == '\0')
|
||||
break;
|
||||
if (*(l + j) == '\n')
|
||||
*(l + j) = '\0';
|
||||
if (*(l + j) == '\r')
|
||||
*(l + j) = '\0';
|
||||
/*
|
||||
* Make sure that any tear or origin lines are
|
||||
* made invalid.
|
||||
*/
|
||||
if (strncmp(l, (char *)"--- ", 4) == 0)
|
||||
l[1] = 'v';
|
||||
if (strncmp(l, (char *)" * Origin:", 10) == 0)
|
||||
l[1] = '+';
|
||||
}
|
||||
sprintf(Message[i],"%s",l);
|
||||
i++;
|
||||
}
|
||||
changed=TRUE;
|
||||
Line=i;
|
||||
fclose(fd);
|
||||
}
|
||||
free(l);
|
||||
}
|
||||
free(tmpname);
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1,20 +1,24 @@
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef _MAIL_H
|
||||
#define _MAIL_H
|
||||
|
||||
#define TEXTBUFSIZE 500
|
||||
|
||||
|
||||
int LC(int); /* More prompt for reading messages */
|
||||
int Edit_Msg(void); /* Edit a message */
|
||||
int Ext_Edit(void); /* External Message editor */
|
||||
int CheckLine(int, int, int); /* Check linecounter for read */
|
||||
void SysopComment(char *); /* Comment to Sysop */
|
||||
void Post_Msg(void); /* Post a message */
|
||||
void Read_Msgs(void); /* Read Messages */
|
||||
void QuickScan_Msgs(void); /* List Message Headers */
|
||||
void Delete_Msg(void); /* Delete a specified message */
|
||||
void MsgArea_List(char *); /* Select message area */
|
||||
void CheckMail(void); /* Check for new mail */
|
||||
void MailStatus(void); /* Mail status in areas */
|
||||
void SetMsgArea(unsigned long); /* Set message area and variables */
|
||||
void SysopComment(char *); /* Comment to Sysop */
|
||||
void Post_Msg(void); /* Post a message */
|
||||
void Read_Msgs(void); /* Read Messages */
|
||||
void QuickScan_Msgs(void); /* List Message Headers */
|
||||
void Delete_Msg(void); /* Delete a specified message */
|
||||
void MsgArea_List(char *); /* Select message area */
|
||||
void CheckMail(void); /* Check for new mail */
|
||||
void MailStatus(void); /* Mail status in areas */
|
||||
void SetMsgArea(unsigned long); /* Set message area and variables */
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -334,7 +334,7 @@ void DoMenu(int Type)
|
||||
|
||||
case 7:
|
||||
/* Run external program */
|
||||
ExtDoor(menus.OptionalData, menus.NoDoorsys, menus.Y2Kdoorsys, menus.Comport, menus.NoSuid);
|
||||
ExtDoor(menus.OptionalData, menus.NoDoorsys, menus.Y2Kdoorsys, menus.Comport, menus.NoSuid, menus.NoPrompt);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
|
@@ -103,7 +103,7 @@ int newuser()
|
||||
FullName = calloc(81, sizeof(char));
|
||||
|
||||
usrconfig.iLanguage = iLang;
|
||||
usrconfig.FsMsged = TRUE;
|
||||
usrconfig.MsgEditor = FSEDIT;
|
||||
|
||||
do {
|
||||
|
||||
|
Reference in New Issue
Block a user