diff src/pseudo.c @ 43:2842f50feb55 noffle

[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h, control.c, control.h, database.c, database.h, dynamicstring.c, dynamicstring.h, fetch.c, fetch.h, fetchlist.c, fetchlist.h, group.c, group.h, itemlist.c, itemlist.h, lock.c, lock.h, log.c, log.h, noffle.c, online.c, online.h, outgoing.c, outgoing.h, over.c, over.h, post.c, post.h, protocol.c, protocol.h, pseudo.c, pseudo.h, request.c, request.h, server.c, server.h, util.c, util.h, wildmat.c, wildmat.h: Moved files to the subdirectory src/ * Makefile.am, acconfig.h, configure.in, docs/Makefile.am, src/Makefile.am, Makefile.in, aclocal.m4, config.h.in, configure, install-sh, missing, mkinstalldirs, stamp-h.in, docs/Makefile.in, src/Makefile.in: Added files. They are used by aclocal, autoheader, autoconf and automake. * src/config.c, src/config.h: Renamed to configfile.c and configfile.h, because configure will generate a config.h file itself. * src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c, src/group.c, src/lock.c, src/noffle.c, src/online.c, src/outgoing.c, src/over.c, src/pseudo.c, src/request.c, src/server.c, src/util.c: Changed '#include "config.h"' to '#include "configfile.h"'. * src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c, src/group.c, src/lock.c, src/online.c, src/outgoing.c, src/post.c, src/protocol.c, src/request.c, src/server.c: Files now #include <config.h>. Added missing <stdio.h>. This removes the warnings about snprintf() not being declared. * Makefile: Removed. This is now generated by configure.
author uh1763
date Fri, 05 May 2000 22:45:56 +0100
parents
children 32ba1198c6fa
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pseudo.c	Fri May 05 22:45:56 2000 +0100
@@ -0,0 +1,335 @@
+/*
+  pseudo.c
+  
+  $Id: pseudo.c 49 2000-05-05 21:45:56Z uh1763 $
+*/
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "pseudo.h"
+
+#include <stdio.h>
+#include <time.h>
+#include "common.h"
+#include "configfile.h"
+#include "content.h"
+#include "database.h"
+#include "group.h"
+#include "log.h"
+#include "protocol.h"
+#include "util.h"
+
+Over *
+genOv( const char *rawSubj, const char *rawBody, const char *suffix )
+{
+    size_t bytes, lines;
+    time_t t;
+    Str subj, date, msgId;
+
+    snprintf( subj, MAXCHAR, "[ %s ]", rawSubj );
+    time( &t );
+    Utl_rfc822Date( t, date );
+    Prt_genMsgId( msgId, "", suffix );
+    bytes = lines = 0;
+    while ( *rawBody )
+    {
+        ++bytes;
+        if ( *rawBody == '\n' )
+            ++lines;
+        ++rawBody;
+    }
+    return new_Over( subj, "news (\"[ NOFFLE ]\")" , date, msgId, "",
+                     bytes, lines );
+}
+
+void
+Pseudo_appGeneralInfo()
+{
+    Cont_app( genOv( "General info", Pseudo_generalInfoBody(),
+                     "NOFFLE-GENERAL-INFO" ) );
+}
+
+Bool
+Pseudo_isGeneralInfo( const char *msgId )
+{
+    return ( strstr( msgId, "NOFFLE-GENERAL-INFO" ) != NULL );
+}
+
+const char *
+Pseudo_generalInfoHead()
+{
+    static Str s;
+
+    Over *ov;
+
+    ov = genOv( "General info", Pseudo_generalInfoBody(),
+                "NOFFLE-GENERAL-INFO" );
+    if ( ov )
+    {
+        snprintf( s, MAXCHAR,
+                  "Message-ID: %s\n"
+                  "Subject: %s\n"
+                  "From: %s\n"
+                  "Date: %s\n"
+                  "Bytes: %u\n"
+                  "Lines: %u\n",
+                  Ov_msgId( ov ),
+                  Ov_subj( ov ),
+                  Ov_from( ov ),
+                  Ov_date( ov ),
+                  Ov_bytes( ov ),
+                  Ov_lines( ov ) );
+        del_Over( ov );
+        return s;
+    }
+    return NULL;
+}
+
+const char *
+Pseudo_generalInfoBody( void )
+{
+    if ( Cfg_autoSubscribe() )
+        return
+            "\n"
+            "\t[ NOFFLE INFO: General information ]\n"
+            "\n"
+            "\t[ This server is running NOFFLE, which is a NNTP server ]\n"
+            "\t[ optimized for low speed dial-up Internet connections. ]\n"
+            "\n"
+            "\t[ By reading this or any other article of this group, ]\n"
+            "\t[ NOFFLE has put it on its fetch list and will retrieve ]\n"
+            "\t[ articles next time it is online. ]\n"
+            "\n"
+            "\t[ If you have more questions about NOFFLE please talk ]\n"
+            "\t[ to your newsmaster or read the manual page for ]\n"
+            "\t[ \"noffle\". ]\n";
+    else
+        return
+            "\n"
+            "\t[ NOFFLE INFO: General information ]\n"
+            "\n"
+            "\t[ This server is running NOFFLE, which is a NNTP server ]\n"
+            "\t[ optimized for low speed dial-up Internet connections. ]\n"
+            "\n"
+            "\t[ This group is presently not on the fetch list. You can ]\n"
+            "\t[ put groups on the fetch list by running the \"noffle\" ]\n"
+            "\t[ command on the computer where this server is running. ]\n"
+            "\n"
+            "\t[ If you have more questions about NOFFLE please talk ]\n"
+            "\t[ to your newsmaster or read the manual page for ]\n"
+            "\t[ \"noffle\". ]\n";
+}
+
+const char *
+Pseudo_markedBody( void )
+{
+    return
+        "\n"
+        "\t[ NOFFLE INFO: Marked for download ]\n"
+        "\n"
+        "\t[ The body of this article has been marked for download. ]\n";
+}
+
+const char *
+Pseudo_alreadyMarkedBody( void )
+{
+    return
+        "\n"
+        "\t[ NOFFLE INFO: Already marked for download ]\n"
+        "\n"
+        "\t[ The body of this article has already been marked ]\n"
+        "\t[ for download. ]\n";
+}
+
+const char *
+Pseudo_markingFailedBody( void )
+{
+    return
+        "\n"
+        "\t[ NOFFLE ERROR: Marking for download failed ]\n"
+        "\n"
+        "\t[ Sorry, I could not mark this article for download. ]\n"
+        "\t[ Either the database is corrupted, or I was unable to ]\n"
+        "\t[ get write access to the request directory. ]\n"
+        "\t[ Please contact your newsmaster to remove this problem. ]\n";
+}
+
+void
+genPseudo( const char *rawSubj, const char* rawBody )
+{
+    Over *ov;
+    DynStr *body = 0, *artTxt = 0;
+
+    body = new_DynStr( 10000 );
+    artTxt = new_DynStr( 10000 );
+    DynStr_app( body, "\n\t[ NOFFLE INFO: " );
+    DynStr_app( body, rawSubj );
+    DynStr_app( body, " ]\n\n" );
+    DynStr_app( body, "\t[ " );
+    while( *rawBody )
+    {
+        if ( *rawBody == '\n' )
+        {
+            DynStr_app( body, " ]\n" );
+            if ( *( rawBody + 1 ) == '\n' )
+            {
+                DynStr_app( body, "\n\t[ " );
+                ++rawBody;
+            }
+            else if ( *( rawBody + 1 ) != '\0' )
+                DynStr_app( body, "\t[ " );
+        }
+        else
+            DynStr_appN( body, rawBody, 1 );
+        ++rawBody;
+    }
+    DynStr_appLn( body, "" );    
+    DynStr_appLn( artTxt,
+                  "Comments: Pseudo article generated by news server NOFFLE" );
+    DynStr_appLn( artTxt, "" );
+    DynStr_appDynStr( artTxt, body );
+    ov = genOv( rawSubj, DynStr_str( body ), "PSEUDO" );
+    if ( body && artTxt && ov )
+    {
+        Cont_app( ov );
+        if ( Db_prepareEntry( ov, Cont_grp(), Cont_last() ) )
+            Db_storeArt( Ov_msgId( ov ), DynStr_str( artTxt ) );
+        Cont_write();
+        Grp_setFirstLast( Cont_grp(), Cont_first(), Cont_last() );
+    }
+    del_DynStr( body );
+    del_DynStr( artTxt );
+}
+
+void
+Pseudo_retrievingFailed( const char *msgId, const char *reason )
+{
+    DynStr *artTxt = 0;
+
+    if ( ! Db_contains( msgId ) )
+    {
+        Log_err( "Article %s has no entry in database %s", msgId );
+        return;
+    }
+    artTxt = new_DynStr( 10000 );
+    DynStr_appLn( artTxt,
+                  "Comments: Pseudo body generated by news server NOFFLE" );
+    DynStr_appLn( artTxt, "" );
+    DynStr_app( artTxt,
+                "\n"
+                "\t[ NOFFLE ERROR: Retrieving failed ]\n"
+                "\n"
+                "\t[ This article could not be retrieved. Maybe ]\n"
+                "\t[ it has already expired at the remote server ]\n"
+                "\t[ or it has been cancelled by its sender. See ]\n"
+                "\t[ the appended status line of the remote ]\n"
+                "\t[ server for more information. ]\n"
+                "\n"
+                "\t[ This message will disappear the next time ]\n"
+                "\t[ someone tries to read this article, so that ]\n"
+                "\t[ it can be marked for download again. ]\n" );
+    DynStr_app( artTxt, "\n\t[ Remote server status: " );
+    DynStr_app( artTxt, reason );
+    DynStr_app( artTxt, " ]\n" );
+    Db_storeArt( msgId, DynStr_str( artTxt ) );
+    del_DynStr( artTxt );
+}
+
+void
+Pseudo_cntInconsistent( const char *grp, int first, int last, int next )
+{
+    DynStr *info;
+    Str s;
+
+    info = new_DynStr( 10000 );
+    if ( info )
+    {
+        DynStr_app( info,
+                    "This group's article counter is not \n"
+                    "consistent Probably the remote news server\n"
+                    "was changed or has reset its article counter\n"
+                    "for this group. As a consequence there could\n"
+                    "be some articles be duplicated in this group\n" );
+        snprintf( s, MAXCHAR, "Group: %s", grp );
+        DynStr_appLn( info, s );
+        snprintf( s, MAXCHAR, "Remote first article number: %i", first );
+        DynStr_appLn( info, s );
+        snprintf( s, MAXCHAR, "Remote last article number: %i", last );
+        DynStr_appLn( info, s );
+        snprintf( s, MAXCHAR, "Remote next article number: %i", next );
+        DynStr_appLn( info, s );
+        genPseudo( "Article counter inconsistent", DynStr_str( info ) );
+    }
+    del_DynStr( info );
+}
+
+void
+Pseudo_missArts( const char *grp, int first, int next )
+{
+    DynStr *info;
+    Str s;
+
+    info = new_DynStr( 5000 );
+    if ( info )
+    {
+        DynStr_app( info,
+                    "Some articles could not be retrieved from\n"
+                    "the remote server, because it had already\n"
+                    "deleted them.\n"
+                    "If this group is on the fetch list, then\n"
+                    "contact your newsmaster to ensure that\n"
+                    "\"noffle\" is fetching news more frequently.\n" );
+        snprintf( s, MAXCHAR, "Group: %s", grp );
+        DynStr_appLn( info, s );
+        snprintf( s, MAXCHAR, "Remote next article number: %i", next );
+        DynStr_appLn( info, s );
+        snprintf( s, MAXCHAR, "Remote first article number: %i", first );
+        DynStr_appLn( info, s );
+        genPseudo( "Missing articles", DynStr_str( info ) );
+        del_DynStr( info );
+    }
+}
+
+void
+Pseudo_autoUnsubscribed( const char *grp, int days )
+{
+    DynStr *info;
+    Str s;
+
+    info = new_DynStr( 10000 );
+    if ( info )
+    {
+        DynStr_app( info,
+                    "NOFFLE has automatically unsubscribed this\n"
+                    "group since it has not been accessed for\n"
+                    "some time.\n"
+                    "Re-subscribing is done either automatically\n"
+                    "by NOFFLE (if configured) or by manually\n"
+                    "running the 'noffle --subscribe' command\n" );
+        snprintf( s, MAXCHAR, "Group: %s", grp );
+        DynStr_appLn( info, s );
+        snprintf( s, MAXCHAR, "Days without access: %i", days );
+        DynStr_appLn( info, s );
+        genPseudo( "Auto unsubscribed", DynStr_str( info ) );
+    }
+    del_DynStr( info );
+}
+
+void
+Pseudo_autoSubscribed()
+{
+    DynStr *info;
+
+    info = new_DynStr( 10000 );
+    if ( info )
+    {
+        DynStr_app( info,
+                    "NOFFLE has now automatically subscribed to\n"
+                    "this group. It will fetch articles next time\n"
+                    "it is online.\n" );
+        genPseudo( "Auto subscribed", DynStr_str( info ) );
+    }
+    del_DynStr( info );
+}