#include "billingkom.h"

struct message *allocmessage(void)
{
   struct message *msg;

   if(!(msg=calloc(sizeof(struct message),1)))
   {
      printf("Out of memory!\n");
      return(NULL);
   }

   tmpnam(msg->filename);

   return(msg);
}

void freemessage(struct message *msg)
{
   struct receiver *rec,*rec2;

   /* Remove recipients */

   rec=msg->firstreceiver;

   while(rec)
   {
      rec2=rec->next;
      free(rec);
      rec=rec2;
   }

   /* Remove file */

   if(msg->filename[0])
      remove(msg->filename);

   /* Free message */

   free(msg);
}

bool addrecipient(struct message *msg,char *name)
{
   struct receiver *rec,*trec;

   for(rec=msg->firstreceiver;rec;rec=rec->next)
   {
      if(stricmp(rec->name,name)==0)
      {
         printf(strings[STR_RECIPIENTEXISTS]);
         return(FALSE); /* Had it already */
      }
   }

   if(!(rec=calloc(sizeof(struct receiver),1)))
   {
      printf("Out of memory!\n");
      return(FALSE);
   }

   mystrncpy(rec->name,name,100);

   if(msg->firstreceiver)
   {
      for(trec=msg->firstreceiver;trec->next;trec=trec->next);
      trec->next=rec;
   }
   else
   {
      msg->firstreceiver=rec;
   }

   return(TRUE);
}

bool remrecipient(struct message *msg,char *name)
{
   struct receiver *rec,*prec;

   prec=NULL;

   for(rec=msg->firstreceiver;rec;rec=rec->next)
   {
      if(stricmp(rec->name,name)==0)
         break;

      else
         prec=rec;
   }

   if(rec)
   {
      if(prec)
         prec->next=rec->next;

      else
         msg->firstreceiver=rec->next;

      free(rec);

      return(TRUE);
   }
   else
   {
      printf(strings[STR_NOSUCHRECIPIENT]);
      return(FALSE);
   }
}

bool editmessagetext(struct message *msg)
{
   char buf[100],lines[10],cols[10],*editor,*cfg;
   long c,d;

   editor="Ed %s WINDOW CONSOLE:";

   if((cfg=getmsgconfig(msg,"Editor")))
      editor=cfg;

   sprintf(lines,"%d",cfg_Lines);
   sprintf(cols,"%d",cfg_Width);

   d=0;
   for(c=0;c<strlen(editor) && d!=sizeof(buf)-1;c++)
   {
      if(editor[c]=='%' && (editor[c+1]|32)=='s')
      {
         strncpy(&buf[d],msg->filename,(size_t)(sizeof(buf)-1-d));
         buf[sizeof(buf)-1]=0;
         d=strlen(buf);
         c++;
      }
      else if(editor[c]=='%' && (editor[c+1]|32)=='l')
      {
         strncpy(&buf[d],lines,(size_t)(sizeof(buf)-1-d));
         buf[sizeof(buf)-1]=0;
         d=strlen(buf);
         c++;
      }
      else if(editor[c]=='%' && (editor[c+1]|32)=='c')
      {
         strncpy(&buf[d],cols,(size_t)(sizeof(buf)-1-d));
         buf[sizeof(buf)-1]=0;
         d=strlen(buf);
         c++;
      }
      else if(editor[c]=='%' && editor[c+1]!=0)
      {
         c++;
         buf[d++]=editor[c];
      }
      else buf[d++]=editor[c];
   }
   buf[d]=0;

   if(cfg)
      UMSFreeConfig(login,cfg);

   if(system(buf))
      return(FALSE);

   return(TRUE);
}

