[12735] in Athena Bugs
bugfixes for xolc
daemon@ATHENA.MIT.EDU (Anne)
Fri Oct 14 00:03:04 1994
To: bugs@MIT.EDU
Date: Fri, 14 Oct 1994 00:02:51 EDT
From: Anne <annied@MIT.EDU>
These are the bugfixes I made to address the following prblems in xolc:
the MuSetEmacsBindings problem
lack of line-wrapping for questions (ticket #596)
output to stdout on suns (ticket #597)
the replay buffer not being updated when the user sends a message (#597)
the version i compiled does not have any of the other bugs complained about
since the new release. However, it does not compile on RSAIX yet. I have
some minor changes to Make and Config files if they are needed to compile
on other platforms (I used X11r5 and Motif1.2--this requires some
updating). here is the code changes:
*** procs.c Mon Aug 1 15:48:57 1994
--- /source/athena/athena.bin/olc/clients/motif/procs.c Fri Apr 30 17:23:41 1993
***************
*** 26,51 ****
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/wait.h>
- /* added the following two lines for open() arguments */
- #include <fcntl.h>
- #include <limits.h>
#include <Xm/List.h>
#include <Xm/Text.h>
#include <Xm/ScrollBar.h>
#include <Xm/SelectioB.h>
! /*
#include <nl_requests.h>
! */
#include "xolc.h"
#include "data.h"
#include "buttons.h"
- #include <errno.h>
! #ifdef SOLARIS
#define _POSIX_SOURCE
#endif
-
char current_topic[TOPIC_SIZE] = "unknown";
int sa_pid = 0;
--- 26,46 ----
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <Xm/List.h>
#include <Xm/Text.h>
#include <Xm/ScrollBar.h>
#include <Xm/SelectioB.h>
!
#include <nl_requests.h>
!
#include "xolc.h"
#include "data.h"
#include "buttons.h"
! #ifdef SOLARIS
#define _POSIX_SOURCE
#endif
char current_topic[TOPIC_SIZE] = "unknown";
int sa_pid = 0;
***************
*** 76,87 ****
*
*/
- /*
- * reaper:
- * when the xbrowser child process ends, set the "Browser stock answers"
- * button sensitive once again.
- */
-
#ifdef VOID_SIGRET
static void
#else
--- 71,76 ----
***************
*** 119,130 ****
#endif
}
- /*
- * view_ready:
- * changes the cursor from the wait cursor to the standard cursor.
- * signalled from xbrowser when it is up and running.
- */
-
#ifdef VOID_SIGRET
static void
#else
--- 108,113 ----
***************
*** 141,153 ****
#endif
}
! /*
! * Called when the user presses the "Ask new question" button on the
! * xolc form. Maps the new question form and gets a list if the topics
! * (calls x_list_topics).
! */
!
! void olc_new_ques (w, tag, callback_data)
Widget w;
caddr_t *tag;
XmAnyCallbackStruct *callback_data;
--- 124,131 ----
#endif
}
! void
! olc_new_ques (w, tag, callback_data)
Widget w;
caddr_t *tag;
XmAnyCallbackStruct *callback_data;
***************
*** 155,161 ****
REQUEST Request;
char file[MAXPATHLEN];
ERRCODE status;
!
if (fill_request(&Request) != SUCCESS)
{
MuError("olc_new_ques: unable to fill request struct");
--- 133,139 ----
REQUEST Request;
char file[MAXPATHLEN];
ERRCODE status;
!
if (fill_request(&Request) != SUCCESS)
{
MuError("olc_new_ques: unable to fill request struct");
***************
*** 184,193 ****
#endif
}
- /*
- * Clears the new question form text entry area.
- * Called when the user presses 'Clear question'
- */
void
olc_clear_newq (w, tag, callback_data)
--- 162,167 ----
***************
*** 198,213 ****
XmTextSetString(w_newq_scrl, "");
}
- /*
- * Attempts to send the question typed into the new question form, inserting
- * newlines every 80 characters when necessary.
- * If there is an error, notify the user via dialog box. Also updates
- * the replay box to include the new question.
- *
- * Called when the Enter this question in OLC button is pressed in the new
- * question form.
- */
-
void
olc_send_newq (w, tag, callback_data)
Widget w;
--- 172,177 ----
***************
*** 250,256 ****
return;
}
- lbreak(q_text, BREAKLEN);
if (x_ask(&Request, current_topic, q_text) != SUCCESS)
{
#ifdef ATHENA
--- 214,219 ----
***************
*** 274,284 ****
#endif
}
- /*
- * Called when the user selects a line corresponding to a topic for a
- * question. Alerts the user if it is not a valid topic, else selects this
- * topic and highlights the text entry area of the form.
- */
void
olc_topic_select (w, tag, callback_data)
--- 237,242 ----
***************
*** 302,313 ****
}
}
- /*
- * olc_cont_ques:
- * Called when the 'Continue your question' button is pressed.
- * Maps the continue question form.
- */
-
void
olc_cont_ques (w, tag, callback_data)
Widget w;
--- 260,265 ----
***************
*** 327,338 ****
#endif
}
- /*
- * olc_status:
- * Finds out to whom the user is connected.
- * Notifies the user of an error.
- */
-
void
olc_status()
{
--- 279,284 ----
***************
*** 376,405 ****
}
}
- /*
- * olc_replay:
- * lists the conversation between the user and the consultant. scrolls to
- * the bottom so the user can see the most recent correspondence.
- * Notifies the user of any error.
- *
- * NOTE: this code used to use a different port than tty based olc uses
- * to replay conversation. I changed it to use the same port for
- * consistency, and so it would also work on the test server.
- */
-
void
olc_replay()
{
- /** for other port code
static char *log;
! static int loglen = 0; **/
- static init = 0;
- char *buf;
- #ifdef SOLARIS
- char file[30];
- #endif
-
REQUEST Request;
ERRCODE status;
int fd;
--- 322,334 ----
}
}
void
olc_replay()
{
static char *log;
! static int loglen = 0;
! static init = 0;
REQUEST Request;
ERRCODE status;
int fd;
***************
*** 408,433 ****
Widget sb,w;
int sb_value, sb_slider_size, sb_inc, sb_pinc, sb_max;
! /* Mark message as read */
WAIT_CURSOR;
! if(fill_request(&Request) != SUCCESS) {
! STANDARD_CURSOR;
return;
! }
!
! #ifdef SOLARIS /* suns don't like writing to /dev/null?? */
! make_temp_name(file);
! status = OShowMessageIntoFile(&Request,file);
! unlink(file);
! #else
status = OShowMessageIntoFile(&Request,"/dev/null");
- #endif
! /***************
! * the original code that uses the other port:
! *
! if (open_connection_to_nl_daemon(&fd) != SUCCESS) {
MuError("Could not contact OLC Daemon\n");
return;
}
--- 337,351 ----
Widget sb,w;
int sb_value, sb_slider_size, sb_inc, sb_pinc, sb_max;
! /* Mark message as read */
WAIT_CURSOR;
! if(fill_request(&Request) != SUCCESS)
return;
!
status = OShowMessageIntoFile(&Request,"/dev/null");
! if (open_connection_to_nl_daemon(&fd) != SUCCESS) {
MuError("Could not contact OLC Daemon\n");
return;
}
***************
*** 436,479 ****
switch (status) {
case ERR_NO_SUCH_Q:
XmTextSetString(w_replay_scrl,
! "No question, and therefore, no log to display.");
break;
case ERR_NO_ACL:
XmTextSetString(w_replay_scrl,
! "Sorry, charlie, but you're not on the acl.\n");
break;
default:
! /** need to do some set_com_err_hook stuff here **
! com_err("olc_replay", status, "received while retrieving log to replay"); }
return;
}
XmTextSetString(w_replay_scrl, log);
! *
! **************/
!
! status = OReplayToBuf(&Request, &buf);
! if(status) {
! switch(status) {
! case NOT_CONNECTED:
! XmTextSetString(w_replay_scrl,
! "No question, and therefore, no log to display.");
! break;
! case PERMISSION_DENIED:
! XmTextSetString(w_replay_scrl,
! "You have insufficient permission.");
! break;
! default:
! /** need to do some set_com_err_hook stuff here **/
! com_err("olc_replay", status,
! "received while retrieving log to replay");
! }
! STANDARD_CURSOR;
! return;
! }
!
! XmTextSetString(w_replay_scrl, buf);
!
/* Scroll down to end of the log */
if (init == 0)
init = 1;
--- 354,374 ----
switch (status) {
case ERR_NO_SUCH_Q:
XmTextSetString(w_replay_scrl,
! "No question, and therefore, no log to display.");
break;
case ERR_NO_ACL:
XmTextSetString(w_replay_scrl,
! "Sorry, charlie, but you're not on the acl.\n");
break;
default:
! /** need to do some set_com_err_hook stuff here **/
! com_err("olc_replay", status, "received while retrieving log to replay");
! }
return;
}
XmTextSetString(w_replay_scrl, log);
!
/* Scroll down to end of the log */
if (init == 0)
init = 1;
***************
*** 494,505 ****
STANDARD_CURSOR;
}
- /*
- * olc_done:
- * Called when the user presses the 'Done' button in the window.
- * Asks the user if she is really done, and the marks her question as done.
- */
-
void
olc_done (w, tag, callback_data)
Widget w;
--- 389,394 ----
***************
*** 511,529 ****
WAIT_CURSOR;
if (fill_request(&Request) != SUCCESS) {
MuError("done: Unable to fill request struct.");
- STANDARD_CURSOR;
return;
}
x_done(&Request);
STANDARD_CURSOR;
- }
! /*
! * olc_cancel:
! * Pops up 'are you sure?' dialog box, and then cancels the user's question.
! */
!
void
olc_cancel (w, tag, callback_data)
Widget w;
--- 400,413 ----
WAIT_CURSOR;
if (fill_request(&Request) != SUCCESS) {
MuError("done: Unable to fill request struct.");
return;
}
x_done(&Request);
STANDARD_CURSOR;
! }
!
void
olc_cancel (w, tag, callback_data)
Widget w;
***************
*** 543,557 ****
}
STANDARD_CURSOR;
}
!
! /*
! * olc_savelog:
! * -insensitizes the save button
! * -makes the selection in the save dialog box
! * usershomedir/OLC.log
! * -maps the save dialog box
! */
!
void
olc_savelog (w, tag, callback_data)
Widget w;
--- 427,433 ----
}
STANDARD_CURSOR;
}
!
void
olc_savelog (w, tag, callback_data)
Widget w;
***************
*** 577,591 ****
#endif
}
- /*
- * save_cbk:
- * called when user presses a button in the save dialog.
- * If user presses cancel, return. If user presses OK, writes log to
- * file in the selection box's text field. Notifies user if error.
- *
- * NOTE: this code also used to use the other port (see olc_replay)
- */
-
void
save_cbk (w, tag, callback_data)
Widget w;
--- 453,458 ----
***************
*** 600,607 ****
char buf[BUFSIZ];
char *log;
int loglen, actlen;
! REQUEST Request;
!
XtSetArg(A[0],XmNsensitive, TRUE);
XtSetValues(w_savelog_btn,A,1);
XtUnmanageChild(w_save_dlg);
--- 467,473 ----
char buf[BUFSIZ];
char *log;
int loglen, actlen;
!
XtSetArg(A[0],XmNsensitive, TRUE);
XtSetValues(w_savelog_btn,A,1);
XtUnmanageChild(w_save_dlg);
***************
*** 613,623 ****
WAIT_CURSOR;
filename = XmTextGetString(XmSelectionBoxGetChild(w_save_dlg,
XmDIALOG_TEXT));
!
! /**********************
! * original code that uses other port (2052)
! *
! if ((out_fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0600)) < 0) {
sprintf(buf,"Error opening %s: %s", filename, sys_errlist[errno]);
MuError(buf);
XtFree(filename);
--- 479,485 ----
WAIT_CURSOR;
filename = XmTextGetString(XmSelectionBoxGetChild(w_save_dlg,
XmDIALOG_TEXT));
! if ((out_fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0600)) < 0) {
sprintf(buf,"Error opening %s: %s", filename, sys_errlist[errno]);
MuError(buf);
XtFree(filename);
***************
*** 631,700 ****
}
log = NULL;
loglen = 0;
!
status = nl_get_log(fd,&log,&loglen,User.username,User.instance,&actlen);
if (status) {
switch (status) {
case ERR_NO_SUCH_Q:
- XmTextSetString(w_replay_scrl,
- "No question, and therefore, no log to display.");
- break;
- case ERR_NO_ACL:
- XmTextSetString(w_replay_scrl,
- "Sorry, charlie, but you're not on the acl.\n");
- break;
- default:
- com_err("olc_replay", status,"received while retrieving log to save");
- }
- }
- write(out_fd,log,loglen);
- close(out_fd);
- *
- ****************/
-
- if(fill_request(&Request) != SUCCESS) {
- STANDARD_CURSOR;
- return;
- }
-
- /* open and close file to make sure it is writable */
- if((fd = open(filename, O_WRONLY | O_CREAT, 0600)) < 0) {
- sprintf(buf,"Error opening %s: %s", filename, sys_errlist[errno]);
- MuError(buf);
- unlink(filename);
- STANDARD_CURSOR; return;
- }
- unlink(filename);
-
- status = OReplayLog(&Request, filename);
- XtFree(filename);
-
- if(status) {
- switch(status) {
- case NOT_CONNECTED:
XmTextSetString(w_replay_scrl,
"No question, and therefore, no log to display.");
break;
! case PERMISSION_DENIED:
XmTextSetString(w_replay_scrl,
! "You have insufficient permission.");
break;
default:
! com_err("olc_replay", status,"received while retrieving log to save");
}
}
}
- STANDARD_CURSOR;
return;
}
- /*
- * olc_stock:
- * Called when 'Browse stock answers' button is pressed. Insensitizes
- * this button, and forx off an xbrowser process.
- */
-
- /* #undef _POSIX_SOURCE */
void
olc_stock (w, tag, callback_data)
Widget w;
--- 493,521 ----
}
log = NULL;
loglen = 0;
!
status = nl_get_log(fd,&log,&loglen,User.username,User.instance,&actlen);
if (status) {
switch (status) {
case ERR_NO_SUCH_Q:
XmTextSetString(w_replay_scrl,
"No question, and therefore, no log to display.");
break;
! case ERR_NO_ACL:
XmTextSetString(w_replay_scrl,
! "Sorry, charlie, but you're not on the acl.\n");
break;
default:
! com_err("olc_replay", status,"received while retrieving log to save");
}
}
+ write(out_fd,log,loglen);
+ close(out_fd);
+ STANDARD_CURSOR;
}
return;
}
void
olc_stock (w, tag, callback_data)
Widget w;
***************
*** 703,711 ****
{
Arg args[1];
char pidascii[7];
! /* #ifdef _POSIX_SOURCE
struct sigaction action;
! #endif */
WAIT_CURSOR;
XtSetArg(args[0],XmNsensitive,FALSE);
--- 524,532 ----
{
Arg args[1];
char pidascii[7];
! #ifdef _POSIX_SOURCE
struct sigaction action;
! #endif
WAIT_CURSOR;
XtSetArg(args[0],XmNsensitive,FALSE);
***************
*** 718,724 ****
if ((sa_pid = vfork()) == -1) {
#endif
MuError("Error in vfork; cannot start stock answer browser");
- STANDARD_CURSOR;
return;
}
if (sa_pid == 0) {
--- 539,544 ----
***************
*** 728,734 ****
_exit(1);
}
}
! /*#ifdef _POSIX_SOURCE
action.sa_flags = 0;
sigemptyset(&action.sa_mask);
--- 548,554 ----
_exit(1);
}
}
! #ifdef _POSIX_SOURCE
action.sa_flags = 0;
sigemptyset(&action.sa_mask);
***************
*** 737,756 ****
action.sa_handler = view_ready;
sigaction(SIGUSR1, &action, NULL);
! #else */
signal(SIGCHLD,reaper);
! signal(SIGUSR1,view_ready); /*
! #endif */
#ifdef LOG_USAGE
log_view("browser_start");
#endif
}
-
- /*
- * olc_motd:
- * Gets the olc message of the day and displays it in the motd dialog.
- */
void
olc_motd (w, tag, callback_data)
--- 557,571 ----
action.sa_handler = view_ready;
sigaction(SIGUSR1, &action, NULL);
! #else
signal(SIGCHLD,reaper);
! signal(SIGUSR1,view_ready);
! #endif
#ifdef LOG_USAGE
log_view("browser_start");
#endif
}
void
olc_motd (w, tag, callback_data)
***************
*** 769,775 ****
WAIT_CURSOR;
if (fill_request(&Request) != SUCCESS) {
MuError("olc_motd: unable to fill request struct");
- STANDARD_CURSOR;
return;
}
make_temp_name(file);
--- 584,589 ----
***************
*** 792,803 ****
STANDARD_CURSOR;
}
- /*
- * olc_update:
- * updates the information in the window: updates the status, and replays
- * the conversation.
- */
-
void
olc_update (w, tag, callback_data)
Widget w;
--- 606,611 ----
***************
*** 810,822 ****
olc_replay();
STANDARD_CURSOR;
}
!
! /*
! * olc_help:
! * Gets the help message appropriate to the user's status, and displays it
! * in the help dialog.
! */
!
void
olc_help (w, tag, callback_data)
Widget w;
--- 618,624 ----
olc_replay();
STANDARD_CURSOR;
}
!
void
olc_help (w, tag, callback_data)
Widget w;
***************
*** 892,903 ****
STANDARD_CURSOR;
}
- /*
- * olc_quit:
- * Pops up the dumb dialog box and quits if the user really is sure that she
- * wants to quit.
- */
-
void
olc_quit (w, tag, callback_data)
Widget w;
--- 694,699 ----
***************
*** 915,925 ****
}
}
- /*
- * dlg_ok:
- * called when the user presses the ok button in the motd or help dialogs.
- * Sensitizes the appropriate button.
- */
void
dlg_ok (w, tag, callback_data)
--- 711,716 ----
***************
*** 942,953 ****
}
}
- /*
- * olc_send:
- * Insensitizes the send button, manages the send form, and gives it
- * keyboard focus.
- */
-
void
olc_send (w, tag, callback_data)
Widget w;
--- 733,738 ----
***************
*** 958,969 ****
XtManageChild(w_send_form);
_XmGrabTheFocus(w_send_scrl, NULL);
}
!
! /*
! * olc_clear_msg:
! * clears the text in the send window.
! */
!
void
olc_clear_msg (w, tag, callback_data)
Widget w;
--- 743,749 ----
XtManageChild(w_send_form);
_XmGrabTheFocus(w_send_scrl, NULL);
}
!
void
olc_clear_msg (w, tag, callback_data)
Widget w;
***************
*** 973,984 ****
XmTextSetString(w_send_scrl, "");
}
- /*
- * olc_send_msg:
- * Attempts to send the message in the send message dialog, adding linebreaks
- * every 80 characters when necessary.
- */
-
void
olc_send_msg (w, tag, callback_data)
Widget w;
--- 753,758 ----
***************
*** 996,1014 ****
return;
}
! status = x_reply(&Request, lbreak(XmTextGetString(w_send_scrl), BREAKLEN));
STANDARD_CURSOR;
! if (status == SUCCESS) {
! XmTextSetString(w_send_scrl, "");
! olc_replay();
! }
}
-
- /*
- * olc_close_msg:
- * unmanages the send form, sensitizes the send button.
- */
void
olc_close_msg (w, tag, callback_data)
--- 770,781 ----
return;
}
! status = x_reply(&Request, XmTextGetString(w_send_scrl));
STANDARD_CURSOR;
! if (status == SUCCESS)
! XmTextSetString(w_send_scrl, "");
}
void
olc_close_msg (w, tag, callback_data)
*** visual.c Tue Jun 28 17:05:37 1994
--- /source/athena/athena.bin/olc/clients/motif/visual.c Thu Jun 11 13:12:35 1992
***************
*** 32,40 ****
#include "buttons.h"
#include "xolc.h"
- #ifndef SOLARIS /* suns won't read the bitmap files. */
#include "xolc.xbm"
- #endif
Widget /* Widget ID's */
xolc,
--- 32,38 ----
***************
*** 156,163 ****
XtSetArg(args[0], XtNiconPixmap, &icon_pixmap);
XtGetValues(xolc,args,1);
-
- #ifndef SOLARIS /* see above. isn't this stupid? */
if (icon_pixmap == None) {
XtSetArg(args[0], XtNiconPixmap,
XCreateBitmapFromData(XtDisplay(xolc),
--- 108,113 ----
***************
*** 165,172 ****
xolc_bits, xolc_width, xolc_height));
XtSetValues (xolc, args, 1);
}
- #endif
w = main_form = XmCreateForm(xolc, "main", NULL, 0);
/* Buttons along the top row: [new_ques, cont_ques], stock, quit, help */
--- 115,122 ----
xolc_bits, xolc_width, xolc_height));
XtSetValues (xolc, args, 1);
}
+
w = main_form = XmCreateForm(xolc, "main", NULL, 0);
/* Buttons along the top row: [new_ques, cont_ques], stock, quit, help */
***************
*** 392,402 ****
XtAddCallback(w, XmNokCallback, save_cbk, 0);
XtAddCallback(w, XmNcancelCallback, save_cbk, 0);
XtDestroyWidget(XmSelectionBoxGetChild(w, XmDIALOG_HELP_BUTTON));
!
! /* this line causes the warning
! MuSetEmacsBindings called on non-text widget
! MuSetEmacsBindings(XmSelectionBoxGetChild(w, XmDIALOG_TEXT));*/
!
w = w_help_dlg = XmCreateInformationDialog(main_form, "help_dlg", NULL, 0);
XtAddCallback(w, XmNokCallback, dlg_ok, HELP_BTN);
XtDestroyWidget(XmMessageBoxGetChild(w, XmDIALOG_CANCEL_BUTTON));
--- 342,349 ----
XtAddCallback(w, XmNokCallback, save_cbk, 0);
XtAddCallback(w, XmNcancelCallback, save_cbk, 0);
XtDestroyWidget(XmSelectionBoxGetChild(w, XmDIALOG_HELP_BUTTON));
! MuSetEmacsBindings(XmSelectionBoxGetChild(w, XmDIALOG_TEXT));
!
w = w_help_dlg = XmCreateInformationDialog(main_form, "help_dlg", NULL, 0);
XtAddCallback(w, XmNokCallback, dlg_ok, HELP_BTN);
XtDestroyWidget(XmMessageBoxGetChild(w, XmDIALOG_CANCEL_BUTTON));
*** x_utils.c Mon Aug 1 16:08:35 1994
--- /source/athena/athena.bin/olc/clients/motif/x_utils.c Mon Apr 27 13:25:23 1992
***************
*** 31,42 ****
#include "xolc.h"
- /*
- * handle_response:
- * Displays an error message appropriate to response. Returns a code
- * indicating if there was an error or if any action was taken.
- */
-
ERRCODE
handle_response(response, req)
int response;
--- 31,36 ----
***************
*** 215,241 ****
return(FAILURE);
else
return(ERROR);
- }
-
- /*
- * lbreak replaces space-like characters in text by newlines so that no line
- * is more than beak characters long. Also returns text. If there is no
- * space on a line, no newlines are inserted in it.
- */
-
- char *lbreak(char text[], int beak) {
- int len = strlen(text);
- int runt, cunt = 0;
-
- while((len-cunt)>beak) {
- runt = cunt + beak;
-
- while (!isspace(text[runt]) && runt > cunt) runt--;
- cunt = ((runt == cunt) ? runt + beak : runt);
- if (cunt==runt) text[cunt] = '\n';
- }
- return(text);
}
--- 209,212 ----
*** xolc.h Thu Jun 16 20:54:24 1994
--- /source/athena/athena.bin/olc/clients/motif/xolc.h Thu Apr 23 18:02:48 1992
***************
*** 178,184 ****
/* x_utils.c */
ERRCODE handle_response P_((int response, REQUEST *req));
int popup_option P_((char *message));
- char *lbreak P_((char text[], int beak));
#undef P_
-
--- 178,182 ----
*** messages.c Fri Jun 24 12:08:38 1994
--- /source/athena/athena.bin/olc/clients/lib/messages.c Fri Apr 19 02:18:07 1991
***************
*** 40,55 ****
return(OGetMessage(Request,file,(char **) NULL,OLC_REPLAY));
}
- /* this function is exactly like OReplayLog except instead of replaying
- the log to a file, it replays it to a buffer. (used in olc_replay())*/
-
- ERRCODE
- OReplayToBuf(Request, buf)
- REQUEST *Request;
- char **buf;
- {
- return(OGetMessage(Request, NULL, buf, OLC_REPLAY));
- }
ERRCODE
OShowMessageIntoFile(Request,file)
--- 40,45 ----