comparison src/client.c @ 185:fed1334d766b noffle

[svn] * src/client.c: Change variable only used on constant to 'const'. * src/filter.c: Add a couple of 'return's after ASSERT() to remove compiler warnings about functions needing returns. * NEWS,TODO,configure,configure.in,noffle.conf.example,docs/NOTES, docs/noffle.conf.5,src/client.c,src/configfile.c,src/content.c, src/control.c,src/database.c,src/fetch.c,src/fetchlist.c,src/filter.c, src/group.c,src/lock.c,src/log.c,src/log.h,src/noffle.c,src/outgoing.c, src/post.c,src/protocol.c,src/request.c,src/server.c,src/util.c: Debug logging is always compiled and selected via noffle.conf. All debug logs are classified as all, none, config, control, expire, fetch, filter, newsbase, noffle, post, protocol, requests and server.
author bears
date Sun, 05 Aug 2001 09:24:22 +0100
parents c912e8288164
children 166008a80f03
comparison
equal deleted inserted replaced
184:9854ea5f295f 185:fed1334d766b
1 /* 1 /*
2 client.c 2 client.c
3 3
4 $Id: client.c 292 2001-05-15 12:07:53Z bears $ 4 $Id: client.c 300 2001-08-05 08:24:22Z bears $
5 */ 5 */
6 6
7 #if HAVE_CONFIG_H 7 #if HAVE_CONFIG_H
8 #include <config.h> 8 #include <config.h>
9 #endif 9 #endif
107 static void 107 static void
108 putTxtBuf( const char *buf ) 108 putTxtBuf( const char *buf )
109 { 109 {
110 Prt_putTxtBuf( buf, client.out ); 110 Prt_putTxtBuf( buf, client.out );
111 fflush( client.out ); 111 fflush( client.out );
112 Log_dbg( "[S FLUSH]" ); 112 Log_dbg( LOG_DBG_PROTOCOL, "[S FLUSH]" );
113 } 113 }
114 114
115 static void 115 static void
116 putEndOfTxt( void ) 116 putEndOfTxt( void )
117 { 117 {
118 Prt_putEndOfTxt( client.out ); 118 Prt_putEndOfTxt( client.out );
119 fflush( client.out ); 119 fflush( client.out );
120 Log_dbg( "[S FLUSH]" ); 120 Log_dbg( LOG_DBG_PROTOCOL, "[S FLUSH]" );
121 } 121 }
122 122
123 static Bool 123 static Bool
124 putCmdLn( const char *line ) 124 putCmdLn( const char *line )
125 { 125 {
126 Bool err; 126 Bool err;
127 unsigned int n; 127 unsigned int n;
128 128
129 strcpy( client.lastCmd, line ); 129 strcpy( client.lastCmd, line );
130 strcpy( client.lastStat, "[no status available]" ); 130 strcpy( client.lastStat, "[no status available]" );
131 Log_dbg( "[S] %s", line ); 131 Log_dbg( LOG_DBG_PROTOCOL, "[S] %s", line );
132 n = fprintf( client.out, "%s\r\n", line ); 132 n = fprintf( client.out, "%s\r\n", line );
133 err = ( n != strlen( line ) + 2 ); 133 err = ( n != strlen( line ) + 2 );
134 if ( err ) 134 if ( err )
135 logBreakDown();; 135 logBreakDown();;
136 return ! err; 136 return ! err;
146 vsnprintf( line, MAXCHAR, fmt, ap ); 146 vsnprintf( line, MAXCHAR, fmt, ap );
147 va_end( ap ); 147 va_end( ap );
148 if ( ! putCmdLn( line ) ) 148 if ( ! putCmdLn( line ) )
149 return FALSE; 149 return FALSE;
150 fflush( client.out ); 150 fflush( client.out );
151 Log_dbg( "[S FLUSH]" ); 151 Log_dbg( LOG_DBG_PROTOCOL, "[S FLUSH]" );
152 return TRUE; 152 return TRUE;
153 } 153 }
154 154
155 static Bool 155 static Bool
156 putCmdNoFlush( const char *fmt, ... ) 156 putCmdNoFlush( const char *fmt, ... )
484 Grp_setRmtNext( grp, first ); 484 Grp_setRmtNext( grp, first );
485 Grp_setPostAllow( grp, postAllow ); 485 Grp_setPostAllow( grp, postAllow );
486 groupupdate = TRUE; 486 groupupdate = TRUE;
487 } 487 }
488 else 488 else
489 Log_dbg( "Group %s is already fetched from %s", 489 Log_dbg( LOG_DBG_FETCH,
490 "Group %s is already fetched from %s",
490 grp, Grp_server( grp ) ); 491 grp, Grp_server( grp ) );
491 } 492 }
492 } 493 }
493 494
494 snprintf( file, MAXCHAR, "%s/lastupdate.%s", 495 snprintf( file, MAXCHAR, "%s/lastupdate.%s",
645 if ( *noServerPattern && ! isGetGroup( name ) ) 646 if ( *noServerPattern && ! isGetGroup( name ) )
646 continue; 647 continue;
647 strcpy( dsc, Utl_restOfLn( line, 1 ) ); 648 strcpy( dsc, Utl_restOfLn( line, 1 ) );
648 if ( Grp_exists( name ) ) 649 if ( Grp_exists( name ) )
649 { 650 {
650 Log_dbg( "Description of %s: %s", name, dsc ); 651 Log_dbg( LOG_DBG_FETCH, "Description of %s: %s", name, dsc );
651 Grp_setDsc( name, dsc ); 652 Grp_setDsc( name, dsc );
652 } 653 }
653 } 654 }
654 Lock_closeDatabases(); 655 Lock_closeDatabases();
655 del_DynStr( response ); 656 del_DynStr( response );
802 { 803 {
803 Log_err( "Corrupt Xref at position '%s'", pXref ); 804 Log_err( "Corrupt Xref at position '%s'", pXref );
804 return NULL; 805 return NULL;
805 } 806 }
806 Utl_cpyStrN( grp, s, pColon - s ); 807 Utl_cpyStrN( grp, s, pColon - s );
807 Log_dbg( "client.c: nextXref: grp '%s' numb %lu", grp, numb ); 808 Log_dbg( LOG_DBG_FETCH,
809 "client.c: nextXref: grp '%s' numb %lu",
810 grp, numb );
808 return src; 811 return src;
809 } 812 }
810 813
811 static Bool 814 static Bool
812 needsMark( const char *ref ) 815 needsMark( const char *ref )
813 { 816 {
814 Bool interesting, result; 817 Bool interesting, result;
815 const char *msgId; 818 const char *msgId;
816 int status; 819 int status;
817 time_t lastAccess, nowTime; 820 time_t lastAccess, nowTime;
818 double threadFollowTime, secPerDay, maxTime, timeSinceLastAccess; 821 double threadFollowTime, maxTime, timeSinceLastAccess;
819 ItemList *itl; 822 ItemList *itl;
823 const double secPerDay = 24.0 * 3600.0;
820 824
821 ASSERT( Lock_gotLock() ); 825 ASSERT( Lock_gotLock() );
822 Log_dbg( "Checking references '%s' for thread mode", ref ); 826 Log_dbg( LOG_DBG_FETCH, "Checking references '%s' for thread mode", ref );
823 result = FALSE; 827 result = FALSE;
824 itl = new_Itl( ref, " \t" ); 828 itl = new_Itl( ref, " \t" );
825 nowTime = time( NULL ); 829 nowTime = time( NULL );
826 threadFollowTime = (double)Cfg_threadFollowTime(); 830 threadFollowTime = (double)Cfg_threadFollowTime();
827 secPerDay = 24.0 * 3600.0;
828 maxTime = threadFollowTime * secPerDay; 831 maxTime = threadFollowTime * secPerDay;
829 Log_dbg( "Max time = %.0f", maxTime ); 832 Log_dbg( LOG_DBG_FETCH, "Max time = %.0f", maxTime );
830 for ( msgId = Itl_first( itl ); msgId != NULL; msgId = Itl_next( itl ) ) 833 for ( msgId = Itl_first( itl ); msgId != NULL; msgId = Itl_next( itl ) )
831 { 834 {
832 /* 835 /*
833 References does not have to contain only Message IDs, 836 References does not have to contain only Message IDs,
834 but often it does, so we look up every item in the database. 837 but often it does, so we look up every item in the database.
837 { 840 {
838 status = Db_status( msgId ); 841 status = Db_status( msgId );
839 lastAccess = Db_lastAccess( msgId ); 842 lastAccess = Db_lastAccess( msgId );
840 interesting = ( status & DB_INTERESTING ); 843 interesting = ( status & DB_INTERESTING );
841 timeSinceLastAccess = difftime( nowTime, lastAccess ); 844 timeSinceLastAccess = difftime( nowTime, lastAccess );
842 Log_dbg( "Msg ID '%s': since last access = %.0f, interesting = %s", 845 Log_dbg( LOG_DBG_FETCH,
846 "Msg ID '%s': since last access = %.0f, interesting = %s",
843 msgId, timeSinceLastAccess, ( interesting ? "y" : "n" ) ); 847 msgId, timeSinceLastAccess, ( interesting ? "y" : "n" ) );
844 if ( interesting && timeSinceLastAccess <= maxTime ) 848 if ( interesting && timeSinceLastAccess <= maxTime )
845 { 849 {
846 result = TRUE; 850 result = TRUE;
847 break; 851 break;
848 } 852 }
849 } 853 }
850 else 854 else
851 { 855 {
852 Log_dbg( "MsgID '%s': not in database.", msgId ); 856 Log_dbg( LOG_DBG_FETCH, "MsgID '%s': not in database.", msgId );
853 } 857 }
854 } 858 }
855 del_Itl( itl ); 859 del_Itl( itl );
856 Log_dbg( "Article %s marking for download.", 860 Log_dbg( LOG_DBG_FETCH,
861 "Article %s marking for download.",
857 ( result ? "needs" : "doesn't need" ) ); 862 ( result ? "needs" : "doesn't need" ) );
858 return result; 863 return result;
859 } 864 }
860 865
861 static void 866 static void
866 int n; 871 int n;
867 872
868 ASSERT( Lock_gotLock() ); 873 ASSERT( Lock_gotLock() );
869 msgId = Ov_msgId( ov ); 874 msgId = Ov_msgId( ov );
870 if ( Pseudo_isGeneralInfo( msgId ) ) 875 if ( Pseudo_isGeneralInfo( msgId ) )
871 Log_dbg( "Skipping general info '%s'", msgId ); 876 Log_dbg( LOG_DBG_FETCH, "Skipping general info '%s'", msgId );
872 else if ( Db_contains( msgId ) ) 877 else if ( Db_contains( msgId ) )
873 { 878 {
874 xref = Db_xref( msgId ); 879 xref = Db_xref( msgId );
875 Log_dbg( "Entry '%s' already in db with Xref '%s'", msgId, xref ); 880 Log_dbg( LOG_DBG_FETCH,
881 "Entry '%s' already in db with Xref '%s'",
882 msgId, xref );
876 p = nextXref( xref, g, &n ); 883 p = nextXref( xref, g, &n );
877 if ( p == NULL ) 884 if ( p == NULL )
878 Log_err( "Overview with no group in Xref '%s'", msgId ); 885 Log_err( "Overview with no group in Xref '%s'", msgId );
879 else 886 else
880 { 887 {
881 /* TODO: This code block seems unnessesary. Can we remove it? */ 888 /* TODO: This code block seems unnessesary. Can we remove it? */
882 if ( Cfg_servIsPreferential( client.serv, Grp_server( g ) ) ) 889 if ( Cfg_servIsPreferential( client.serv, Grp_server( g ) ) )
883 { 890 {
884 Log_dbg( "Changing first server for '%s' from '%s' to '%s'", 891 Log_dbg( LOG_DBG_FETCH,
892 "Changing first server for '%s' from '%s' to '%s'",
885 msgId, Grp_server( g ), client.serv ); 893 msgId, Grp_server( g ), client.serv );
886 snprintf( t, MAXCHAR, "%s:%d %s", 894 snprintf( t, MAXCHAR, "%s:%d %s",
887 client.grp, Ov_numb( ov ), xref ); 895 client.grp, Ov_numb( ov ), xref );
888 Db_setXref( msgId, t ); 896 Db_setXref( msgId, t );
889 } 897 }
890 else 898 else
891 { 899 {
892 Log_dbg( "Adding '%s' to Xref of '%s'", g, msgId ); 900 Log_dbg( LOG_DBG_FETCH,
901 "Adding '%s' to Xref of '%s'", g, msgId );
893 snprintf( t, MAXCHAR, "%s %s:%d", 902 snprintf( t, MAXCHAR, "%s %s:%d",
894 xref, client.grp, Ov_numb( ov ) ); 903 xref, client.grp, Ov_numb( ov ) );
895 Db_setXref( msgId, t ); 904 Db_setXref( msgId, t );
896 } 905 }
897 } 906 }
898 } 907 }
899 else 908 else
900 { 909 {
901 Log_dbg( "Preparing '%s' in database", msgId ); 910 Log_dbg( LOG_DBG_FETCH, "Preparing '%s' in database", msgId );
902 Db_prepareEntry( ov, client.grp, Ov_numb( ov ) ); 911 Db_prepareEntry( ov, client.grp, Ov_numb( ov ) );
903 } 912 }
904 } 913 }
905 914
906 Bool 915 Bool
927 { 936 {
928 Log_err( "XHDR command failed: %s", client.lastStat ); 937 Log_err( "XHDR command failed: %s", client.lastStat );
929 return FALSE; 938 return FALSE;
930 } 939 }
931 940
932 Log_dbg( "Requesting Newsgroups headers for remote %lu-%lu", 941 Log_dbg( LOG_DBG_FETCH,
942 "Requesting Newsgroups headers for remote %lu-%lu",
933 rmtFirst, rmtLast ); 943 rmtFirst, rmtLast );
934 944
935 newsgroups = collectTxt(); 945 newsgroups = collectTxt();
936 if ( newsgroups == NULL ) 946 if ( newsgroups == NULL )
937 return FALSE; 947 return FALSE;
954 { 964 {
955 del_DynStr( newsgroups ); 965 del_DynStr( newsgroups );
956 Log_err( "XOVER command failed: %s", client.lastStat ); 966 Log_err( "XOVER command failed: %s", client.lastStat );
957 return FALSE; 967 return FALSE;
958 } 968 }
959 Log_dbg( "Requesting overview for remote %lu-%lu", rmtFirst, rmtLast ); 969 Log_dbg( LOG_DBG_FETCH,
970 "Requesting overview for remote %lu-%lu",
971 rmtFirst, rmtLast );
960 972
961 response = collectTxt(); 973 response = collectTxt();
962 if ( response == NULL ) 974 if ( response == NULL )
963 { 975 {
964 del_DynStr( newsgroups ); 976 del_DynStr( newsgroups );
1145 else 1157 else
1146 DynStr_appLn( s, msgId ); 1158 DynStr_appLn( s, msgId );
1147 1159
1148 Lock_closeDatabases(); 1160 Lock_closeDatabases();
1149 fflush( client.out ); 1161 fflush( client.out );
1150 Log_dbg( "[S FLUSH]" ); 1162 Log_dbg( LOG_DBG_PROTOCOL, "[S FLUSH]" );
1151 1163
1152 p = DynStr_str( s ); 1164 p = DynStr_str( s );
1153 res = TRUE; 1165 res = TRUE;
1154 while ( res && ( p = Utl_getLn( msgId, p ) ) ) 1166 while ( res && ( p = Utl_getLn( msgId, p ) ) )
1155 { 1167 {