bool savemessage(struct message *msg,bool park)
{
   long res,firstres;
   long wchainuptag;
   struct receiver *rec;
   FILE *fp;
   char toname[100],toaddr[100],groupname[100],buf[100],*cfg;
   char *umsfields[128];           /* UMS fields */
   bool reflow;

   if(!msg->firstreceiver)
   {
      printf(strings[STR_TEXTHASNOREC]);
      return(FALSE);
   }

   /* Fill in some fields */

	memset(umsfields,0,sizeof(umsfields));

   if(msg->subject[0]==0)
      strcpy(msg->subject," ");

   umsfields[UMSCODE_Subject]=msg->subject;
   umsfields[UMSCODE_Attributes]=msg->attributes;
   umsfields[UMSCODE_Organization]=msg->organization;
   umsfields[UMSCODE_Distribution]=msg->distribution;
   umsfields[UMSCODE_ReplyGroup]=msg->replygroup;
   umsfields[UMSCODE_ReplyName]=msg->replyname;
   umsfields[UMSCODE_ReplyAddr]=msg->replyaddr;
   umsfields[UMSCODE_ReferID]=msg->referid;
   umsfields[UMSCODE_ToName]=msg->toname;

   umsfields[UMSCODE_TempFileName]=msg->attachname;
   umsfields[UMSCODE_FileName]=osfilepart(msg->attachname);

   umsfields[UMSCODE_Newsreader]=BASENAME " " VERSION;

   /* Test if writing seems to be allowed */

   if(msg->ismail)
   {
      for(rec=msg->firstreceiver;rec;rec=rec->next)
      {
         makemailname(rec->name,toname,toaddr);

         umsfields[UMSCODE_ToName]=toname;
         umsfields[UMSCODE_ToAddr]=toaddr;
         umsfields[UMSCODE_Folder]=msg->folder;

         res=UMSWriteMsgTags(login,UMSTAG_WTextFields,  umsfields,
                                   UMSTAG_WCheckHeader, 1,
                                   UMSTAG_WAutoBounce,  0,
                                   TAG_DONE);

         if(res == 0)
         {
            printf(strings[STR_MAILWRITEFAIL],rec->name,UMSErrTxt(login));
            return(0);
         }
      }
   }
   else
   {
      /* News */

      for(rec=msg->firstreceiver;rec;rec=rec->next)
      {
         char groupname[100];

         umsfields[UMSCODE_Group]=rec->name;

         res=UMSWriteMsgTags(login,UMSTAG_WTextFields,  umsfields,
                                   UMSTAG_WCheckHeader, 1,
                                   UMSTAG_WAutoBounce,  0,
                                   TAG_DONE);

         if(res == 0)
         {
            makegroup(groupname,rec->name,"");
            printf(strings[STR_TEXTWRITEFAIL],groupname,UMSErrTxt(login));
            return(0);
         }
      }
   }

   reflow=FALSE;

   if((cfg=getmsgconfig(msg,"Reflow")))
   {
      if(stricmp(cfg,"yes")==0)
         reflow=TRUE;

      UMSFreeConfig(login,cfg);
   }

   /* Läsa in hela texten */

   if(fp=fopen(msg->filename,"r"))
   {
      long len;
      char *txt;

      fseek(fp,0,SEEK_END);
      len=ftell(fp);
      fseek(fp,0,SEEK_SET);

      if(!(txt=malloc((size_t)(len+2))))
      {
         printf("Out of memory!\n");
         return(0);
      }

      if(reflow)
      {
         long d;
         bool addspace;

         addspace=FALSE;
         d=0;

         while(!feof(fp))
         {
            if(fgets(buf,99,fp))
            {
               if(strcmp(buf,"\\reflow\n")==0)
               {
                  if(reflow == FALSE) reflow=TRUE;
                  else                reflow=FALSE;
               }
               else
               {
                  if(reflow && buf[0] != '\n' && buf[0] != 32 && strlen(buf) > 65)
                  {
                     /* Reflow this line */

                     if(addspace)
                        txt[d++]=' ';

                     if(buf[strlen(buf)-1] == 10)
                     {
                        buf[strlen(buf)-1]=0;
                        addspace=TRUE;
                     }

                     strip(buf);

                     strcpy(&txt[d],buf);
                     d+=strlen(buf);

                  }
                  else
                  {
                     if(addspace && buf[0]==10)
                        txt[d++]='\n';

                     else if(addspace)
                        txt[d++]=' ';

                     strcpy(&txt[d],buf);
                     d+=strlen(buf);

                     addspace=FALSE;
                  }
               }
            }
         }
         txt[d]=0;
      }
      else
      {
         fread(txt,1,(size_t)len,fp);
      }

      if(len>0 && txt[len-1]!='\n')
         txt[len++]='\n';

      txt[len]=0,

      fclose(fp);

      umsfields[UMSCODE_MsgText]=txt;
   }

   /* har vi en chainup? */

   wchainuptag=TAG_SKIP;

   if(msg->chainup)
      wchainuptag=UMSTAG_WChainUp;

   /* Skriv! */

   if(msg->ismail)
   {
      /* Mail */

      /* Skriv till första mottagaren */

      makemailname(msg->firstreceiver->name,toname,toaddr);

      umsfields[UMSCODE_ToName]=toname;
      umsfields[UMSCODE_ToAddr]=toaddr;
      umsfields[UMSCODE_Folder]=msg->folder;

      firstres=UMSWriteMsgTags(login,UMSTAG_WTextFields, umsfields,
                                     wchainuptag,        msg->chainup,
                                     TAG_DONE);

      if(!firstres)
      {
         printf(strings[STR_MAILWRITEFAIL],msg->firstreceiver->name,UMSErrTxt(login));

         if(umsfields[UMSCODE_MsgText])
            free(umsfields[UMSCODE_MsgText]);

         return(0);
      }

      /* Skriva till alla andra */

      for(rec=msg->firstreceiver->next;rec;rec=rec->next)
      {
         makemailname(rec->name,toname,toaddr);

         umsfields[UMSCODE_ToName]=toname;
         umsfields[UMSCODE_ToAddr]=toaddr;

         res=UMSWriteMsgTags(login,UMSTAG_WTextFields, umsfields,
                                   UMSTAG_WSoftLink,   firstres,
                                   wchainuptag,        msg->chainup,
                                   TAG_DONE);

         if(!firstres)
         {
            printf(strings[STR_MAILWRITEFAIL],rec->name,UMSErrTxt(login));

            umsdeletemsgsoftlinks(firstres);

            if(umsfields[UMSCODE_MsgText])
               free(umsfields[UMSCODE_MsgText]);

            return(0);
         }
      }
   }
   else
   {
      /* News */

      /* Skriv i första mötet */

      umsfields[UMSCODE_Group]=msg->firstreceiver->name;

      firstres=UMSWriteMsgTags(login,UMSTAG_WTextFields, umsfields,
                                     wchainuptag,        msg->chainup,
                                     TAG_DONE);

      if(!firstres)
      {
         makegroup(groupname,umsfields[UMSCODE_Group],"");
         printf(strings[STR_TEXTWRITEFAIL],groupname,UMSErrTxt(login));

         if(umsfields[UMSCODE_MsgText])
            free(umsfields[UMSCODE_MsgText]);

         return(0);
      }

      /* Skriva i alla andra möten */

      for(rec=msg->firstreceiver->next;rec;rec=rec->next)
      {
         umsfields[UMSCODE_Group]=rec->name;

         res=UMSWriteMsgTags(login,UMSTAG_WTextFields, umsfields,
                                   UMSTAG_WHardLink,   firstres,
                                   wchainuptag,        msg->chainup,
                                   TAG_DONE);

         if(!firstres)
         {
            makegroup(groupname,umsfields[UMSCODE_Group],"");
            printf(strings[STR_TEXTWRITEFAIL],groupname,UMSErrTxt(login));

            UMSDeleteMsg(login,firstres);

            if(umsfields[UMSCODE_MsgText])
               free(umsfields[UMSCODE_MsgText]);

            return(0);
         }
      }
   }

   printf(strings[STR_TEXTWRITENR],firstres);

   if(flags[CFG_READOWN].set)
   {
      res=UMSSelectTags(login,UMSTAG_SelMsg,        firstres,
                              UMSTAG_SelUnset,      UMSUSTATF_Old,
                              TAG_DONE);
   }

   if(park)
   {
      res=UMSSelectTags(login,UMSTAG_SelMsg,        firstres,
                              UMSTAG_SelWriteGlobal,TRUE,
                              UMSTAG_SelSet,        UMSGSTATF_Parked,
                              TAG_DONE);
   }

   if(umsfields[UMSCODE_MsgText])
      free(umsfields[UMSCODE_MsgText]);

   return(TRUE);
}

bool exitedit;
struct message *editmessage;

void editkom_savemessage(char *arg, char *data)
{
   /* Save message. Only exit at success. */

   if(editmessage->oldmsgnum)
   {
      char s[100];

      /* Is editing a message */

      printf(strings[STR_SUREEDITMESSAGE]);
      printf(" ");
      fflush(stdout);
      osreadline(s,100);
      printf("\n");

      if(stricmp(s,strings[STR_YES])!=0)
         return;

      if(savemessage(editmessage,FALSE))
      {
         /* If success, we can delete the old message */

         if(editmessage->ismail)
            umsdeletemsgsoftlinks(editmessage->oldmsgnum);

         else
            UMSDeleteMsg(login,editmessage->oldmsgnum);

         exitedit=TRUE;
      }
   }
   else
   {
      /* Is a new message */

      if(savemessage(editmessage,FALSE))
         exitedit=TRUE;
   }
}

void editkom_parkmessage(char *arg, char *data)
{
   /* Save message. Only exit at success. */

   if(savemessage(editmessage,TRUE))
      exitedit=TRUE;
}

