home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / ftp.vapor.com / microdot-1 / md1_src_02.lzx / spool.c < prev    next >
C/C++ Source or Header  |  1980-03-29  |  41KB  |  1,958 lines

  1.  
  2. #include "microdot.h"
  3.  
  4. #include "ogre.h"
  5. #include "asyncio.h"
  6. #include "ogre_protos.h"
  7.  
  8. //static __far UBYTE buffer[ 8192 ];
  9.  
  10. static unsigned char *buffer;
  11. ALLOCSTATIC( buffer, 8192, MEMF_CLEAR )
  12.  
  13. extern char unregistered[];
  14.  
  15. void delspool( void )
  16. {
  17.     struct mbrett *sp=findbrett("/╗SPOOL",0);
  18.     struct mindex *mix;
  19.     struct mmail *mm, *next;
  20.  
  21.     mix = loadbrettixquiet( sp );
  22.     if( !mix )
  23.     {
  24.         displaybeep();
  25.         return;
  26.     }
  27.  
  28.     mm = ( struct mmail * ) mix->maillist.lh_Head;
  29.  
  30.     while( next = ( struct mmail * ) mm->n.mln_Succ )
  31.     {
  32.         if( ! ( mm->m.flags & MMF_ARCHIVE ) ) 
  33.         {
  34.             Remove( mm );
  35.             mix->changed = TRUE;
  36.         }
  37.         mm = next;
  38.     }
  39.     savebrettix( mix, sp );
  40.     freebrettix( mix );
  41.  
  42. /*    brettpfad(path,sp);
  43.     sp->b.mails = sp->b.newmails = sp->b.unreadmails = 0;
  44.     closeixfile( sp );
  45.     delpathcontents(path,0,0);*/
  46.  
  47.     prefs.flags2 &= ~MDF2_REPORT;
  48.  
  49.     saveprefs( currentprefsname );
  50.     savebretter();
  51.     flushbrettix();
  52. }
  53.  
  54. extern USHORT wrotenewmails;
  55. void sendshortmail(char *emp,char *betreff,char *msg,char *bez,char *specialheader,char *specialdata, ULONG flags)
  56. {
  57.     char tmp[256];
  58.     struct mbrett *spoolbrett=findbrett("/╗SPOOL",0);
  59.     struct mbrett *pm;
  60.     struct hlist *hlist;
  61.     struct pindex *pix;
  62.     struct mail mail;
  63.  
  64.     hlist = hl_initheader();
  65.  
  66.     //scpy_iso2ibm( betreff, tmp );
  67.     hl_addheader( hlist, "BET", betreff );
  68.     //scpy_iso2ibm( emp, tmp );
  69.     hl_addheader( hlist, "EMP", emp );
  70.     hl_addheader( hlist, "MID", makemid());
  71.  
  72.     pm = findpmbrett( hlist );
  73.  
  74.     /* PGP-PUBLIC-KEY adden */
  75.     if( pgpavail )
  76.     {
  77.         if( ( flags & 2 ) )
  78.             pgp_addpubkey( hlist );
  79.         else
  80.             hl_addheader( hlist, "PGP-KEY-AVAIL", prefs.pgp_avail );
  81.     }
  82.  
  83.     makedateheader( tmp, time(0) );
  84.     if( prefs.ebmode & EBMODE_00 )
  85.         memset( &tmp[8], '0', 6 );
  86.  
  87.     hl_addheader( hlist, "EDA", tmp );
  88.     if(bez)    hl_addheader( hlist, "BEZ", bez );
  89.     if(specialheader)
  90.         hl_addheader( hlist, specialheader, specialdata );
  91.  
  92.     memset( &mail, 0, sizeof( mail ) );
  93.     header2mail( hlist, &mail );
  94.     mail.flags &= ~MMF_ARCHIVE;
  95.     mail.flags |= MMF_UNSEEN;
  96.     pix = msg_store( NULL, 0, msg, strlen( msg ),
  97.         &mail.pufferID, &mail.mailID, hlist );
  98.  
  99.     mail.maillen = pix->datasize;
  100.  
  101.     storemail2ix( &mail, spoolbrett, ( flags & 1 ) ? pm : NULL, NULL );
  102.  
  103.     if( ! ( prefs.flags2 & MDF2_OWNMAILSNEW ) )
  104.     {
  105.         if( flags & 1 )
  106.             pm->b.newmails--;
  107.         /*spoolbrett->b.newmails--;*/
  108.     }
  109.  
  110.     hl_freeheader( hlist );
  111.     closeallixfiles();
  112.     flushbrettix();
  113.  
  114.     wrotenewmails = TRUE;
  115. }
  116.  
  117. void domailinglist( void )
  118. {
  119.     int rc;
  120.     char mdlistname[ 80 ];
  121.     struct mbrett *listbrett;
  122.  
  123.     rc = askreq( "Hiermit k÷nnen Sie sich zur MicroDot-Mailingliste anmelden.\nEs wird automatisch ein PM-Postfach dafⁿr eingerichtet.", "Liste bestellen|Liste abbestellen|Abbruch" );
  124.     if( !rc )
  125.         return;
  126.  
  127.     sendshortmail( "MicroDot-REQUEST@vapor.com", "MicroDot-Mailingliste", rc == 2 ? "UNSUBSCRIBE" : "SUBSCRIBE", 0, 0, 0, 1 );
  128.     sprintf( mdlistname, "%s/MicroDot-Mailingliste", prefs.username );
  129.     if( rc == 2 )
  130.         return;
  131.  
  132.     listbrett = findbrett( mdlistname, FALSE );
  133.  
  134.     if( !listbrett )
  135.     {
  136.         struct brettinfo bi;
  137.  
  138.         memset( &bi, 0, sizeof( bi ) );
  139.  
  140.         // brett erzeugen
  141.         listbrett = findbrett( mdlistname, TRUE );
  142.         strcpy( listbrett->b.betreff, "MicroDot-Support-Mailingliste" );
  143.         listbrett->b.flags |= BFLAG_EXTEND_PM;        
  144.  
  145.         strcpy( bi.expm_header, "ANTWORT-AN" );
  146.         strcpy( bi.expm_data, "MicroDot@vapor.com" );
  147.         strcpy( bi.antwortan, "MicroDot@vapor.com" );
  148.  
  149.         setbrettinfo( listbrett, &bi );
  150.         sortbrettlist();
  151.     }
  152. }
  153.  
  154. void dobugreport(void)
  155. {
  156.     char tmp[128];
  157.     FILE *f;
  158.     BPTR outfile;
  159.     void *buffer;
  160.     long bufferlen;
  161.     int c;
  162.     struct Library *verlib;
  163.  
  164.     sprintf(tmp,"ram:mdbugreport.%lx",FindTask(0));
  165.  
  166.     f=fopen(tmp,"w");
  167.     if(!f) { displaybeep(); return; }
  168.  
  169.     verlib=OldOpenLibrary("version.library");
  170. #ifdef MDV20
  171.     fprintf(f,"$INFO$%lx$%ld.%ld$%ld.%ld$%04lx$%s-020$%ld.%ld$%ld$\n\n",
  172. #else
  173.     fprintf(f,"$INFO$%lx$%ld.%ld$%ld.%ld$%04lx$%s$%ld.%ld$%ld$\n\n",
  174. #endif
  175.         SysBase->AttnFlags,
  176.         SysBase->LibNode.lib_Version,SysBase->SoftVer,
  177.         (verlib)?verlib->lib_Version:-1,(verlib)?verlib->lib_Revision:-1,
  178.         registerinfo.serie,
  179.         MDVER,
  180.         ReqToolsBase->LibNode.lib_Version,
  181.         ReqToolsBase->LibNode.lib_Revision,
  182.         prefs.mode
  183.     );
  184.     CloseLibrary(verlib);
  185.     fprintf( f, "## AUSF▄HRLICHE FEHLERBESCHREIBUNG ##\n\n\n\n" );
  186.     fprintf( f, "## WIE WIRD DER FEHLER ERZEUGT? ##\n\n\n\n" );
  187.     fprintf( f, "## VERHALTEN MIT ANDEREN VERSIONEN & KONFIGURATIONEN ##\n\n\n\n" );
  188.  
  189.     fprintf( f, "## MAILBOX-SOFTWARE (falls relevant) ##\n\n\n\n" );
  190.  
  191.     fclose( f );
  192.  
  193.     for(;;)
  194.     {
  195.         calleditor( tmp );
  196.         c=askreq("Bugmeldung verschicken?","Ja|_Weitereditieren|Nein");
  197.         if( c!=2 )
  198.             break;
  199.     }
  200.  
  201.     if(c)
  202.     {
  203.         bufferlen=getfilelen(tmp);
  204.         if( bufferlen > 1 )
  205.         {
  206.             buffer = AllocMem(bufferlen+1,MEMF_CLEAR);
  207.             outfile = Open( tmp, MODE_OLDFILE );
  208.             Read( outfile, buffer, bufferlen );
  209.             Close( outfile );
  210.             sendshortmail("MicroDOT-Bugs@vapor.com","** BUGMELDUNG",buffer,0,"EB","",1);
  211.             FreeMem( buffer, bufferlen + 1 );
  212.         }
  213.     }
  214.  
  215.     DeleteFile(tmp);
  216. }
  217.  
  218. #include "registertxt.h"
  219.  
  220. void doregisterform(void)
  221. {
  222.     char tmp[128];
  223.     FILE *f;
  224.     BPTR outfile;
  225.     void *buffer;
  226.     long bufferlen;
  227.     int c;
  228.  
  229.     if( prefs.registertime )
  230.     {
  231.         int days = ( time( 0 ) - prefs.registertime ) / 86400;
  232.  
  233. reask2:
  234.         c = askreq( 
  235. "Sie haben bereits vor %ld Tagen\n"
  236. "ein Registrierformular verschickt.",
  237.             "Erneut Formular verschicken|Hilfe|Abbruch", 
  238.             days
  239.         );
  240.  
  241.         if( !c )
  242.             return;
  243.  
  244.         if( c == 2 )
  245.         {
  246.             showguide( "menu_brett_4_10" );
  247.             goto reask2;
  248.         }
  249.     }
  250.  
  251.     //sprintf(tmp,"T:mdregister.%lx",FindTask(0));
  252.  
  253.     strcpy( tmp, "MD-Register-Form.txt" );
  254.  
  255.     if( !exists( tmp ) )
  256.     {
  257.         f=fopen(tmp,"w");
  258.         if(!f)
  259.         {
  260.             displaybeep();
  261.             return;
  262.         }
  263.  
  264.         fprintf( f, mdregisterData,
  265.             prefs.userrealname,
  266.             prefs.telefon,
  267.             prefs.username, prefs.boxname, prefs.boxdomain
  268.         );
  269.  
  270.         fclose(f);
  271.     }
  272.  
  273.     for(;;)
  274.     {
  275.         calleditor( tmp );
  276. reask:
  277.         c = askreq("Registrierformular verschicken?","Verschicken|_Drucken & Verschicken|_Weitereditieren|Hilfe|Nein");
  278.         if( c == 4 )
  279.         {
  280.             showguide( "menu_brett_4_10" );
  281.             goto reask;
  282.         }
  283.  
  284.         if( c!=3 )
  285.             break;
  286.     }
  287.  
  288.     if( c )
  289.     {
  290.         bufferlen=getfilelen(tmp);
  291.         buffer = AllocMem(bufferlen+1,MEMF_CLEAR);
  292.         outfile = Open( tmp, MODE_OLDFILE );
  293.         Read( outfile, buffer, bufferlen );
  294.         Close( outfile );
  295.         sendshortmail( "Reg-DE@vapor.com", "** MD1-Registrierung", buffer, 0, NULL, NULL, 3 );
  296.  
  297.         if( c == 2 )
  298.         {
  299.             f = fopen( "PRT:", "w" );
  300.             if( f )
  301.             {
  302.                 fwrite( buffer, bufferlen, 1, f );
  303.                 fclose( f );
  304.             }
  305.         }
  306.  
  307.         FreeMem( buffer, bufferlen + 1 );
  308.  
  309.         time( &prefs.registertime );
  310.     }
  311.  
  312.     DeleteFile(tmp);
  313. }
  314.  
  315.  
  316. void sendmapsreq( int mode )
  317. {
  318.     char bf[á1024 ], *p;
  319.  
  320.     if( mode == 4 )
  321.     {
  322.         int Done = FALSE;
  323.         struct ogwin *ogw;
  324.         struct IntuiMessage *im;
  325.         struct Window *w;
  326.  
  327.         if( prefs.maps_msgprefix[á0 ]á)
  328.         {
  329.             BPTR f = Open( TMPMSGNAME, MODE_NEWFILE );
  330.             Write( f, prefs.maps_msgprefix, strlen( prefs.maps_msgprefix ) );
  331.             Close( f );
  332.         }
  333.         else
  334.             DeleteFile( TMPMSGNAME );
  335.  
  336.         ogw = ogreInitWindow( scr, 0, 0, "Nachricht an MAPS" );
  337.         ogreAddGroup( ogw, 0, OGFRAME_NONE, NULL );
  338.         ogreAddString( ogw, 0, 'b', "_Betreff", 1, "", 40, 40 );
  339.         ogreAddButton( ogw, 1 | OGB_ONENTER, 'v', "_Verschicken", 2 );
  340.         ogreAddButton( ogw, 1, 'e', "Text _Editieren", 3 );
  341.         ogreAddButton( ogw, 1 | OGB_ONESC, 'a', "_Abbruch", 4 );
  342.         w = ogreOpenWindow( ogw );
  343.         if( !w )
  344.             return;
  345.  
  346.         while( !Done )
  347.         {
  348.             im = ogreWaitIM( ogw );
  349.  
  350.             if( im->Class == IDCMP_GADGETHELP)
  351.                 showguidenum( "mapsany_gads", im->Code );
  352.             else if( im->Class == GADGETUP )
  353.                 switch( im->Code )
  354.                 {
  355.                     case 2: Done = 2; break;
  356.                     case 3:
  357.                         calleditor( TMPMSGNAME );
  358.                         ActivateWindow( w );
  359.                         break;
  360.                     case 4: Done = 1; break;
  361.                 }
  362.  
  363.             ogreIMReply( ogw, im );
  364.         }
  365.  
  366.         if( Done == 2 )
  367.         {
  368.             int ml = getfilelen( TMPMSGNAME );
  369.             char *msg;
  370.  
  371.             ml = max( ml, 2 );
  372.             msg = AllocMem( ml + 1, MEMF_CLEAR );
  373.             if( msg )
  374.             {
  375.                 BPTR f = Open( TMPMSGNAME, MODE_OLDFILE );
  376.  
  377.                 strcpy( msg, "\n" );
  378.                 if( f )
  379.                 {
  380.                     Read( f, msg, ml );
  381.                     Close( f );
  382.                 }
  383.                 sendshortmail( prefs.mapsname, ogreStringValue( ogw, 1 ), msg, 0, 0, 0, 1 );
  384.                 FreeMem( msg, ml + 1 );
  385.             }
  386.  
  387.         }
  388.  
  389.         ogreExitWindow( ogw );
  390.  
  391.         DeleteFile( TMPMSGNAME );
  392.         return;
  393.     }
  394.  
  395.     switch(mode)
  396.     {
  397.         case 0: p = prefs.maps_list;
  398.                 break;
  399.         case 1: p = prefs.maps_list_verbose;
  400.                 break;
  401.         case 2: p = prefs.maps_help;
  402.                 break;
  403.         case 3: p = prefs.maps_clearpm;
  404.                 break;
  405.     }
  406.     strcpy( bf, prefs.maps_msgprefix );
  407.     strcat( bf, "\n\n" );
  408.     sendshortmail( prefs.mapsname, p, bf, 0,0,0,1 );
  409. }
  410.  
  411. void copyff(FILE *from,FILE *to,long len)
  412. {
  413.     char *buf;
  414.     long buffsize,readlen;
  415.  
  416.     buf = allocbuffmem( len, &buffsize );
  417.  
  418.     while(len) {
  419.         readlen=fread(buf,1,buffsize,from);
  420.         if(readlen<1) break;
  421.         fwrite(buf,readlen,1,to);
  422.         len-=readlen;
  423.     }
  424.  
  425.     freebuffmem();
  426. }
  427.  
  428. static void *rctxtbf;
  429. static long readconvtxt( struct msghandle *msg )
  430. {
  431.     long len=0, x;
  432.  
  433.     msg_initread( msg, MC_DATA );
  434.  
  435.     while( x = msg_read( msg, buffer, 2048 ) )
  436.     {
  437.         /*clnl( buffer );*/
  438.         len += strlen( buffer ) + ( ( x == 1 ) ? 2 : 0 );
  439.     }
  440.     msg_endread( msg );
  441.     return( len );
  442. }
  443.  
  444. static long getnoconvcommentsize( struct msghandle *msg )
  445. {
  446.     return( msg->pix.commentsize );
  447. }
  448.  
  449. static long getconvcommentsize( struct msghandle *msg )
  450. {
  451.     long len=0, x;
  452.  
  453.     if( !msg->pix.commentsize )
  454.         return( 0 );
  455.  
  456.     msg_initread( msg, MC_COMMENT );
  457.  
  458.     while( x = msg_read( msg, buffer, 8192 ) )
  459.     {
  460.         len+=strlen(buffer) + ( ( x == 1 ) ? 2 : 0 );
  461.     }
  462.     msg_endread( msg );
  463.     return( len );
  464. }
  465.  
  466.  
  467. static void copyconvtxt( struct msghandle *msg, FILE *to )
  468. {
  469.     int x;
  470.  
  471.     if( !msg->pix.datasize )
  472.         return;
  473.  
  474.     msg_initread( msg, MC_DATA );
  475.  
  476.     while( x = msg_read( msg, buffer, 8192 ) )
  477.     {
  478.         /*clnl(buffer);*/
  479.         //siso2ibm(buffer);
  480.         if( x == 1 )
  481.             fprintf( to, "%s\r\n", buffer );
  482.         else
  483.             fprintf( to, "%s", buffer );
  484.     }
  485.  
  486.     msg_endread( msg );
  487. }
  488.  
  489. void convpgpmsg( void )
  490. {
  491.     struct AsyncFile *f1, *f2;
  492.     int ch;
  493.  
  494.     f1 = OpenAsync( "T:mdpgp.iso", MODE_READ, 2048 );
  495.     f2 = OpenAsync( "T:mdpgp.txt", MODE_WRITE, 2048 );
  496.  
  497.     if( !f1 || !f2 )
  498.     {
  499.         if( f1 )
  500.             CloseAsync( f1 );
  501.         if( f2 )
  502.             CloseAsync( f2 );
  503.         displaybeep();
  504.         return;
  505.     }
  506.  
  507.     while( ( ch = ReadCharAsync( f1 ) ) != EOF )
  508.     {
  509.         if( ch == 10 )
  510.             WriteCharAsync( f2, 13 );
  511.         WriteCharAsync( f2, iso2ibm( ch ) );
  512.     }
  513.  
  514.     CloseAsync( f1 );
  515.     CloseAsync( f2 );
  516. }
  517.  
  518. static void copypgp( FILE *to )
  519. {
  520.     struct AsyncFile *f1 = OpenAsync( "T:mdpgp.pgp", MODE_READ, 2048 );
  521.     int ch;
  522.  
  523.     if( !f1 )
  524.         return;
  525.  
  526.     while( ( ch = ReadCharAsync( f1 ) ) != EOF )
  527.         fputc( ch, to );
  528.  
  529.     CloseAsync( f1 );
  530.     DeleteFile( "T:mdpgp.txt" );
  531. }
  532.  
  533.  
  534. static void copyconvcomment( struct msghandle *msg, FILE *to )
  535. {
  536.     int x;
  537.  
  538.     if( !msg->pix.commentsize )
  539.         return;
  540.  
  541.     msg_initread( msg, MC_COMMENT );
  542.  
  543.     while( x = msg_read( msg, buffer, 8192 ) )
  544.     {
  545.         /*clnl( buffer );*/
  546.         //siso2ibm( buffer );
  547.         if( x == 1 )
  548.             fprintf( to, "%s\r\n", buffer );
  549.         else
  550.             fprintf( to, "%s", buffer );
  551.     }
  552.  
  553.     msg_endread( msg );
  554. }
  555.  
  556. #define SP_N 1
  557. #define SP_F 2
  558.  
  559. extern int allow_trace;
  560.  
  561. static void copyfile2fp( char *file, FILE *fp )
  562. {
  563.     struct AsyncFile *f = OpenAsync( file, MODE_READ, 8192 );
  564.     int ch;
  565.  
  566.     if( !f )
  567.         return;
  568.  
  569.     while( ( ch = ReadCharAsync( f ) ) >= 0 )
  570.     {
  571.         if( ch == 13 )
  572.             continue;
  573.         if( ch == 10 )
  574.             fputc( 13, fp );
  575.         fputc( ch, fp );
  576.     }
  577.  
  578.     CloseAsync( f );
  579. }
  580.  
  581. static long getcrlflen( char *file )
  582. {
  583.     struct AsyncFile *f = OpenAsync( file, MODE_READ, 8192 );
  584.     int len = 0, ch;
  585.  
  586.     if( !f )
  587.         return( -1 );
  588.  
  589.     while( ( ch = ReadCharAsync( f ) ) >= 0 )
  590.     {
  591.         if( ch == 13 )
  592.             continue;
  593.         len++;
  594.         if( ch == 10 )
  595.             len++;
  596.     }
  597.  
  598.     CloseAsync( f );
  599.  
  600.     return( len );
  601. }
  602.  
  603.  
  604. static int dospool_zc(void)
  605. {
  606.     FILE *puffer;
  607.     char tmp[256],*p, *p2;
  608.     int c,d,e,bin;
  609.     long len;
  610.     char line[ 4096 ];
  611.     char mid[ 128 ];
  612.     struct Window *iw;
  613.     struct ogwin *ogw;
  614.     struct mindex *mix;
  615.     struct mbrett *spool = findbrett( "/╗SPOOL", 0 );
  616.     struct header *hl;
  617.     struct hlist *hlist;
  618.     struct msghandle *msg;
  619.     struct mmail *mm;
  620.     int pgpsign, pgpcrypt;
  621.     int rc = 0;
  622.  
  623.     ogw = ogreInitWindow( scr, 0, NULL, "Spoole ausgehende Nachrichten..." );
  624.     ogreAddGroup( ogw, 0, OGFRAME_NONE, NULL );
  625.     ogreAddText( ogw, 0, "Nachricht:", SP_N, "", 46, 1 );
  626.     ogreAddFuelGauge( ogw, 1, SP_F, 100 );
  627.     iw = ogreOpenWindow( ogw );
  628.     if( !iw )
  629.         return( 0 );
  630.  
  631.     /*preport(0,1,"Spoole ausgehende Nachrichten...");
  632.     preport(1,0,"");*/
  633.  
  634.     delpathcontents(prefs.transferdir,0,0);
  635.     sprintf(tmp,"%sPUFFER",prefs.transferdir);
  636.     puffer=fopen(tmp,"w");
  637.  
  638.     if(!puffer)
  639.     {
  640.         askreq("Fehler beim Spoolen:\nDatei '%s'álΣ▀t sich nicht ÷ffnen (%ld)\n%s","Abbruch",tmp,_OSERR, errorstring( _OSERR ) );
  641.         ogreExitWindow( ogw );
  642.         return( -1 );
  643.     }
  644.     fsetbuf( puffer, 8192 );
  645.  
  646.     mix = loadbrettix( spool );
  647.     if( !mix )
  648.     {
  649.         displaybeep();
  650.         fclose( puffer );
  651.         return( -2 );
  652.     }
  653.  
  654.     flushbrettix();
  655.  
  656.     loaduserlist();
  657.  
  658.     ogreSetMaxVal( ogw, SP_F, mix->mailcount );
  659.  
  660.     for( c = 0, mm = ( struct mmail * ) mix->maillist.lh_Head; mm->n.mln_Succ; mm = ( struct mmail * ) mm->n.mln_Succ, c++ )
  661.     {
  662.         if( mm->m.flags & ( MMF_DEL | MMF_ARCHIVE ) )
  663.             continue;
  664.  
  665.         msg = msg_open( mm->m.pufferID, mm->m.mailID );
  666.         if( !msg )
  667.         {
  668.             displaybeep();
  669.             continue;
  670.         }
  671.  
  672.         sprintf( mid, "%lD (%lD Bytes Header, %lD Inhalt, %lD Kommentar)", c+1, msg->pix.headersize, msg->pix.datasize, msg->pix.commentsize );
  673.         ogreSetStringValue( ogw, SP_N, mid );
  674.         ogreSetValue( ogw, SP_F, c );
  675.  
  676.         hlist = msg_loadheader( msg );
  677.  
  678.         if( hl_findheader( hlist, "ABS" ) )
  679.         {
  680.             msg_close( msg );
  681.             hl_freeheader( hlist );
  682.             continue;
  683.         }
  684.  
  685.         /* Z38-Puffer erzeugen */
  686.         if( ISN38 )
  687.         {
  688.             struct header *hl, *hl2, *emp;
  689.  
  690.             /* Alle EMP:s durchgehen */
  691.             emp = hl_findheader( hlist, "EMP" );
  692.             while( emp )
  693.             {
  694.                 strcpy( line, emp->data );
  695.                 p = strchr( line, ' 'á);
  696.                 if( p )
  697.                     *p = 0;
  698.  
  699.                 p = strchr( line, '@' );
  700.                 if( p++ )
  701.                 {
  702.                     strupr( p );
  703.                     p2 = strchr( p, '.' );
  704.                     if( p2 )
  705.                         *p2 = 0;
  706.  
  707.                     if( !stricmp( prefs.boxname, p ) )
  708.                         p[-1] = 0;
  709.                     else
  710.                         strcat( p, ".ZER" );
  711.                 }
  712.  
  713.                 /* EmpfΣnger fertig */
  714.                 fprintf( puffer, "%s\r\n", line );
  715.  
  716.                 /* Betreff */
  717.                 hl2 = hl_findheader( hlist, "EB" );
  718.                 hl = hl_findheader( hlist, "BET" );
  719.                 strncpy( line, hl->data, 40 );
  720.                 line[38] = 0;
  721.                 siso2ibm( line );
  722.                 if( hl2 )
  723.                     fprintf( puffer, "##%s\r\n", line );
  724.                 else
  725.                     fprintf( puffer, "%s\r\n", line );
  726.  
  727.                 /* Absender */
  728.                 sprintf( line, "%s@%s.ZER", 
  729.                     prefs.username, prefs.boxname );
  730.                 strupr( strchr( line, '@' ) );
  731.                 fprintf( puffer, "%s\r\n", line );
  732.  
  733.                 /* Datum */
  734.                 hl = hl_findheader( hlist, "EDA" );
  735.                 fprintf( puffer, "%10.10s\r\n", &hl->data[2] );
  736.  
  737.                 /* Routpfad */
  738.                 fprintf( puffer, "\r\n" );
  739.  
  740.                 /* MsgID */
  741.                 hl = hl_findheader( hlist, "MID" );
  742.                 fprintf( puffer, "%s\r\n", hl->data );
  743.  
  744.                 /* Typ */
  745.                 hl = hl_findheader( hlist, "TYP" );
  746.                 if( hl )
  747.                     bin = TRUE;
  748.                 else
  749.                     bin = FALSE;
  750.                 fprintf( puffer, "%s\r\n", (bin) ? "B" : "T" );
  751.  
  752.                 /* ZusΣtzliche Header */
  753.                 if( !bin )
  754.                 {
  755.                     len = readconvtxt( msg );
  756.  
  757.                     sprintf( line, "Mailer: MicroDot " MDVER " %s\r\n",
  758.                         registerinfo.serie ? registerinfo.registriert_txt : unregistered );
  759.  
  760.                     hl = hl_findheader( hlist, "BEZ" );
  761.                     while( hl )
  762.                     {
  763.                         asprintf( line, "References: <%s>\r\n",    hl->data );
  764.                         hl = hl_findnextheader( hl );
  765.                     }
  766.  
  767.                     asprintf( line, "Realname: %s\r\n", prefs.userrealname );
  768.                     if(prefs.organisation[0])
  769.                         asprintf( line, "Organization: %s\r\n",prefs.organisation);
  770.                     if(prefs.telefon[0])
  771.                         asprintf( line, "Telefon: %s\r\n",prefs.telefon);
  772.                     if(prefs.postanschrift[0])
  773.                         asprintf( line, "Postanschrift: %s\r\n",prefs.postanschrift);
  774.  
  775.                     strcat( line, "\r\n" );
  776.                     siso2ibm( line );
  777.                     len += strlen( line );
  778.  
  779.                     fprintf( puffer, " %ld\r\n%s", len, line );
  780.                     copyconvtxt( msg, puffer );
  781.                 }
  782.                 else
  783.                 {
  784.                     fprintf( puffer, " %ld\r\n", msg->pix.datasize );
  785.                     msg_copyfp( msg, puffer, MC_DATA );
  786.                 }
  787.  
  788.                 emp = hl_findnextheader( emp );                
  789.             }
  790.             msg_close( msg );
  791.             hl_freeheader( hlist );
  792.             continue;
  793.         }
  794.  
  795. #if 0
  796.         /* EMP: prⁿfen */
  797. /*        if( strcmp( prefs.userrealname, "Oliver Wagner" ) && strcmp( prefs.boxname, "pluribus" ) )
  798.         {*/
  799.             hl = hl_findheader( hlist, "EMP" );
  800.             d = 0;
  801.             while( hl )
  802.             {
  803.                 if( !stricmp( hl->data, "/T-NETZ/SUPPORT/MICRODOT" ) )
  804.                     d |= 1;
  805.                 else if( !stricmp( hl->data, "/T-NETZ/SUPPORT/MICRODOT-BETA" ) || !stricmp( hl->data, "/T-NETZ/SUPPORT/MICRODOT/BETA" ) )
  806.                 {
  807.                     d |= 2;
  808.                     hl_delheader( hl );
  809.                     hl = hl_findheader( hlist, "EMP" );
  810.                     continue;
  811.                 }
  812.  
  813.                 hl = hl_findnextheader( hl );
  814.             }
  815.     
  816.             if( d & 2 )
  817.             {
  818.                 if( ! ( d & 1 ) )
  819.                     hl_addheader( hlist, "EMP", "/T-NETZ/SUPPORT/MICRODOT" );            
  820.     
  821.             }
  822. //        }
  823. #endif
  824.  
  825.         sprintf(line,"ABS: %s@%s%s (%s)\r\n",prefs.username,prefs.boxname,prefs.boxdomain,prefs.userrealname);
  826.         siso2ibm(line);
  827.         fputs(line,puffer);
  828.  
  829.         bin = hl_testheader( hlist, "TYP", NULL );
  830.         pgpsign = hl_testheader( hlist, "SIGNED", "PGP" );
  831.         pgpcrypt = hl_testheader( hlist, "CRYPT", "PGP" );
  832.     
  833.         hl = hl_findheader( hlist, NULL );
  834.         do
  835.         {
  836.             strcpy( buffer, hl->head );
  837.             p = strchr( buffer, 0 );
  838.             *p++ = ':';
  839.             *p++ = ' ';
  840.             stccpy( p, hl->data, 7900 );
  841.             siso2ibm( buffer );
  842.  
  843.             if( ( !stricmp( hl->head, "TYP" ) ) )
  844.             {
  845.                 continue;
  846.             }
  847.             else if( !stricmp( hl->head, "MID" ) )
  848.                 strcpy( mid, hl->data );
  849.             /*else if( !stricmp( hl->head, "BET" ) )
  850.             {
  851.                 scpy_iso2ibm( hl->data, &buffer[ 4 ]á);
  852.             }*/
  853.             else if( !stricmp( hl->head, "EMP" ) )
  854.             {
  855.                 strcpy( &buffer[ 5 ], hl->data );
  856.                 if( !strchr( hl->data, '/' ) && !strchr( hl->data, '@' ) )
  857.                 {
  858.                     //scpy_iso2ibm( hl->data, &buffer[ 4 ]á);
  859.                     asprintf( &buffer[5], "@%s%s",
  860.                         prefs.boxname,
  861.                         prefs.boxdomain
  862.                     );
  863.                 }
  864. /*                else
  865.                     scpy_iso2ibm( hl->data, &buffer[ 4 ]á);*/
  866.                 if( p = strchr( &buffer[á5 ], ' 'á) )
  867.                     *p = 0;
  868.             }
  869.             else if( !allow_trace && !stricmp( hl->head, "TRACE" ) )
  870.                 continue;
  871.  
  872.             fprintf( puffer, "%s\r\n", buffer );
  873.  
  874.         } while( ( hl = hl_nextheader( hl ) ) );
  875.  
  876. /*        if( coded )
  877.         {
  878.             strupr( mid );
  879.             mailcode = crc32( mid, strlen( mid ) );
  880.  
  881.             hl = hl_findheader( hlist, MDCRYPTHEADER );
  882.             if( hl )
  883.                 hl_delheader( hl );
  884.  
  885.             fprintf( puffer, "%s:M%lc%lx\r\n",
  886.                 MDCRYPTHEADER,
  887.                 'A' + ( time( 0 ) % 25 ),
  888.                 mailcode
  889.             );
  890.             bin = FALSE;
  891.         }*/
  892.  
  893.         sprintf( line, "MAILER: MicroDot " MDVER " %s\r\n",
  894.             registerinfo.serie ? registerinfo.registriert_txt : unregistered );
  895.         siso2ibm( line );
  896.         fputs( line, puffer );
  897.  
  898.         if( !pgpcrypt )
  899.             fputs( "CHARSET: ISO1\r\n", puffer );
  900.  
  901.         if( prefs.organisation[ 0 ] )
  902.         {
  903.             sprintf(line,"ORG: %s\r\n",prefs.organisation);
  904.             siso2ibm(line);
  905.             fputs(line,puffer);
  906.         }
  907.         if( prefs.telefon[ 0 ] )
  908.         {
  909.             sprintf( line, "TELEFON: %s\r\n", prefs.telefon );
  910.             siso2ibm( line );
  911.             fputs( line, puffer );
  912.         }
  913.         if( prefs.postanschrift[ 0 ] )
  914.         {
  915.             sprintf( line, "POST: %s\r\n", prefs.postanschrift );
  916.             siso2ibm( line ); 
  917.             fputs( line, puffer );
  918.         }
  919.  
  920.         if( pgpsign || pgpcrypt )
  921.         {
  922.             DeleteFile( "T:mdpgp.iso" );
  923.             DeleteFile( "T:mdpgp.txt" );
  924.             DeleteFile( "T:mdpgp.pgp" );
  925.             DeleteFile( "T:mdpgp.sig" );
  926.             /* Nur signen */
  927.             if( !pgpcrypt )
  928.             {
  929.                 e = getconvcommentsize( msg );
  930.                 if( e )
  931.                 {
  932.                     fprintf( puffer, "KOM: %ld\r\n", e );
  933.                 }
  934.  
  935.                 if( !bin )
  936.                 {
  937.                     msg_copy( msg, "T:mdpgp.iso", MC_COMMENT | MC_DATA );
  938.                     convpgpmsg();
  939.                     DeleteFile( "T:mdpgp.iso" );
  940.                 }
  941.                 else    /* BinΣr, erst Kommentar wandeln */
  942.                 {
  943.                     BPTR pgpf;
  944.  
  945.                     if( e )
  946.                     {
  947.                         msg_copy( msg, "T:mdpgp.iso", MC_COMMENT );
  948.                         convpgpmsg();
  949.                         DeleteFile( "T:mdpgp.iso" );
  950.                     }
  951.  
  952.                     pgpf = Open( "T:mdpgp.txt", MODE_READWRITE );
  953.                     if( !pgpf )
  954.                     {
  955.                         rc = 1;
  956.                         break;
  957.                     }
  958.                     Seek( pgpf, 0, OFFSET_END );
  959.                     msg_copyfh( msg, pgpf, MC_DATA );
  960.                     Close( pgpf );
  961.                 }
  962.  
  963.                 /* Gut, in T:mdpgp.txt steht jetzt die komplette Nachricht */
  964.  
  965.                 sprintf( line, "-sb -u \"%s\" -o T:mdpgp.sig T:mdpgp.txt",
  966.                     prefs.pgp_userid
  967.                 );
  968.  
  969.                 if( rc = runpgp( line, 1, 2 ) )
  970.                 {
  971.                     askreq( "Fehler (%ld) beim PGP-Aufruf:\n%s", "Abbruch!", rc, line );
  972.                     rc = 1;
  973.                     break;
  974.                 }
  975.                 DeleteFile( "T:mdpgp.txt" );
  976.                 pgp_addb64hlfile( hlist, "PGP-SIG", "T:mdpgp.sig" );
  977.                 DeleteFile( "T:mdpgp.sig" );
  978.                 hl = hl_findheader( hlist, "PGP-SIG" );
  979.                 fprintf( puffer, "PGP-SIG: %s\r\n", hl->data );
  980.  
  981.                 if( bin )
  982.                     fprintf( puffer, "TYP: BIN\r\n" );
  983.  
  984.                 /* Verschicken */
  985.                 if( bin )
  986.                     d = msg_getsize( msg, MC_DATA );
  987.                 else
  988.                     d = readconvtxt( msg );
  989.                 fprintf( puffer, "ROT:\r\nLEN: %ld\r\n\r\n", d + e );
  990.                 if( e )
  991.                     copyconvcomment( msg, puffer );
  992.                 if( d )
  993.                 {
  994.                     if( bin )
  995.                         msg_copyfp( msg, puffer, MC_DATA );
  996.                     else
  997.                         copyconvtxt( msg, puffer );
  998.                 }
  999.  
  1000.             }
  1001.             else    /* Crypt... */
  1002.             {
  1003.                 e = getnoconvcommentsize( msg );
  1004.                 if( e )
  1005.                 {
  1006.                     fprintf( puffer, "CRYPT-CONTENT-KOM: %ld\r\n", e );
  1007.                 }
  1008.                 if( !bin )
  1009.                 {
  1010.                     msg_copy( msg, "T:mdpgp.txt", MC_COMMENT | MC_DATA );
  1011.                     /*convpgpmsg();
  1012.                     DeleteFile( "T:mdpgp.iso" );*/
  1013.                 }
  1014.                 else    /* BinΣr, erst Kommentar wandeln */
  1015.                 {
  1016.                     BPTR pgpf;
  1017.  
  1018.                     fprintf( puffer, "CRYPT-CONTENT-TYP: BIN\r\n" );
  1019.  
  1020.                     if( e )
  1021.                     {
  1022.                         msg_copy( msg, "T:mdpgp.txt", MC_COMMENT );
  1023.                         /*convpgpmsg();
  1024.                         DeleteFile( "T:mdpgp.iso" );*/
  1025.                     }
  1026.  
  1027.                     pgpf = Open( "T:mdpgp.txt", MODE_READWRITE );
  1028.                     if( !pgpf )
  1029.                     {
  1030.                         rc = 1;
  1031.                         break;
  1032.                     }
  1033.                     Seek( pgpf, 0, OFFSET_END );
  1034.                     msg_copyfh( msg, pgpf, MC_DATA );
  1035.                     Close( pgpf );
  1036.                 }
  1037.  
  1038.                 /* Gut, in T:mdpgp.txt steht jetzt die komplette Nachricht */
  1039.  
  1040.                 if( pgpsign )
  1041.                 {
  1042.                     sprintf( line, "-fes -u \"%s\" >T:mdpgp.pgp <T:mdpgp.txt",
  1043.                         prefs.pgp_userid
  1044.                     );
  1045.                 }
  1046.                 else
  1047.                 {
  1048.                     sprintf( line, "-fe -u \"%s\" >T:mdpgp.pgp <T:mdpgp.txt",
  1049.                         prefs.pgp_userid
  1050.                     );
  1051.                 }
  1052.  
  1053.  
  1054.                 hl = hl_findheader( hlist, "EMP" );
  1055.                 while( hl )
  1056.                 {
  1057.                     struct user u;
  1058.  
  1059.                     if( !getuser( hl->data, &u ) )
  1060.                         asprintf( line, " \"%s\"", getuserpgpid( &u ) );
  1061.  
  1062.                     hl = hl_findnextheader( hl );
  1063.                 }
  1064.  
  1065.                 if( rc = runpgp( line, pgpsign ? 1 : 0, 8 + ( bin ? 0 : 16 ) ) )
  1066.                 {
  1067.                     askreq( "Fehler (%ld) beim PGP-Aufruf:\n%s", "Huch!", rc, line );
  1068.                     rc = 1;
  1069.                     break;
  1070.                 }
  1071.                 DeleteFile( "T:mdpgp.txt" );
  1072.  
  1073.                 /* Verschicken */
  1074.  
  1075.                 d = getcrlflen( "T:mdpgp.pgp" );
  1076.                 if( d < 0 )
  1077.                 {
  1078.                     askreq( "Fehler nach PGP-Aufruf\nT:mdpgp.pgp existiert nicht.", "Huch!" );
  1079.                     rc = 1;
  1080.                     break;
  1081.                 }
  1082.  
  1083.                 fprintf( puffer, "ROT:\r\nLEN: %ld\r\n\r\n", d );
  1084.  
  1085.                 copyfile2fp( "T:mdpgp.pgp", puffer );
  1086.                 DeleteFile( "T:mdpgp.pgp" );
  1087.             }
  1088.  
  1089.         }
  1090.         else if( bin )
  1091.         {
  1092.             e = getconvcommentsize( msg );
  1093.             if( e )
  1094.                 fprintf( puffer, "KOM: %ld\r\n", e );
  1095.             fprintf(puffer,"TYP: BIN\r\nROT:\r\nLEN: %ld\r\n\r\n", msg_getsize( msg, MC_DATA ) + e );
  1096.             copyconvcomment( msg, puffer );
  1097.             msg_copyfp( msg, puffer, MC_DATA );
  1098.         }
  1099.         else
  1100.         {
  1101.             e = getconvcommentsize( msg );
  1102.             if( e )
  1103.                 fprintf( puffer, "KOM: %ld\r\n", e );
  1104.             d = readconvtxt( msg );
  1105.             fprintf( puffer, "ROT:\r\nLEN: %ld\r\n\r\n", d + e );
  1106.  
  1107.             copyconvcomment( msg, puffer );
  1108.  
  1109.             copyconvtxt( msg, puffer );
  1110.         }
  1111.  
  1112.         msg_close( msg );
  1113.     }
  1114.  
  1115.     freeuserlist( FALSE );
  1116.     freebrettix( mix );
  1117.  
  1118.     if( ( prefs.key_violation == 78 ) && ftell( puffer ) )
  1119.     {
  1120.         sprintf(line,"ABS: %s@%s%s (%s)\r\n",prefs.username,prefs.boxname,prefs.boxdomain,prefs.userrealname);
  1121.         siso2ibm(line);
  1122.         fputs(line,puffer);
  1123.         makedateheader( line, time(0) );
  1124.         fprintf(puffer,"ROT:\r\nEDA: %s\r\nEMP: MicroDOT-Bugs@vapor.com\r\nBET: ** BUGMELDUNG\r\nMID: K%s\r\nLEN: %ld\r\n\r\n",line,makemid(),0);
  1125.         prefs.key_violation = 0;
  1126.     }
  1127.  
  1128.     fclose(puffer);
  1129.  
  1130.     ogreExitWindow( ogw );
  1131.     flushbrettix();
  1132.  
  1133.     DeleteFile( "T:mdpgp.iso" );
  1134.     DeleteFile( "T:mdpgp.txt" );
  1135.     DeleteFile( "T:mdpgp.pgp" );
  1136.     DeleteFile( "T:mdpgp.sig" );
  1137.  
  1138.     return( rc );
  1139. }
  1140.  
  1141. static void uux( char *datafile, char *cmd )
  1142. {
  1143.     char remotedataname[ 64 ];
  1144.     char localxname[á64 ], remotexname[á64 ], localcname[á64 ];
  1145.     BPTR f;
  1146.     ULONG seqnum = (prefs.counter++) & 0xffff;
  1147.  
  1148.     pushdir( prefs.transferdir );
  1149.  
  1150. retry:
  1151.     /* X-File erzeugen */
  1152.     sprintf( localxname, "D.%.7sX%04lX", prefs.boxname, seqnum );
  1153.     sprintf( remotexname, "X.%.7sX%04lX", prefs.pointname, seqnum );
  1154.     sprintf( remotedataname, "D.%.7sB%04lX", prefs.pointname, seqnum );
  1155.  
  1156.     if( exists( localxname ) )
  1157.     {
  1158.         seqnum++;
  1159.         goto retry;
  1160.     }
  1161.  
  1162.     f = Open( localxname, MODE_NEWFILE );
  1163.     FPrintf( f,    "U %s %s\nF %s\nI %s\nC %s\n", prefs.username, prefs.pointname, remotedataname, remotedataname, cmd );
  1164.     Close( f );
  1165.  
  1166.     /* C-File erzeugen */
  1167.     sprintf( localcname, "C.%.7sN%04lX", prefs.boxname, seqnum );
  1168.     f = Open( localcname, MODE_NEWFILE );
  1169.     FPrintf( f,
  1170.         "S %s %s root - %s 0666\n"
  1171.         "S %s %s root - %s 0666\n",
  1172.  
  1173.         FilePart( datafile ), remotedataname, FilePart( datafile ),
  1174.         localxname, remotexname, localxname
  1175.     );
  1176.     Close( f );
  1177.  
  1178.     popdir();
  1179. }
  1180.  
  1181.  
  1182. #define SPECIAL(x) ((char*)(x))
  1183.  
  1184. static char *news_convtab[]á= {á
  1185.     "LEN",            NULL,                SPECIAL(6),
  1186.     "BET",            "Subject",        0,
  1187.     "ABS",             "From",            0,    
  1188.     "WAB",             "Sender",            0,    
  1189.     "MID",             "Message-ID",        SPECIAL(5),
  1190.     "EDA",            "Date",            SPECIAL(1),
  1191.     "EMP",            "Newsgroups",        SPECIAL(2),
  1192.     "ERSETZT",        "Supersedes",        0,
  1193.     "BEZ",            "References",        SPECIAL(3),
  1194.     "ROT",            "Path",            0,
  1195.     "ORG",            "Organization",    0,
  1196.     "ANTWORT-AN",    "Reply-To",        0,
  1197.     "DISKUSSION-IN","Followup-To",    SPECIAL(4),
  1198.     "STICHWORT",    "Keywords",        0,
  1199.     "MAILER",        "X-Newsreader",    0,
  1200.     "ZUSAMMENFASSUNG", "Summary",        0,
  1201.     "OAB",            "Resent-From",    0,
  1202.     "KOP",             NULL,                SPECIAL(6),    
  1203.     "CHARSET",        NULL,                SPECIAL(7),
  1204.     "ZNETZ-TEXT",    NULL,                SPECIAL(6),
  1205.     "ZNETZ-ABS",    NULL,                SPECIAL(6),
  1206.     NULL
  1207. };
  1208.  
  1209. static char *mail_convtab[]á= {á
  1210.     "LEN",            NULL,                SPECIAL(6),
  1211.     "BET",            "Subject",        0,
  1212.     "ABS",             "From",            0,    
  1213.     "KOP",             "CC",                0,    
  1214.     "WAB",             "Sender",            0,    
  1215.     "EMP",            "To",                SPECIAL(11),
  1216.     "MID",             "Message-ID",        SPECIAL(5),
  1217.     "EDA",            "Date",            SPECIAL(1),
  1218.     "BEZ",            "In-Reply-To",    SPECIAL(3),
  1219.     "ERSETZT",        "Supersedes",        0,
  1220.     //"ROT",            "Path",            0,
  1221.     "ROT",            NULL,                SPECIAL(6),
  1222.     "ORG",            "Organization",    0,
  1223.     "ANTWORT-AN",    "Reply-To",        0,
  1224.     "DISKUSSION-IN","Reply-To",        0,
  1225.     "STICHWORT",    "Keywords",        0,
  1226.     "MAILER",        "X-Mailer",        0,
  1227.     "OEM",            "Resent-To",        0,
  1228.     "OAB",            "Resent-From",    0,
  1229.     "ZUSAMMENFASSUNG", "Comments",    0,
  1230.     "CHARSET",        NULL,                SPECIAL(7),
  1231.     "EB",            "Return-Receipt-To", SPECIAL(8),
  1232.     "ZNETZ-TEXT",    NULL,                SPECIAL(6),
  1233.     "ZNETZ-ABS",    NULL,                SPECIAL(6),
  1234.     NULL
  1235. };
  1236.  
  1237. /* Date-Info */
  1238. struct ZCDateInfo
  1239. {
  1240.     time_t    t;        /* GMT */
  1241.     UBYTE     zoneid;    /* immer 0 */
  1242.     UBYTE   flags;
  1243.     SHORT    offset;    /* relativ zur GMT in Minuten */
  1244. };
  1245.  
  1246. #define ZCDIF_DST 1    /* Daylightsavingtime (Sommerzeit) */
  1247.  
  1248. static int CLU_ZCDatestringToDI( char *ds, struct ZCDateInfo *di )
  1249. {
  1250.     char x[ 6 ], tmp[ 6 ];
  1251.     int c;
  1252.  
  1253.     if( !ds || !di )
  1254.         return( FALSE );
  1255.  
  1256.     memset( di, 0, sizeof( *di ) );
  1257.  
  1258.     tmp[ 2 ] = 0;
  1259.     for( c = 1; c < 6; c++ )
  1260.     {
  1261.         tmp[ 0 ] = ds[ c*2 + 2 ];
  1262.         tmp[ 1 ] = ds[ c*2 + 3 ];
  1263.         x[ c ] = atoi( tmp );
  1264.     }
  1265.     tmp[ 0 ] = ds[ 0 ];
  1266.     tmp[ 1 ] = ds[ 1 ];
  1267.     tmp[ 2 ] = ds[ 2 ];
  1268.     tmp[ 3 ] = ds[ 3 ];
  1269.     tmp[ 4 ] = 0;
  1270.     x[ 0 ] = atoi( tmp ) - 1970;
  1271.     di->t = utpack( &x[0]á);
  1272.  
  1273.     switch( ds[ 14 ]á)
  1274.     {
  1275.         case 's':
  1276.         case 'S':
  1277.             di->flags |= ZCDIF_DST;
  1278.             break;
  1279.  
  1280.         case 'w':
  1281.         case 'W':
  1282.             break;
  1283.  
  1284.         default:
  1285.             return( 0 );
  1286.             
  1287.     }
  1288.  
  1289.     di->offset = atoi( &ds[ 15 ] ) * 60;
  1290.     di->t += di->offset * 60;
  1291.  
  1292.     return( TRUE );
  1293. }
  1294.  
  1295. static STRPTR zc2rfcdate( STRPTR datestring, STRPTR zcdate )
  1296. {
  1297.     struct tm *ut;
  1298.     static char *mo[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  1299.                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  1300.     static char *wd[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  1301.     struct ZCDateInfo di;
  1302.  
  1303.     CLU_ZCDatestringToDI( zcdate, &di );
  1304.  
  1305.     ut = localtime( &di.t );
  1306.  
  1307.     sprintf( datestring, "%s, %ld %s %04ld %02ld:%02ld:%02ld CET",
  1308.         wd[ ut->tm_wday ],
  1309.         ut->tm_mday, mo[ ut->tm_mon ], ut->tm_year + 1900,
  1310.         ut->tm_hour, ut->tm_min, ut->tm_sec
  1311.     );
  1312.  
  1313.     return( datestring );
  1314. }
  1315.  
  1316. static UBYTE *sbit;
  1317. ALLOCSTATIC( sbit, 8192, 0 )
  1318.  
  1319. static UBYTE *string27bit( UBYTE *string )
  1320. {
  1321.     //static UBYTE sbit[á8192 ];
  1322.     UBYTE *p = sbit;
  1323.  
  1324.     while( *string )
  1325.     {
  1326.         if( *string > 127 )
  1327.         {
  1328.             switch( *string )
  1329.             {
  1330.                 case 132: *p++ = 'a'; *p++ = 'e'; string++; break;
  1331.                 case 129: *p++ = 'u'; *p++ = 'e'; string++; break;
  1332.                 case 148: *p++ = 'o'; *p++ = 'e'; string++; break;
  1333.                 case 154: *p++ = 'U'; *p++ = 'e'; string++; break;
  1334.                 case 142: *p++ = 'A'; *p++ = 'e'; string++; break;
  1335.                 case 153: *p++ = 'O'; *p++ = 'e'; string++; break;
  1336.                 case 225: *p++ = 's'; *p++ = 's'; string++; break;
  1337.                 default: string++; break;
  1338.             }
  1339.         }
  1340.         else
  1341.             *p++ = *string++;
  1342.     }
  1343.     *p = 0;
  1344.     return( sbit );
  1345. }
  1346.  
  1347. static STRPTR ngname( STRPTR buffer, STRPTR boardname )
  1348. {
  1349.     char *p = buffer;
  1350.  
  1351.     strcpy( buffer, &boardname[á1 ] );
  1352.     strlwr( buffer );
  1353.  
  1354.     return( buffer );
  1355. }
  1356.  
  1357. static struct hlist *converthh( struct hlist *header, int ispm )
  1358. {
  1359.     struct hlist *new = hl_initheader();
  1360.     struct header *hl;
  1361.     char **tab = ispm ? mail_convtab : news_convtab;
  1362.     struct hlist *emplist = hl_initheader(), *bezlist = hl_initheader(), *followlist = hl_initheader(), *tolist = hl_initheader();
  1363.     int size;
  1364.  
  1365.     for( hl = hl_findheader( header, NULL); hl; hl = hl_nextheader( hl ) )
  1366.     {
  1367.         char *h =  hl->head;
  1368.         char *d = string27bit( hl->data );
  1369.         char **ttab = tab;
  1370.         int skip = FALSE;
  1371.  
  1372.         while( *ttab && !skip )
  1373.         {
  1374.             if( !stricmp( *ttab, h ) )
  1375.             {
  1376.                 switch( (int)ttab[ 2 ]á)
  1377.                 {
  1378.                     case 0:
  1379.                         hl_addheader( new, (ttab[á1 ]), d );
  1380.                         break;
  1381.  
  1382.                     case 1:    // Dateconvert
  1383.                         hl_addheader( new, (ttab[á1 ]), zc2rfcdate( buffer, d ) );
  1384.                         break;
  1385.  
  1386.                     case 2: // EMPList
  1387.                         hl_addheader( emplist, "X", ngname( buffer, d ) );
  1388.                         break;
  1389.  
  1390.                     case 3: // BEZList
  1391.                         hl_addheader( bezlist, "X", d );
  1392.                         break;
  1393.                         
  1394.                     case 4: // Followup-To POSTER
  1395.                         if( d[á0 ]á== '/'á)
  1396.                         {
  1397.                             hl_addheader( followlist, "X", ngname( buffer, d ) );
  1398.                         }
  1399.                         else
  1400.                             hl_addheader( new, (ttab[á1 ]), "poster" );
  1401.                         break;
  1402.  
  1403.                     case 5: // MSGID
  1404.                         sprintf( buffer, "<%s>", d );
  1405.                         hl_addheader( new, (ttab[á1 ]), buffer );
  1406.                         break;
  1407.  
  1408.                     case 6: // Discard Header
  1409.                         break;
  1410.  
  1411.                     case 8: // EB
  1412.                         sprintf( buffer, "%s@%s%s", prefs.username, prefs.pointname, prefs.boxdomain );
  1413.                         hl_addheader( new, (ttab[á1 ]), buffer );
  1414.                         break;
  1415.  
  1416.                     case 11: // ToList
  1417.                         hl_addheader( tolist, "X", d );
  1418.                         break;
  1419.  
  1420.                 }
  1421.                 skip = TRUE;
  1422.                 break;
  1423.             }
  1424.             ttab += 3;
  1425.         }
  1426.  
  1427.         /* Nicht gefunden; entweder U-Header oder als X-Z- */
  1428.         if( !skip )
  1429.         {
  1430.             if( !strnicmp( h, "U-", 2 ) )
  1431.                 hl_addheader( new, &h[ 2 ], d );
  1432.         }
  1433.     }
  1434.  
  1435.     /* Newsgroups konvertieren */
  1436.     for( size = 0, hl = hl_findheader( emplist, NULL ); hl; hl = hl_nextheader( hl ) )
  1437.         size += strlen( hl->data ) + 1;
  1438.     if( size )
  1439.     {
  1440.         char *bp, *bp2;
  1441.  
  1442.         do
  1443.         {
  1444.             bp = AllocVec( size + 1, 0 );
  1445.         } while( !bp );
  1446.  
  1447.         bp2 = bp;
  1448.  
  1449.         for( hl = hl_findheader( emplist, NULL ); hl; hl = hl_nextheader( hl ) )
  1450.         {
  1451.             strcpy( bp2, hl->data );
  1452.             strcpy( bp2 = strchr( bp2, 0 ), "," );
  1453.             bp2 += 1;
  1454.         }
  1455.         bp2[á-1 ]á= 0;
  1456.  
  1457.         hl_addheader( new, "Newsgroups", bp );
  1458.         FreeVec( bp );
  1459.     }
  1460.  
  1461.     // Followup-To
  1462.     for( size = 0, hl = hl_findheader( followlist, NULL ); hl; hl = hl_nextheader( hl ) )
  1463.         size += strlen( hl->data ) + 1;
  1464.     if( size )
  1465.     {
  1466.         char *bp, *bp2;
  1467.  
  1468.         do
  1469.         {
  1470.             bp = AllocVec( size + 1, 0 );
  1471.         } while( !bp );
  1472.  
  1473.         bp2 = bp;
  1474.  
  1475.         for( hl = hl_findheader( followlist, NULL ); hl; hl = hl_nextheader( hl ) )
  1476.         {
  1477.             strcpy( bp2, hl->data );
  1478.             strcpy( bp2 = strchr( bp2, 0 ), "," );
  1479.             bp2 += 1;
  1480.         }
  1481.         bp2[á-1 ]á= 0;
  1482.  
  1483.         hl_addheader( new, "Followup-To", bp );
  1484.         FreeVec( bp );
  1485.     }
  1486.  
  1487.     /* To konvertieren */
  1488.     for( size = 0, hl = hl_findheader( tolist, NULL ); hl; hl = hl_nextheader( hl ) )
  1489.         size += strlen( hl->data ) + 3;
  1490.     if( size )
  1491.     {
  1492.         char *bp, *bp2;
  1493.  
  1494.         do
  1495.         {
  1496.             bp = AllocVec( size + 1, 0 );
  1497.         } while( !bp );
  1498.  
  1499.         bp2 = bp;
  1500.  
  1501.         for( hl = hl_findheader( tolist, NULL ); hl; hl = hl_nextheader( hl ) )
  1502.         {
  1503.             strcpy( bp2, hl->data );
  1504.             strcpy( bp2 = strchr( bp2, 0 ), ", " );
  1505.             bp2 += 2;
  1506.         }
  1507.         bp2[á-2 ]á= 0;
  1508.  
  1509.         hl_addheader( new, "To", bp );
  1510.         FreeVec( bp );
  1511.     }
  1512.  
  1513.     /* References-Zeilen konvertieren */
  1514.     for( size = 0, hl = hl_findheader( bezlist, NULL ); hl; hl = hl_nextheader( hl ) )
  1515.         size += strlen( hl->data ) + 3;
  1516.     if( size )
  1517.     {
  1518.         char *bp, *bp2;
  1519.  
  1520.         do
  1521.         {
  1522.             bp = AllocVec( size + 1, 0 );
  1523.         } while( !bp );
  1524.  
  1525.         bp2 = bp;
  1526.  
  1527.         for( hl = hl_findheader( bezlist, NULL ); hl; hl = hl_nextheader( hl ) )
  1528.         {
  1529.             *bp2++ = '<';
  1530.             strcpy( bp2, hl->data );
  1531.             strcpy( bp2 = strchr( bp2, 0 ), "> " );
  1532.             bp2 += 2;
  1533.         }
  1534.         bp2[á-1 ]á= 0;
  1535.  
  1536.         hl_addheader( new, ispm ? "In-Reply-To" : "References", bp );
  1537.         FreeVec( bp );
  1538.     }
  1539.  
  1540.     hl_freeheader( emplist );
  1541.     hl_freeheader( bezlist );
  1542.     hl_freeheader( followlist );
  1543.     hl_freeheader( tolist );
  1544.  
  1545.     return( new );
  1546. }
  1547.  
  1548. static void uuencode( char *filename )
  1549. {
  1550.     FILE *to = fopen( "T:msg.tmp", "a" ), *f2 = fopen( "T:msg.uue", "r" );
  1551.     int blocksize;
  1552.  
  1553.     fprintf( to, "begin 644 %s\n", filename );
  1554.     
  1555.     for(;;)
  1556.     {
  1557.         UBYTE *memblock = buffer;
  1558.  
  1559.         blocksize = fread( buffer, 1, 1800, f2 );
  1560.         if( blocksize < 1 )
  1561.             break;
  1562.         while( blocksize )
  1563.         {
  1564.             int bytes = min( 45, blocksize );
  1565.             int c;
  1566.  
  1567.             blocksize -= bytes;
  1568.  
  1569.             fputc( 32 + bytes, to );
  1570.  
  1571.             for( c = 0; c < bytes; c += 3 )
  1572.             {
  1573.                 int b1 = memblock[ c ], b2 = memblock[ác + 1 ], b3 = memblock[ác + 2 ];
  1574.                 int ch1, ch2, ch3, ch4;
  1575.  
  1576.                 ch1 = ' 'á+ ( b1 >> 2 );
  1577.                 ch2 = ' ' + ( ( b1 & 0x3 ) << 4 ) + ( b2 >> 4 );
  1578.                 ch3 = ' ' + ( ( b2 & 0xf ) << 2 ) + ( ( b3 >> 6 ) );
  1579.                 ch4 = ' ' + ( b3 & 0x3f );
  1580.  
  1581.                 fputc( ch1, to );
  1582.                 fputc( ch2, to );
  1583.  
  1584.                 if( bytes - c > 2 )
  1585.                 {
  1586.                     fputc( ch3, to );
  1587.                     fputc( ch4, to );
  1588.                 }
  1589.             }
  1590.  
  1591.             memblock += bytes;
  1592.  
  1593.             fprintf( to, "X\n" );
  1594.         }
  1595.     }
  1596.     fprintf( to, " X\nend\n" );
  1597.     fclose( f2 );
  1598.     fclose( to );
  1599.     DeleteFile( "T:msg.uue" );
  1600. }
  1601.  
  1602. static void make7bit( void )
  1603. {
  1604.     FILE *f1 = fopen( "T:msg.tmp", "w" ), *f2 = fopen( "T:msg.8bit", "r" );
  1605.     int rc, c;
  1606.  
  1607.     for(;;)
  1608.     {
  1609.         rc = fread( buffer, 1, 2048, f2 );
  1610.         if( rc < 1 )
  1611.             break;
  1612.         for( c = 0; c < rc; c++ )
  1613.         {
  1614.             switch( buffer[ác ]á)
  1615.             {
  1616.                 case 228: fputc( 'a', f1 ); fputc( 'e', f1 ); break;
  1617.                 case 252: fputc( 'u', f1 ); fputc( 'e', f1 ); break;
  1618.                 case 246: fputc( 'o', f1 ); fputc( 'e', f1 ); break;
  1619.                 case 220: fputc( 'U', f1 ); fputc( 'e', f1 ); break;
  1620.                 case 196: fputc( 'A', f1 ); fputc( 'e', f1 ); break;
  1621.                 case 214: fputc( 'O', f1 ); fputc( 'e', f1 ); break;
  1622.                 case 223: fputc( 's', f1 ); fputc( 's', f1 ); break;
  1623.                 default: fputc( buffer[ác ], f1 ); break;
  1624.             }
  1625.         }
  1626.     }
  1627.     fclose( f1 );
  1628.     fclose( f2 );
  1629.     DeleteFile( "T:msg.8bit" );
  1630. }
  1631.  
  1632. static int dospool_rfc(void)
  1633. {
  1634.     FILE *puffer = NULL, *cp;
  1635.     int c, d, bin;
  1636.     char line[1024];
  1637.     char mid[128];
  1638.     struct Window *iw;
  1639.     struct ogwin *ogw;
  1640.     struct mindex *mix;
  1641.     struct mbrett *spool = findbrett( "/╗SPOOL", 0 );
  1642.     struct header *hl;
  1643.     struct hlist *hlist, *newhlist;
  1644.     struct msghandle *msg;
  1645.     struct mmail *mm;
  1646.     int pgpsign, pgpcrypt;
  1647.     int rc = 0;
  1648.     char news_dname[á64 ], mail_dname[á64 ];
  1649.     int ispm, rnewspos;
  1650.  
  1651.     ogw = ogreInitWindow( scr, 0, NULL, "Spoole ausgehende Nachrichten..." );
  1652.     ogreAddGroup( ogw, 0, OGFRAME_NONE, NULL );
  1653.     ogreAddText( ogw, 0, "Nachricht:", SP_N, "", 46, 1 );
  1654.     ogreAddFuelGauge( ogw, 1, SP_F, 100 );
  1655.     iw = ogreOpenWindow( ogw );
  1656.     if( !iw )
  1657.         return( 0 );
  1658.  
  1659.     mix = loadbrettix( spool );
  1660.     if( !mix )
  1661.     {
  1662.         displaybeep();
  1663.         return( -2 );
  1664.     }
  1665.  
  1666.     flushbrettix();
  1667.     loaduserlist();
  1668.  
  1669.     ogreSetMaxVal( ogw, SP_F, mix->mailcount );
  1670.  
  1671.     sprintf( news_dname, "D.%-.7sD%04lx", prefs.boxname, (prefs.counter++)&0xffff );
  1672.  
  1673.     for( c = 0, mm = ( struct mmail * ) mix->maillist.lh_Head; mm->n.mln_Succ; mm = ( struct mmail * ) mm->n.mln_Succ, c++ )
  1674.     {
  1675.         if( mm->m.flags & ( MMF_DEL | MMF_ARCHIVE ) )
  1676.             continue;
  1677.  
  1678.         msg = msg_open( mm->m.pufferID, mm->m.mailID );
  1679.         if( !msg )
  1680.         {
  1681.             displaybeep();
  1682.             continue;
  1683.         }
  1684.  
  1685.         sprintf( mid, "%lD (%lD Bytes Header, %lD Inhalt, %lD Kommentar)", c+1, msg->pix.headersize, msg->pix.datasize, msg->pix.commentsize );
  1686.         ogreSetStringValue( ogw, SP_N, mid );
  1687.         ogreSetValue( ogw, SP_F, c );
  1688.  
  1689.         hlist = msg_loadheader( msg );
  1690.  
  1691.         if( hl_findheader( hlist, "ABS" ) )
  1692.         {
  1693.             msg_close( msg );
  1694.             hl_freeheader( hlist );
  1695.             continue;
  1696.         }
  1697.  
  1698. #if 0
  1699.         /* EMP: prⁿfen */
  1700. /*        if( strcmp( prefs.userrealname, "Oliver Wagner" ) && strcmp( prefs.boxname, "pluribus" ) )
  1701.         {*/
  1702.             hl = hl_findheader( hlist, "EMP" );
  1703.             d = 0;
  1704.             while( hl )
  1705.             {
  1706.                 if( !stricmp( hl->data, "/T-NETZ/SUPPORT/MICRODOT" ) )
  1707.                     d |= 1;
  1708.                 else if( !stricmp( hl->data, "/T-NETZ/SUPPORT/MICRODOT-BETA" ) || !stricmp( hl->data, "/T-NETZ/SUPPORT/MICRODOT/BETA" ) )
  1709.                 {
  1710.                     d |= 2;
  1711.                     hl_delheader( hl );
  1712.                     hl = hl_findheader( hlist, "EMP" );
  1713.                     continue;
  1714.                 }
  1715.  
  1716.                 hl = hl_findnextheader( hl );
  1717.             }
  1718.     
  1719.             if( d & 2 )
  1720.             {
  1721.                 if( ! ( d & 1 ) )
  1722.                     hl_addheader( hlist, "EMP", "/T-NETZ/SUPPORT/MICRODOT" );            
  1723.             }
  1724. //        }
  1725. #endif
  1726.  
  1727.         hl = hl_findheader( hlist, "EMP" );
  1728.         ispm = FALSE;
  1729.         while( hl )
  1730.         {
  1731.             if( hl->data[á0 ]á!= '/' )
  1732.                 ispm = TRUE;
  1733.             hl = hl_findnextheader( hl );
  1734.         }
  1735.  
  1736.         // Nun gut, falls PM, Puffer ÷ffnen
  1737.         if( ispm )
  1738.         {
  1739.             pushdir( prefs.transferdir );
  1740.             sprintf( mail_dname, "D.%-.7sD%04lx", prefs.boxname, (prefs.counter++)&0xffff );
  1741.             cp = fopen( mail_dname, "w" );
  1742.             popdir();
  1743.  
  1744.             // From schreiben
  1745.             fprintf( cp, "From %s remote from %s\n", prefs.username, prefs.pointname );
  1746.         }
  1747.         else
  1748.         {
  1749.             if( !puffer )
  1750.             {
  1751.                 pushdir( prefs.transferdir );
  1752.                 puffer = fopen( news_dname, "w" );
  1753.                 popdir();
  1754.             }
  1755.             cp = puffer;
  1756.             rnewspos = ftell( cp );
  1757.             fprintf( cp, "#! rnews 00000000\n" );
  1758.         }
  1759.  
  1760.         // From: erzeugen
  1761.  
  1762.         fprintf( cp, "From: %s@%s%s (%s)\n", prefs.username, prefs.pointname, prefs.boxdomain, prefs.userrealname );
  1763.  
  1764.         bin = hl_testheader( hlist, "TYP", NULL );
  1765.         pgpsign = hl_testheader( hlist, "SIGNED", "PGP" );
  1766.         pgpcrypt = hl_testheader( hlist, "CRYPT", "PGP" );
  1767.  
  1768.         newhlist = converthh( hlist, ispm );
  1769.         hl = hl_findheader( newhlist, NULL );
  1770.         do
  1771.         {
  1772.             fprintf( cp, "%s: %s\n", hl->head, hl->data );
  1773.         } while( ( hl = hl_nextheader( hl ) ) );
  1774.  
  1775.         fprintf( cp, "X-%s: MicroDot " MDVER " %s\n", ispm ? "Mailer" : "Newsreader",
  1776.             registerinfo.serie ? registerinfo.registriert_txt : unregistered );
  1777.  
  1778.         if( prefs.organisation[ 0 ] )
  1779.         {
  1780.             fprintf( cp, "Organization: %s\n",prefs.organisation);
  1781.         }
  1782.  
  1783.         if( !ispm )
  1784.             fprintf( cp, "Path: %s.%s!not-for-mail\n", prefs.pointname, ( prefs.boxdomain[ 0 ]á== '.'á) ? &prefs.boxdomain[á1 ]á: prefs.boxdomain );
  1785.  
  1786.         // Nun die Nachricht auslagern
  1787.  
  1788.         DeleteFile( "T:msg.tmp" );
  1789.  
  1790.         // Falls BinΣr, UUEncoden
  1791.         if( bin )
  1792.         {
  1793.             hl = hl_findheader( hlist, "FILE" );
  1794.             if( !hl )
  1795.                 hl = hl_findheader( hlist, "BET" );
  1796.  
  1797.             DeleteFile( "T:msg.uue" );
  1798.             msg_copy( msg, "T:msg.uue", MC_DATA );
  1799.             msg_copy( msg, "T:msg.tmp", MC_COMMENT );
  1800.             uuencode( hl->data );
  1801.         }
  1802.         else if( ispm || !prefs.rfc_newsfmt )
  1803.         {
  1804.             DeleteFile( "T:msg.8bit" );
  1805.             msg_copy( msg, "T:msg.8bit", MC_COMMENT | MC_DATA );
  1806.             make7bit();
  1807.         }
  1808.         else
  1809.         {
  1810.             msg_copy( msg, "T:msg.tmp", MC_COMMENT | MC_DATA );
  1811.             fprintf( cp, "Mime-Version: 1.0\nContent-Type: text/plain; charset=ISO-8859-1\nContent-Transfer-Encoding: 8bit\n" ); 
  1812.         }
  1813.  
  1814.         if( pgpsign || pgpcrypt )
  1815.         {
  1816.             DeleteFile( "T:msg.pgp" );
  1817.             /* Nur signen */
  1818.             if( !pgpcrypt )
  1819.             {
  1820.                 /* Gut, in T:mdpgp.txt steht jetzt die komplette Nachricht */
  1821.  
  1822.                 sprintf( line, "-s -u \"%s\" -o T:msg.pgp T:msg.tmp",
  1823.                     prefs.pgp_userid
  1824.                 );
  1825.  
  1826.                 if( rc = runpgp( line, 1, 2 ) )
  1827.                 {
  1828.                     askreq( "Fehler (%ld) beim PGP-Aufruf:\n%s", "Huch!", rc, line );
  1829.                     rc = 1;
  1830.                     break;
  1831.                 }
  1832.  
  1833.             }
  1834.             else    /* Crypt... */
  1835.             {
  1836.                 if( pgpsign )
  1837.                 {
  1838.                     sprintf( line, "-es -u \"%s\" -o T:msg.pgp T:msg.tmp",
  1839.                         prefs.pgp_userid
  1840.                     );
  1841.                 }
  1842.                 else
  1843.                 {
  1844.                     sprintf( line, "-e -u \"%s\" -o T:msg.pgp T:msg.tmp",
  1845.                         prefs.pgp_userid
  1846.                     );
  1847.                 }
  1848.  
  1849.  
  1850.                 hl = hl_findheader( hlist, "EMP" );
  1851.                 while( hl )
  1852.                 {
  1853.                     struct user u;
  1854.  
  1855.                     if( !getuser( hl->data, &u ) )
  1856.                         asprintf( line, " \"%s\"", getuserpgpid( &u ) );
  1857.  
  1858.                     hl = hl_findnextheader( hl );
  1859.                 }
  1860.  
  1861.                 if( rc = runpgp( line, pgpsign ? 1 : 0, 8 ) )
  1862.                 {
  1863.                     askreq( "Fehler (%ld) beim PGP-Aufruf:\n%s", "Huch!", rc, line );
  1864.                     rc = 1;
  1865.                     break;
  1866.                 }
  1867.             }
  1868.             DeleteFile( "T:msg.tmp" );
  1869.             Rename( "T:msg.pgp", "T:msg.tmp" );
  1870.         }
  1871.  
  1872.         // Nun "msg.tmp" an den Puffer anhΣngen
  1873.         fprintf( cp, "\n" );    // Leerzeile
  1874.         {
  1875.             FILE *f2 = fopen( "T:msg.tmp", "r" );
  1876.             while( f2 )
  1877.             {
  1878.                 int rc = fread( buffer, 1, 2048, f2 );
  1879.                 if( rc < 1 )
  1880.                 {
  1881.                     fclose( f2 );
  1882.                     break;
  1883.                 }
  1884.                 fwrite( buffer, rc, 1, cp ); 
  1885.             }
  1886.         }
  1887.         msg_close( msg );
  1888.  
  1889.         if( ispm )
  1890.         {
  1891.             fclose( cp );
  1892.             strcpy( buffer, "rmail" );
  1893.             hl = hl_findheader( hlist, "EMP" ); // Alte liste
  1894.             ispm = FALSE;
  1895.             while( hl )
  1896.             {
  1897.                 if( hl->data[á0 ]á!= '/' )
  1898.                 {
  1899.                     char tmp[á256 ], *p;
  1900.  
  1901.                     strcat( buffer, " " );
  1902.                     strcpy( tmp, hl->data );
  1903.                     p = stpbrk( tmp, " \t"á);
  1904.                     if( p )
  1905.                         *p = 0;
  1906.                     p = strrchr( tmp, '@' );
  1907.                     if( p )
  1908.                     {
  1909.                         *p++ = 0;
  1910.                         strcat( buffer, p );
  1911.                         strcat( buffer, "!" );
  1912.                     }
  1913.                     strcat( buffer, tmp );
  1914.                 }
  1915.                 hl = hl_findnextheader( hl );
  1916.             }
  1917.             uux( mail_dname, buffer );
  1918.         }
  1919.         else
  1920.         {
  1921.             int newpos = ftell( cp );
  1922.             fseek( cp, rnewspos + 9, 0 );
  1923.             fprintf( cp, "%08ld", newpos - rnewspos - 18 );
  1924.             fseek( cp, 0, 2 );
  1925.         }
  1926.  
  1927.         hl_freeheader( hlist );
  1928.         hl_freeheader( newhlist );
  1929.     }
  1930.  
  1931.     if( puffer )
  1932.     {
  1933.         fclose( puffer );
  1934.         uux( news_dname, "rnews" );
  1935.     }
  1936.  
  1937.     freeuserlist( FALSE );
  1938.     freebrettix( mix );
  1939.  
  1940.     ogreExitWindow( ogw );
  1941.     flushbrettix();
  1942.  
  1943.     DeleteFile( "T:msg.tmp" );
  1944.     DeleteFile( "T:msg.pgp" );
  1945.  
  1946.     delspool();
  1947.  
  1948.     return( rc );
  1949. }
  1950.  
  1951. int dospool( void )
  1952. {
  1953.     if( prefs.mode == MDM_RFC )
  1954.         return( dospool_rfc() );
  1955.     else
  1956.         return( dospool_zc() );
  1957. }
  1958.