void editkom_cancelmessage(char *arg, char *data)
{
   char s[100];

   printf(strings[STR_SURECANCELMESSAGE]);
   printf(" ");
   fflush(stdout);
   osreadline(s,100);

   if(stricmp(s,strings[STR_YES])!=0)
      return;

   exitedit=TRUE;
}

void editkom_editmessage(char *arg, char *data)
{
   editmessagetext(editmessage);
}

void editkom_listcommands(char *arg,char *data)
{
   struct command *command;

   brk=FALSE;
   linesonscreen=0;

   for(command=firsteditcommand;command && !brk;command=command->next)
      ownprintf("%s\n",command->command);

   if(brk)
      printf(strings[STR_BREAK]);
}

void editkom_showheader(char *arg,char *data)
{
   char fullname[100];
   struct receiver *rec;

   linesonscreen=0;

   if(editmessage->ismail)
   {
      for(rec=editmessage->firstreceiver;rec;rec=rec->next)
      {
         ownprintf(strings[STR_READRECEIVER],rec->name);
      }
   }
   else
   {
      for(rec=editmessage->firstreceiver;rec;rec=rec->next)
      {
         makegroup(fullname,rec->name,"");
         ownprintf(strings[STR_READRECEIVER],fullname);
      }
   }

   ownprintf(strings[STR_READSUBJECT],editmessage->subject);

   if(editmessage->replyname[0])
   {
      makename(fullname,editmessage->replyname,editmessage->replyaddr);
      ownprintf(strings[STR_READREPLYTO],fullname);
   }

   if(editmessage->replygroup[0])
   {
      if(stricmp(editmessage->replygroup,"poster")==0)
      {
         ownprintf(strings[STR_FUPTOPOSTER]);
      }
      else
      {
         makegroup(fullname,editmessage->replygroup,"");
         ownprintf(strings[STR_READFOLLOWUPTO],fullname);
      }
   }

   ownprintf(strings[STR_READORGANIZATION],editmessage->organization);
   ownprintf(strings[STR_READDISTRIBUTION],editmessage->distribution);
   ownprintf(strings[STR_READATTRIBUTES],editmessage->attributes);
   ownprintf(strings[STR_READENCLOSEDFILE],editmessage->attachname);
}

void editkom_setorganization(char *arg,char *data)
{
   char s[100];

   if(arg)
   {
      mystrncpy(editmessage->organization,arg,100);
      ownprintf(strings[STR_READORGANIZATION],editmessage->organization);
      return;
   }

   ownprintf(strings[STR_READORGANIZATION],editmessage->organization);
   ownprintf("\n");

   printf(strings[STR_ENTERORGANIZATION]);
   printf(": ");
   fflush(stdout);

   osreadline(s,100);

   if(s[0])
   {
      strip(s);
      strcpy(editmessage->organization,s);
   }
}

void editkom_setdistribution(char *arg,char *data)
{
   char s[100];

   if(arg)
   {
      mystrncpy(editmessage->distribution,arg,100);
      ownprintf(strings[STR_READDISTRIBUTION],editmessage->distribution);
      return;
   }

   ownprintf(strings[STR_READDISTRIBUTION],editmessage->distribution);
   ownprintf("\n");

   printf(strings[STR_ENTERDISTRIBUTION]);
   printf(": ");
   fflush(stdout);

   osreadline(s,100);

   if(s[0])
   {
      strip(s);
      strcpy(editmessage->distribution,s);
   }
}

void editkom_setattributes(char *arg,char *data)
{
   char s[100];

   if(arg)
   {
      mystrncpy(editmessage->attributes,arg,100);
      ownprintf(strings[STR_READATTRIBUTES],editmessage->attributes);
      return;
   }

   ownprintf(strings[STR_READATTRIBUTES],editmessage->attributes);
   ownprintf("\n");

   printf(strings[STR_ENTERATTRIBUTES]);
   printf(": ");
   fflush(stdout);

   osreadline(s,100);

   if(s[0])
   {
      strip(s);
      strcpy(editmessage->attributes,s);
   }
}

void editkom_setsubject(char *arg,char *data)
{
   char s[100];

   if(arg)
   {
      mystrncpy(editmessage->subject,arg,100);
      ownprintf(strings[STR_READSUBJECT],editmessage->subject);
      return;
   }

   ownprintf(strings[STR_READSUBJECT],editmessage->subject);
   ownprintf("\n");

   printf(strings[STR_ENTERSUBJECT]);
   printf(": ");
   fflush(stdout);

   osreadline(s,100);

   if(s[0])
   {
      strip(s);
      strcpy(editmessage->subject,s);
   }
}

void editkom_setattachment(char *arg,char *data)
{
   char s[100];

   if(!arg_local)
   {
      ownprintf(strings[STR_LOCALATTACHONLY]);
      return;
   }

   if(arg)
   {
      mystrncpy(editmessage->attachname,arg,100);
      strip(editmessage->attachname);
      ownprintf(strings[STR_READENCLOSEDFILE],editmessage->attachname);
      return;
   }

   ownprintf(strings[STR_READENCLOSEDFILE],editmessage->attachname);
   ownprintf("\n");

   printf(strings[STR_ENTERATTACHMENT]);
   printf(": ");
   fflush(stdout);

   osreadline(s,100);

   if(s[0])
   {
      strip(s);
      strcpy(editmessage->attachname,s);
   }
}

void editkom_setreplyto(char *arg,char *data)
{
   char fullname[200],s[100];

   if(arg)
   {
      makemailname(arg,editmessage->replyname,editmessage->replyaddr);
      makename(fullname,editmessage->replyname,editmessage->replyaddr);
      ownprintf(strings[STR_READREPLYTO],fullname);
      return;
   }

   makename(fullname,editmessage->replyname,editmessage->replyaddr);

   ownprintf(strings[STR_READREPLYTO],fullname);
   ownprintf("\n");

   printf(strings[STR_ENTERREPLYTO]);
   printf(": ");
   fflush(stdout);

   osreadline(s,100);

   if(s[0])
   {
      strip(s);
      makemailname(s,editmessage->replyname,editmessage->replyaddr);
   }
}

void editkom_setfollowupgroup(char *arg,char *data)
{
   char s[100],groupname[100];
   struct group *group;
   
   if(arg)
   {
      if(stricmp(arg,"poster")==0)
      {
         strcpy(editmessage->replygroup,arg);
      }
      else
      {
         if(!(group=expandgroup(arg)))
            return;

         mystrncpy(editmessage->replygroup,group->umsgroup,100);
      }

      if(stricmp(editmessage->replygroup,"poster")==0)
      {
         ownprintf(strings[STR_FUPTOPOSTER]);
      }
      else
      {
         makegroup(groupname,editmessage->replygroup,"");
         ownprintf(strings[STR_READFOLLOWUPTO],groupname);
      }
      return;
   }

   if(stricmp(editmessage->replygroup,"poster")==0)
   {
      ownprintf(strings[STR_FUPTOPOSTER]);
   }
   else
   {
      makegroup(groupname,editmessage->replygroup,"");
      ownprintf(strings[STR_READFOLLOWUPTO],groupname);
   }

   ownprintf("\n");

   printf(strings[STR_ENTERFOLLOWUPTO]);
   printf(": ");
   fflush(stdout);

   osreadline(s,100);

   if(s[0])
   {
      strip(s);

      if(stricmp(s,"poster")==0)
      {
         strcpy(editmessage->replygroup,s);
      }
      else if(s[0]==0)
      {
         editmessage->replygroup[0]=0;
      }
      else
      {
         if(!(group=expandgroup(s)))
            return;

         mystrncpy(editmessage->replygroup,group->umsgroup,100);
      }
   }
}

void editkom_addrecipient(char *arg,char *data)
{
   struct group *group;

   if(!arg)
   {
      printf(strings[STR_NEEDSARG]);
      return;
   }

   if(editmessage->ismail)
   {
      if(addrecipient(editmessage,arg))
         printf(strings[STR_ADDEDRECIPIENT],arg);
   }
   else
   {
      if(!(group=expandgroup(arg)))
         return;

      if(addrecipient(editmessage,group->umsgroup))
         printf(strings[STR_ADDEDRECIPIENT],group->komname);

   }
}

void editkom_remrecipient(char *arg,char *data)
{
   struct group *group;
   struct receiver *rec;

   if(!arg)
   {
      printf(strings[STR_NEEDSARG]);
      return;
   }

   if(editmessage->ismail)
   {
      if(!(rec=expandreceiver(arg,editmessage->firstreceiver)))
         return;

      printf(strings[STR_REMOVEDRECIPIENT],rec->name);
      remrecipient(editmessage,rec->name);
   }
   else
   {
      if(!(group=expandgroup(arg)))
         return;

      printf(strings[STR_REMOVEDRECIPIENT],group->komname);
      remrecipient(editmessage,group->umsgroup);
   }
}

void editkom_movegroup(char *arg,char *data)
{
   struct group *group;
   struct receiver *rec,*rec2;

   if(!arg)
   {
      printf(strings[STR_NEEDSARG]);
      return;
   }

   if(editmessage->ismail)
   {
      printf(strings[STR_NOMOVEMAIL]);
      return;
   }

   if(!(group=expandgroup(arg)))
      return;

   /* Remove all other groups first */

   rec=editmessage->firstreceiver;

   while(rec)
   {
      rec2=rec->next;
      free(rec);
      rec=rec2;
   }

   editmessage->firstreceiver=NULL;

   if(addrecipient(editmessage,group->umsgroup))
      printf(strings[STR_MOVEDMESSAGE],group->komname);
}

void makegroupname(char *group,struct message *msg)
{
   if(msg->ismail)
   {
      strcpy(group,"Mail.");

      if(msg->folder[0])
         strcat(group,msg->folder);
   }
   else
   {
      strcpy(group,msg->firstreceiver->name);
   }
}

char *getmsgconfig(struct message *msg,char *field)
{
   char group[100];

   makegroupname(group,msg);

   return umsgetgroupconfig(group,field);
}


void messageprompt(struct message *msg, bool startedit)
{
   char s[100];

   exitedit=FALSE;

   if(startedit)
   {
      if(!editmessagetext(msg))
         return;
   }

   editmessage=msg;

   while(!exitedit && !carrierlost)
   {
      printf("\n --> ");
      fflush(stdout);
      osreadline(s,100);
      printf("\n");

      linesonscreen=0;

      if(!carrierlost)
      {
         struct command *matchcmd;
         char *arg;
         
         matchcmd=expandcommand(s,&arg,firsteditcommand);

         if(matchcmd)
            (*matchcmd->func)(arg,matchcmd->data);
      }
   }
}

void setdefaultfields(struct message *msg)
{
   char group[100],*cfg;
   FILE *fh;

   makegroupname(group,msg);

   if((cfg=umsgetgroupconfig(group,"Attributes")))
   {
      mystrncpy(msg->attributes,cfg,100);
      UMSFreeConfig(login,cfg);
   }

   if((cfg=umsgetgroupconfig(group,"Organization")))
   {
      mystrncpy(msg->organization,cfg,100);
      UMSFreeConfig(login,cfg);
   }

   if((cfg=umsgetgroupconfig(group,"Dist")))
   {
      mystrncpy(msg->distribution,cfg,100);
      UMSFreeConfig(login,cfg);
   }

   if((cfg=umsgetgroupconfig(group,"ReplyTo")))
   {
      makemailname(cfg,msg->replyname,msg->replyaddr);
      UMSFreeConfig(login,cfg);
   }

   if((cfg=umsgetgroupconfig(group,"FupTo")))
   {
      mystrncpy(msg->replygroup,cfg,100);
      UMSFreeConfig(login,cfg);
   }

   if((cfg=umsgetgroupconfig(group,"Signature")))
   {
      if(fh=fopen(msg->filename,"a"))
      {
         fputs(cfg,fh);
         fclose(fh);
      }

      UMSFreeConfig(login,cfg);
   }
}

void kom_postmessage(char *arg,char *data)
{
   struct message *msg;
   char groupname[100];

   if(currentgroup[0] == 0)
   {
      printf(strings[STR_NOPOSTINMAILBOX]);
      return;
   }

   if(!haswriteaccess(currentgroup))
   {
      makegroup(groupname,currentgroup,currentfolder);
      printf(strings[STR_NOWRITEACC],groupname);
      return;
   }

   if(!(msg=allocmessage()))
      return;

   if(!addrecipient(msg,currentgroup))
   {
      freemessage(msg);
      return;
   }

   brk=FALSE;

   printf(strings[STR_ASKSUBJECT]);
   printf(" ");

   fflush(stdout);
   osreadline(msg->subject,100);

   if(carrierlost)
      return;

   if(brk)
   {
      printf(strings[STR_BREAK]);
      return;
   }

   setdefaultfields(msg);

   messageprompt(msg,TRUE);
   freemessage(msg);
}

void kom_mailmessage(char *arg,char *data)
{
   struct message *msg;

   brk=FALSE;

   if(!(msg=allocmessage()))
      return;

   if(!arg)
   {
      printf(strings[STR_NEEDSARG]);
      return;
   }

   if(!addrecipient(msg,arg))
   {
      freemessage(msg);
      return;
   }
   
   strcpy(msg->folder,currentfolder);

   printf(strings[STR_ASKSUBJECT]);
   printf(" ");
   fflush(stdout);
   osreadline(msg->subject,100);

   if(carrierlost)
      return;

   if(brk)
   {
      printf(strings[STR_BREAK]);
      return;
   }

   msg->ismail=TRUE;

   setdefaultfields(msg);

   messageprompt(msg,TRUE);
   freemessage(msg);
}

void makeheader(char *header,FILE *fp,char *umsfields[])
{
   long i;
   char firstname[100],groupname[100],komname[100];

   if(umsfields[UMSCODE_Group])
   {
      mystrncpy(groupname,umsfields[UMSCODE_Group],100);
   }
   else
   {
      strcpy(groupname,"Mail");

      if(umsfields[UMSCODE_Folder])
      {
         strncat(groupname,":",100);
         strncat(groupname,umsfields[UMSCODE_Folder],100);
      }
   }

   makegroup(komname,umsfields[UMSCODE_Group],umsfields[UMSCODE_Folder]);

   mystrncpy(firstname,umsfields[UMSCODE_FromName],100);

   for(i=0;firstname[i];i++)
      if(firstname[i]==' ') break;

   if(firstname[i]==' ')
      firstname[i]=0;

   for(i=0;header[i];i++)
   {
      if(header[i]=='%' && header[i+1]=='a')
      {
         if(umsfields[UMSCODE_FromAddr])
            fputs(umsfields[UMSCODE_FromAddr],fp);

         i++;
      }
      else if(header[i]=='%' && header[i+1]=='d')
      {
         if(umsfields[UMSCODE_CreationDate])
            fputs(umsfields[UMSCODE_CreationDate],fp);

         i++;
      }
      else if(header[i]=='%' && header[i+1]=='f')
      {
         fputs(firstname,fp);
         i++;
      }
      else if(header[i]=='%' && header[i+1]=='N')
      {
         if(umsfields[UMSCODE_Group])
            fputs(firstname,fp);

         else
            fputs("You",fp);

         i++;
      }
      else if(header[i]=='%' && header[i+1]=='d')
      {
         if(umsfields[UMSCODE_CreationDate])
            fputs(umsfields[UMSCODE_CreationDate],fp);

         i++;
      }
      else if(header[i]=='%' && header[i+1]=='g')
      {
         fputs(groupname,fp);
         i++;
      }
      else if(header[i]=='%' && header[i+1]=='k')
      {
         fputs(komname,fp);
         i++;
      }
      else if(header[i]=='%' && header[i+1]=='i')
      {
         if(umsfields[UMSCODE_MsgID])
            fputs(umsfields[UMSCODE_MsgID],fp);

         i++;
      }
      else if(header[i]=='%' && header[i+1]=='n')
      {
         if(umsfields[UMSCODE_FromName])
            fputs(umsfields[UMSCODE_FromName],fp);

         i++;
      }
      else if(header[i]=='%' && header[i+1]=='s')
      {
         if(umsfields[UMSCODE_Subject])
            fputs(umsfields[UMSCODE_Subject],fp);

         i++;
      }
      else if(header[i]=='%')
      {
         fputc(header[i+1],fp);
         i++;
      }
      else
      {
         fputc(header[i],fp);
      }
   }
}

void quotemessage(struct message *msg,char *umsfields[],long quotewidth)
{
   char prefix[100],buf[200],mark[100];
   char *line,*input,*quotemode,*cfg,*cfg2,*quoteheader;
   long d,i,textpos,linepos,lastspace,width;
   char *text,*fromname;
   FILE *fp;

   if(!(fp=fopen(msg->filename,"a")))
      return;

   quoteheader="";

   if((cfg2=getmsgconfig(msg,"QuoteHeader")))
      quoteheader=cfg2;

   if(quoteheader[0])
      makeheader(quoteheader,fp,umsfields);

   quotemode="simple";

   if((cfg=getmsgconfig(msg,"QuoteMode")))
      quotemode=cfg;

   if(stricmp(quotemode,"none")==0)
   {
      fclose(fp);
      return;
   }

   fromname=umsfields[UMSCODE_FromName];
   text=umsfields[UMSCODE_MsgText];

   if(!text)
      text="";

   d=0;

   for(i=0;fromname[i];i++)
      if(i==0 || (i!=0 && fromname[i-1]==32)) mark[d++]=fromname[i];

   mark[d]=0;

   textpos=0;

   while(text[textpos]!=0)
   {
      /* Find full line */

      i=0;

      while(text[textpos+i]!=0 && text[textpos+i]!='\n')
         i++;

      input = &text[textpos];

      textpos+=i;

      if(text[textpos]=='\n')
         textpos++;

      /* Separate prefix from line */

      if(stricmp(quotemode,"smart")!=0)
      {
         sprintf(prefix," %s> ",mark);
         line=input;
      }
      else
      {
         int qn_begin,qn_length,qn_times,qn_end;
         int c,c2,c3,d;
         int kg;

         kg=TRUE;
         c=0;

         qn_begin=0;
         qn_length=0;
         qn_times=0;
         qn_end=0;

         while(kg)
         {
            while(input[c] == ' ') c++;

            c3=c;

            while(input[c] != ' ' && input[c] != '\n' & input[c]!=0)
            {
               if(input[c] == '<') break;
               c++;
            }

            if(input[c]=='\n' || input[c]==0)
               kg=FALSE;

            if(input[c-1]=='>')
            {
               for(c2=c-1;input[c2]=='>' && c2>=c3;c2--)
                  qn_times++;

               qn_begin=c3;
               qn_length=c2-c3+1;
               qn_end=c;

               c++;
            }
            else kg=FALSE;
         }

         if(qn_times)
         {
            qn_times++;

            if(input[qn_end]=='\n' || input[qn_end+1]=='\n' || input[qn_end]==0 || input[qn_end+1]==0)
            {
               line="\n";
            }
            else
            {
               d=0;

               prefix[d++]=' ';
               for(c2=0;c2<qn_length;c2++) prefix[d++]=input[qn_begin+c2];
               for(c2=0;c2<qn_times;c2++)  prefix[d++]='>';
               prefix[d++]=' ';
               prefix[d]=0;
               line = &input[c3];
            }
         }
         else
         {
            sprintf(prefix," %s> ",mark);
            line=input;
         }
      }

      /* Make wordwrap on line */

      width=quotewidth-strlen(prefix);

      linepos=0;

      do
      {
         i=0;
         lastspace=0;

         while(i<width && line[linepos+i]!=0 && line[linepos+i]!='\n')
         {
            if(line[linepos+i]==32) lastspace=i;
            i++;
         }

         if(i==width && lastspace)
         {
            /* Wrap */
            strncpy(buf,&line[linepos],(size_t)lastspace);
            buf[lastspace]=0;
            linepos+=lastspace+1;
         }
         else
         {
            /* Full line */
            strncpy(buf,&line[linepos],(size_t)i);
            buf[i]=0;
            linepos+=i;
         }

         if(buf[0])
            fprintf(fp,"%s%s\n",prefix,buf);

         else
            fprintf(fp,"\n");

      } while(line[linepos]!='\n' && line[linepos]!=0);
   }

   fclose(fp);

   if(cfg)
      UMSFreeConfig(login,cfg);

   if(cfg2)
      UMSFreeConfig(login,cfg2);
}

void kom_reply(char *arg,char *data)
{
   struct message *msg;
   char toname[100];
   char *fields[128];
   struct MessageInfo msginfo;
   bool override;
   long res;

   if(lastread == 0)
   {
      printf(strings[STR_NOTREADTEXTS]);
      return;
   }

   if(!(msg=allocmessage()))
      return;

   res=UMSReadMsgTags(login,UMSTAG_RMsgNum,       lastread,
                            UMSTAG_RTextFields,   fields,
                            UMSTAG_RReadAll,      1,
                            UMSTAG_RMsgInfo,      &msginfo,
                            TAG_DONE);

   if(!res)
   {
      printf(strings[STR_TEXTNRNOTEXIST],lastread);
      freemessage(msg);
      return;
   }

   override=FALSE;

   if(arg && stricmp(arg,strings[STR_REPLYOVERRIDE])==0)
      override=TRUE;

   if(fields[UMSCODE_FromAddr])
      sprintf(toname,"%s,%s",fields[UMSCODE_FromName],fields[UMSCODE_FromAddr]);

   else
      sprintf(toname,"%s",fields[UMSCODE_FromName]);

   if(!override)
   {
      if(fields[UMSCODE_ReplyName])
      {
         if(fields[UMSCODE_ReplyAddr])
            sprintf(toname,"%s,%s",fields[UMSCODE_ReplyName],fields[UMSCODE_ReplyAddr]);

         else
            sprintf(toname,"%s",fields[UMSCODE_ReplyName]);

         printf(strings[STR_MOVEREPLYTO],toname,strings[STR_REPLYOVERRIDE]);
      }
      else
      {
         char groupname[100];
         char *cfg;

         strcpy(groupname,"Mail.");

         if(currentfolder[0])
            strcat(groupname,currentfolder);

         if((cfg=umsgetgroupconfig(groupname,"AnswerTo")))
         {
            mystrncpy(toname,cfg,100);
            UMSFreeConfig(login,cfg);

            printf(strings[STR_MOVEANSWERTOMAIL],toname,strings[STR_REPLYOVERRIDE]);
         }
      }
   }

   if(!addrecipient(msg,toname))
   {
      freemessage(msg);
      UMSFreeMsg(login,res);
      return;
   }

   mystrncpy(msg->folder,currentfolder,100);

   if(fields[UMSCODE_Subject])
      mystrncpy(msg->subject,fields[UMSCODE_Subject],100);

   if(fields[UMSCODE_MsgID])
      mystrncpy(msg->referid,fields[UMSCODE_MsgID],100);

   msg->chainup=lastread;

   quotemessage(msg,fields,78);

   UMSFreeMsg(login,res);

   msg->ismail=TRUE;

   setdefaultfields(msg);

   messageprompt(msg,TRUE);
   freemessage(msg);
}

void kom_followup(char *arg,char *data)
{
   struct message *msg;
   char groupname[100],komname[100],*cfg,*b;
   char *fields[128];
   struct MessageInfo msginfo;
   bool override;
   long res;

   if(lastread == 0)
   {
      printf(strings[STR_NOTREADTEXTS]);
      return;
   }

   if(!(msg=allocmessage()))
      return;

   res=UMSReadMsgTags(login,UMSTAG_RMsgNum,       lastread,
                            UMSTAG_RTextFields,   fields,
                            UMSTAG_RReadAll,      1,
                            UMSTAG_RMsgInfo,      &msginfo,
                            TAG_DONE);

   if(!res)
   {
      printf(strings[STR_TEXTNRNOTEXIST],lastread);
      freemessage(msg);
      return;
   }

   if(!fields[UMSCODE_Group])
   {
      /* Make reply if in mailbox */

      UMSFreeMsg(login,res);
      freemessage(msg);

      kom_reply(arg,data);

      return;
   }

   override=FALSE;

   if(arg && stricmp(arg,strings[STR_REPLYOVERRIDE])==0)
      override=TRUE;

   groupname[0]=0;

   if(!override)
   {
      if(fields[UMSCODE_ReplyGroup])
      {
         if(stricmp(fields[UMSCODE_ReplyGroup],"poster")==0)
         {
            printf(strings[STR_MOVEREPLYGROUPPOSTER],strings[STR_REPLYOVERRIDE]);

            UMSFreeMsg(login,res);
            freemessage(msg);

            kom_reply(arg,data);

            return;
         }

         b=fields[UMSCODE_ReplyGroup];

         /* Do while string has more than one group left */

         while(strchr(b,','))
         {
            /* Skip any spaces */

            while(*b == ' ')
               b++;

            /* Copy to string */

            if(strchr(b,',')-b > 99)
            {
               strncpy(groupname,b,99);
               groupname[99]=0;
            }               
            else
            {
               strncpy(groupname,b,(size_t)(strchr(b,',')-b));
               groupname[(size_t)(strchr(b,',')-b)]=0;
            }
            
            strip(groupname);

            /* Add it */

            addrecipient(msg,groupname);
            makegroup(komname,groupname,"");
            printf(strings[STR_MOVEREPLYGROUP],komname,strings[STR_REPLYOVERRIDE]);

            /* Skip to after next comma */

            b=strchr(b,',')+1;
         }

         /* Take care of final group */

         /* Skip any spaces */

         while(*b == ' ')
            b++;

         /* Copy to string */

         mystrncpy(groupname,b,100);

         strip(groupname);

         /* Add it */

         addrecipient(msg,groupname);
         makegroup(komname,groupname,"");
         printf(strings[STR_MOVEREPLYGROUP],komname,strings[STR_REPLYOVERRIDE]);

      }
      else
      {
         if((cfg=umsgetgroupconfig(fields[UMSCODE_Group],"AnswerTo")))
         {
            mystrncpy(groupname,cfg,100);
            UMSFreeConfig(login,cfg);

            makegroup(komname,groupname,"");
            printf(strings[STR_MOVEANSWERTO],komname,strings[STR_REPLYOVERRIDE]);

            if(!addrecipient(msg,groupname))
            {
               freemessage(msg);
               UMSFreeMsg(login,res);
               return;
            }
         }
      }
   }

   if(!msg->firstreceiver)
   {
      /* Add all original receivers */

      addrecipient(msg,fields[UMSCODE_Group]);

      if(msginfo.msgi_HardLink)
      {
         long templink,oldlink,startlink,res2;

         startlink=lastread;
         templink=msginfo.msgi_HardLink;
         oldlink=0;

         while(templink != startlink && templink != oldlink)
         {
            char *group;

            oldlink=templink;

            res2=UMSReadMsgTags(login,UMSTAG_RGroup,    &group,
                                      UMSTAG_RMsgNum,   templink,
                                      UMSTAG_RHardLink, &templink,
                                      TAG_DONE);

            if(res2)
            {
               makegroup(komname,group,"");
               printf(strings[STR_WARNINGCROSSPOST],komname);

               addrecipient(msg,group);
               UMSFreeMsg(login,oldlink);
            }
         }
      }
   }

   if(fields[UMSCODE_Subject])
      mystrncpy(msg->subject,fields[UMSCODE_Subject],100);

   if(fields[UMSCODE_MsgID])
      mystrncpy(msg->referid,fields[UMSCODE_MsgID],100);

   if(fields[UMSCODE_FromName])
      mystrncpy(msg->toname,fields[UMSCODE_FromName],100);

   msg->chainup=lastread;

   quotemessage(msg,fields,78);

   UMSFreeMsg(login,res);

   setdefaultfields(msg);

   messageprompt(msg,TRUE);
   freemessage(msg);
}

void kom_editmessage(char *arg,char *data)
{
   long num,res,res2;
   struct message *msg;
   char *fields[128];
   struct MessageInfo msginfo;
   FILE *fp;

   if(!getargorlast(arg,&num))
      return;

   if(!(msg=allocmessage()))
      return;

   res=UMSReadMsgTags(login,UMSTAG_RMsgNum,       num,
                            UMSTAG_RTextFields,   fields,
                            UMSTAG_RReadAll,      1,
                            UMSTAG_RMsgInfo,      &msginfo,
                            TAG_DONE);

   if(!res)
   {
      printf(strings[STR_TEXTNRNOTEXIST],num);
      return;
   }

   if(!(msginfo.msgi_UserStatus & UMSUSTATF_Owner))
   {
      printf(strings[STR_EDITNOTOWNERNR],num);
      UMSFreeMsg(login,res);
      return;
   }

   if(msginfo.msgi_GlobalStatus & UMSGSTATF_Exported)
      printf(strings[STR_EDITISEXPORTED]);

   if(msginfo.msgi_ChainDn)
      printf(strings[STR_EDITHASREPLY]);

   if(fields[UMSCODE_Group])
   {
      /* Posting */

      addrecipient(msg,fields[UMSCODE_Group]);

      if(msginfo.msgi_HardLink)
      {
         long templink,oldlink,startlink;

         startlink=num;
         templink=msginfo.msgi_HardLink;
         oldlink=0;

         while(templink != startlink && templink != oldlink)
         {
            char *group;

            oldlink=templink;

            res2=UMSReadMsgTags(login,UMSTAG_RGroup,    &group,
                                      UMSTAG_RMsgNum,   templink,
                                      UMSTAG_RHardLink, &templink,
                                      TAG_DONE);

            if(res2)
            {
               addrecipient(msg,group);
               UMSFreeMsg(login,oldlink);
            }
         }
      }
   }
   else
   {
      /* Mail */

      char namebuf[100];

      msg->ismail=TRUE;

      if(fields[UMSCODE_ToAddr]) sprintf(namebuf,"%s,%s",fields[UMSCODE_ToName],fields[UMSCODE_ToAddr]);
      else                       sprintf(namebuf,"%s",   fields[UMSCODE_ToName]);
      addrecipient(msg,namebuf);

      if(msginfo.msgi_SoftLink)
      {
         long templink,oldlink,startlink;

         startlink=num;
         templink=msginfo.msgi_SoftLink;
         oldlink=0;

         while(templink != startlink && templink!=oldlink)
         {
            char *toname,*toaddr;

            oldlink=templink;

            res2=UMSReadMsgTags(login,UMSTAG_RToName,   &toname,
                                      UMSTAG_RToAddr,   &toaddr,
                                      UMSTAG_RMsgNum,   templink,
                                      UMSTAG_RSoftLink, &templink,
                                      TAG_DONE);

            if(res2)
            {
               if(toaddr) sprintf(namebuf,"%s,%s",toname,toaddr);
               else       sprintf(namebuf,"%s",   toname);
               addrecipient(msg,namebuf);

               UMSFreeMsg(login,oldlink);
            }
         }
      }
   }

   if(fields[UMSCODE_Folder])
      mystrncpy(msg->folder,fields[UMSCODE_Folder],100);

   if(fields[UMSCODE_Subject])
      mystrncpy(msg->subject,fields[UMSCODE_Subject],100);

   if(fields[UMSCODE_Attributes])
      mystrncpy(msg->attributes,fields[UMSCODE_Attributes],100);

   if(fields[UMSCODE_Organization])
      mystrncpy(msg->organization,fields[UMSCODE_Organization],100);

   if(fields[UMSCODE_Distribution])
      mystrncpy(msg->distribution,fields[UMSCODE_Distribution],100);

   if(fields[UMSCODE_ReplyGroup])
      mystrncpy(msg->replygroup,fields[UMSCODE_ReplyGroup],100);

   if(fields[UMSCODE_ReplyName])
      mystrncpy(msg->replyname,fields[UMSCODE_ReplyName],100);

   if(fields[UMSCODE_ReplyAddr])
      mystrncpy(msg->replyaddr,fields[UMSCODE_ReplyAddr],100);

   if(fields[UMSCODE_ReferID])
      mystrncpy(msg->referid,fields[UMSCODE_ReferID],100);

   if(fields[UMSCODE_ToName])
      mystrncpy(msg->toname,fields[UMSCODE_ToName],100);

   msg->chainup=msginfo.msgi_ChainUp;
   msg->oldmsgnum=num;

   if(fields[UMSCODE_MsgText])
   {
      if(fp=fopen(msg->filename,"w"))
      {
         fputs(fields[UMSCODE_MsgText],fp);
         fclose(fp);
      }
   }

   if(fields[UMSCODE_FileName] && fields[UMSCODE_TempFileName])
   {
      char newname[100];

      strcpy(newname,OS_TEMPDIR);
      strncat(newname,fields[UMSCODE_FileName],100);

      if(oscopyfile(fields[UMSCODE_TempFileName],newname))
      {
         strcpy(msg->attachname,newname);
         strcpy(msg->oldattachname,newname);
      }
   }


   UMSFreeMsg(login,res);

   messageprompt(msg,FALSE);

   /* Radera fil som kopierats till tempkatalog under tiden */

   if(msg->oldattachname[0])
      remove(msg->oldattachname);

   freemessage(msg);
}

void kom_forwardmail(char *arg,char *data)
{
   long res;
   struct message *msg;
   char *fields[128],*cfg,*forwardheader;
   struct MessageInfo msginfo;
   FILE *fp;

   if(lastread == 0)
   {
      printf(strings[STR_NOTREADTEXTS]);
      return;
   }

   if(!arg)
   {
      printf(strings[STR_NEEDSARG]);
      return;
   }

   if(!(msg=allocmessage()))
      return;

   if(!addrecipient(msg,arg))
   {
      freemessage(msg);
      return;
   }
   
   res=UMSReadMsgTags(login,UMSTAG_RMsgNum,       lastread,
                            UMSTAG_RTextFields,   fields,
                            UMSTAG_RReadAll,      1,
                            UMSTAG_RMsgInfo,      &msginfo,
                            TAG_DONE);

   if(!res)
   {
      printf(strings[STR_TEXTNRNOTEXIST],lastread);
      return;
   }

   strcpy(msg->folder,currentfolder);

   if(fields[UMSCODE_Subject])
      mystrncpy(msg->subject,fields[UMSCODE_Subject],100);

   strncat(msg->subject," (fwd)",100);

   forwardheader=" * Forwarded message from %k (%g)\n"
                 "\n"
                 " * Original sender: %n <%a>\n"
                 " * Original date: %d\n"
                 "\n";

   if((cfg=getmsgconfig(msg,"ForwardHeader")))
      forwardheader=cfg;

   if(forwardheader[0])
   {
      if(fp=fopen(msg->filename,"w"))
      {
         makeheader(forwardheader,fp,fields);
         fclose(fp);
      }
   }

   if(cfg)
      UMSFreeConfig(login,cfg);

   if(fields[UMSCODE_MsgText])
   {
      if(fp=fopen(msg->filename,"a"))
      {
         fputs(fields[UMSCODE_MsgText],fp);
         fclose(fp);
      }
   }

   if(fields[UMSCODE_FileName] && fields[UMSCODE_TempFileName])
   {
      char newname[100];

      strcpy(newname,OS_TEMPDIR);
      strncat(newname,fields[UMSCODE_FileName],100);

      if(oscopyfile(fields[UMSCODE_TempFileName],newname))
      {
         strcpy(msg->attachname,newname);
         strcpy(msg->oldattachname,newname);
      }
   }

   UMSFreeMsg(login,res);

   msg->ismail=TRUE;

   setdefaultfields(msg);

   messageprompt(msg,FALSE);

   if(msg->oldattachname[0])
      remove(msg->oldattachname);

   freemessage(msg);
}

void kom_forwardpost(char *arg,char *data)
{
   long res;
   struct message *msg;
   char *fields[128],*cfg,*forwardheader;
   struct MessageInfo msginfo;
   struct group *group;

   FILE *fp;

   if(lastread == 0)
   {
      printf(strings[STR_NOTREADTEXTS]);
      return;
   }

   if(!arg)
   {
      printf(strings[STR_NEEDSARG]);
      return;
   }

   if(!(group=expandgroup(arg)))
      return;

   if(!(msg=allocmessage()))
      return;

   if(!addrecipient(msg,group->umsgroup))
   {
      freemessage(msg);
      return;
   }

   res=UMSReadMsgTags(login,UMSTAG_RMsgNum,       lastread,
                            UMSTAG_RTextFields,   fields,
                            UMSTAG_RReadAll,      1,
                            UMSTAG_RMsgInfo,      &msginfo,
                            TAG_DONE);

   if(!res)
   {
      printf(strings[STR_TEXTNRNOTEXIST],lastread);
      return;
   }

   if(fields[UMSCODE_Subject])
      mystrncpy(msg->subject,fields[UMSCODE_Subject],100);

   strncat(msg->subject," (fwd)",100);

   forwardheader=" * Forwarded message from %k (%g)\n"
                 " * Original sender: %n <%a>\n"
                 " * Original date: %d\n"
                 "\n";

   if((cfg=getmsgconfig(msg,"ForwardHeader")))
      forwardheader=cfg;

   if(forwardheader[0])
   {
      if(fp=fopen(msg->filename,"w"))
      {
         makeheader(forwardheader,fp,fields);
         fclose(fp);
      }
   }

   if(cfg)
      UMSFreeConfig(login,cfg);

   if(fields[UMSCODE_MsgText])
   {
      if(fp=fopen(msg->filename,"a"))
      {
         fputs(fields[UMSCODE_MsgText],fp);
         fclose(fp);
      }
   }

   if(fields[UMSCODE_FileName] && fields[UMSCODE_TempFileName])
   {
      char newname[100];

      strcpy(newname,OS_TEMPDIR);
      strncat(newname,fields[UMSCODE_FileName],100);

      if(oscopyfile(fields[UMSCODE_TempFileName],newname))
      {
         strcpy(msg->attachname,newname);
         strcpy(msg->oldattachname,newname);
      }
   }

   UMSFreeMsg(login,res);

   setdefaultfields(msg);

   messageprompt(msg,FALSE);

   if(msg->oldattachname[0])
      remove(msg->oldattachname);

   freemessage(msg);
}


void editkom_showhelp(char *arg,char *data)
{
   struct command *matchcmd;
   char *temparg;
   char filebuf[200];
   long c,d,e;
   FILE *fp;
   char s[1000];

   if(!arg)
   {
      printf(strings[STR_NEEDSARG]);
      return;
   }

   matchcmd=expandcommand(arg,&temparg,firsteditcommand);

   if(!matchcmd)
      return;

   for(e=0;editcommandnames[e].name;e++)
      if(editcommandnames[e].func == matchcmd->func) break;

   if(!editcommandnames[e].name)
      return;

   d=0;
   for(c=0;c<strlen(data) && d!=sizeof(filebuf)-1;c++)
   {
      if(data[c]=='%' && (data[c+1]|32)=='c')
      {
         strncpy(&filebuf[d],editcommandnames[e].name,(size_t)(sizeof(filebuf)-1-d));
         filebuf[sizeof(filebuf)-1]=0;
         d=strlen(filebuf);
         c++;
      }
      else filebuf[d++]=data[c];
   }
   filebuf[d]=0;

   if(!(fp=fopen(filebuf,"r")))
   {
      printf(strings[STR_NOHELP]);
      return;
   }

   brk=FALSE;
   linesonscreen=0;

   while(fgets(s,999,fp) && !brk)
   {
      if(s[0] != 0)
         s[strlen(s)-1]=0;

      ownprintf("%s\n",s);
   }

   fclose(fp);

   if(brk)
   {
      printf("\n");
      printf(strings[STR_BREAK]);
   }
}

