Mercurial > noffle
comparison src/fetch.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 | 125d79c9e586 |
comparison
equal
deleted
inserted
replaced
| 42:2467ff423c15 | 43:2842f50feb55 |
|---|---|
| 1 /* | |
| 2 fetch.c | |
| 3 | |
| 4 $Id: fetch.c 49 2000-05-05 21:45:56Z uh1763 $ | |
| 5 */ | |
| 6 | |
| 7 #if HAVE_CONFIG_H | |
| 8 #include <config.h> | |
| 9 #endif | |
| 10 | |
| 11 #include <stdio.h> | |
| 12 #include "fetch.h" | |
| 13 #include <errno.h> | |
| 14 #include <time.h> | |
| 15 #include <signal.h> | |
| 16 #include "client.h" | |
| 17 #include "configfile.h" | |
| 18 #include "content.h" | |
| 19 #include "dynamicstring.h" | |
| 20 #include "fetchlist.h" | |
| 21 #include "request.h" | |
| 22 #include "group.h" | |
| 23 #include "log.h" | |
| 24 #include "outgoing.h" | |
| 25 #include "protocol.h" | |
| 26 #include "pseudo.h" | |
| 27 #include "util.h" | |
| 28 | |
| 29 struct Fetch | |
| 30 { | |
| 31 Bool ready; | |
| 32 Str serv; | |
| 33 } fetch = { FALSE, "" }; | |
| 34 | |
| 35 static Bool | |
| 36 connectToServ( const char *name ) | |
| 37 { | |
| 38 Log_inf( "Fetch from '%s'", name ); | |
| 39 if ( ! Client_connect( name ) ) | |
| 40 { | |
| 41 Log_err( "Could not connect to %s", name ); | |
| 42 return FALSE; | |
| 43 } | |
| 44 return TRUE; | |
| 45 } | |
| 46 | |
| 47 void | |
| 48 Fetch_getNewGrps( void ) | |
| 49 { | |
| 50 time_t t; | |
| 51 Str file; | |
| 52 | |
| 53 ASSERT( fetch.ready ); | |
| 54 snprintf( file, MAXCHAR, "%s/groupinfo.lastupdate", Cfg_spoolDir() ); | |
| 55 if ( ! Utl_getStamp( &t, file ) ) | |
| 56 { | |
| 57 Log_err( "Cannot read %s. Please run noffle --query groups", file ); | |
| 58 return; | |
| 59 } | |
| 60 Log_inf( "Updating groupinfo" ); | |
| 61 Client_getNewgrps( &t ); | |
| 62 Utl_stamp( file ); | |
| 63 } | |
| 64 | |
| 65 void | |
| 66 Fetch_getNewArts( const char *name, FetchMode mode ) | |
| 67 { | |
| 68 int next, first, last, oldLast; | |
| 69 | |
| 70 if ( ! Client_changeToGrp( name ) ) | |
| 71 { | |
| 72 Log_err( "Could not change to group %s", name ); | |
| 73 return; | |
| 74 } | |
| 75 Cont_read( name ); | |
| 76 Client_rmtFirstLast( &first, &last ); | |
| 77 next = Grp_rmtNext( name ); | |
| 78 oldLast = Cont_last(); | |
| 79 if ( next == last + 1 ) | |
| 80 { | |
| 81 Log_inf( "No new articles in %s", name ); | |
| 82 Cont_write(); | |
| 83 Grp_setFirstLast( name, Cont_first(), Cont_last() ); | |
| 84 return; | |
| 85 } | |
| 86 if ( first == 0 && last == 0 ) | |
| 87 { | |
| 88 Log_inf( "No articles in %s", name ); | |
| 89 Cont_write(); | |
| 90 Grp_setFirstLast( name, Cont_first(), Cont_last() ); | |
| 91 return; | |
| 92 } | |
| 93 if ( next > last + 1 ) | |
| 94 { | |
| 95 Log_err( "Article number inconsistent (%s rmt=%lu-%lu, next=%lu)", | |
| 96 name, first, last, next ); | |
| 97 Pseudo_cntInconsistent( name, first, last, next ); | |
| 98 } | |
| 99 else if ( next < first ) | |
| 100 { | |
| 101 Log_inf( "Missing articles (%s first=%lu next=%lu)", | |
| 102 name, first, next ); | |
| 103 Pseudo_missArts( name, first, next ); | |
| 104 } | |
| 105 else | |
| 106 first = next; | |
| 107 if ( last - first > Cfg_maxFetch() ) | |
| 108 { | |
| 109 Log_ntc( "Cutting number of overviews to %lu", Cfg_maxFetch() ); | |
| 110 first = last - Cfg_maxFetch() + 1; | |
| 111 } | |
| 112 Log_inf( "Getting remote overviews %lu-%lu for group %s", | |
| 113 first, last, name ); | |
| 114 Client_getOver( first, last, mode ); | |
| 115 Cont_write(); | |
| 116 Grp_setFirstLast( name, Cont_first(), Cont_last() ); | |
| 117 } | |
| 118 | |
| 119 void | |
| 120 Fetch_updateGrps( void ) | |
| 121 { | |
| 122 FetchMode mode; | |
| 123 int i, size; | |
| 124 const char* name; | |
| 125 | |
| 126 ASSERT( fetch.ready ); | |
| 127 Fetchlist_read(); | |
| 128 size = Fetchlist_size(); | |
| 129 for ( i = 0; i < size; ++i ) | |
| 130 { | |
| 131 Fetchlist_element( &name, &mode, i ); | |
| 132 if ( strcmp( Grp_serv( name ), fetch.serv ) == 0 ) | |
| 133 Fetch_getNewArts( name, mode ); | |
| 134 } | |
| 135 } | |
| 136 | |
| 137 void | |
| 138 Fetch_getReq_( void ) | |
| 139 { | |
| 140 Str msgId; | |
| 141 DynStr *list; | |
| 142 const char *p; | |
| 143 int count = 0; | |
| 144 | |
| 145 ASSERT( fetch.ready ); | |
| 146 Log_dbg( "Retrieving articles marked for download" ); | |
| 147 list = new_DynStr( 10000 ); | |
| 148 if ( Req_first( fetch.serv, msgId ) ) | |
| 149 do | |
| 150 { | |
| 151 DynStr_appLn( list, msgId ); | |
| 152 if ( ++count % 20 == 0 ) /* Send max. 20 ARTICLE cmds at once */ | |
| 153 { | |
| 154 p = DynStr_str( list ); | |
| 155 Client_retrieveArtList( p ); | |
| 156 while ( ( p = Utl_getLn( msgId, p ) ) ) | |
| 157 Req_remove( fetch.serv, msgId ); | |
| 158 DynStr_clear( list ); | |
| 159 } | |
| 160 } | |
| 161 while ( Req_next( msgId ) ); | |
| 162 p = DynStr_str( list ); | |
| 163 Client_retrieveArtList( p ); | |
| 164 while ( ( p = Utl_getLn( msgId, p ) ) ) | |
| 165 Req_remove( fetch.serv, msgId ); | |
| 166 del_DynStr( list ); | |
| 167 } | |
| 168 | |
| 169 void | |
| 170 Fetch_postArts( void ) | |
| 171 { | |
| 172 DynStr *s; | |
| 173 Str msgId, cmd, errStr, sender; | |
| 174 int ret; | |
| 175 const char *txt; | |
| 176 FILE *f; | |
| 177 sig_t lastHandler; | |
| 178 | |
| 179 s = new_DynStr( 10000 ); | |
| 180 if ( Out_first( fetch.serv, msgId, s ) ) | |
| 181 { | |
| 182 Log_inf( "Posting articles" ); | |
| 183 do | |
| 184 { | |
| 185 txt = DynStr_str( s ); | |
| 186 Out_remove( fetch.serv, msgId ); | |
| 187 if ( ! Client_postArt( msgId, txt, errStr ) ) | |
| 188 { | |
| 189 Utl_cpyStr( sender, Cfg_mailTo() ); | |
| 190 if ( strcmp( sender, "" ) == 0 | |
| 191 && ! Prt_searchHeader( txt, "SENDER", sender ) | |
| 192 && ! Prt_searchHeader( txt, "X-NOFFLE-X-SENDER", | |
| 193 sender ) /* see server.c */ | |
| 194 && ! Prt_searchHeader( txt, "FROM", sender ) ) | |
| 195 Log_err( "Article %s has no From/Sender/X-Sender field", | |
| 196 msgId ); | |
| 197 else | |
| 198 { | |
| 199 Log_ntc( "Return article to '%s' by mail", sender ); | |
| 200 snprintf( cmd, MAXCHAR, | |
| 201 "mail -s '[ NOFFLE: Posting failed ]' '%s'", | |
| 202 sender ); | |
| 203 lastHandler = signal( SIGPIPE, SIG_IGN ); | |
| 204 f = popen( cmd, "w" ); | |
| 205 if ( f == NULL ) | |
| 206 Log_err( "Invocation of '%s' failed (%s)", cmd, | |
| 207 strerror( errno ) ); | |
| 208 else | |
| 209 { | |
| 210 fprintf( f, | |
| 211 "\t[ NOFFLE: POSTING OF ARTICLE FAILED ]\n" | |
| 212 "\n" | |
| 213 "\t[ The posting of your article failed. ]\n" | |
| 214 "\t[ Reason of failure at remote server: ]\n" | |
| 215 "\n" | |
| 216 "\t[ %s ]\n" | |
| 217 "\n" | |
| 218 "\t[ Full article text has been appended. ]\n" | |
| 219 "\n" | |
| 220 "%s" | |
| 221 ".\n", | |
| 222 errStr, txt ); | |
| 223 ret = pclose( f ); | |
| 224 if ( ret != EXIT_SUCCESS ) | |
| 225 Log_err( "'%s' exit value %d", cmd, ret ); | |
| 226 signal( SIGPIPE, lastHandler ); | |
| 227 } | |
| 228 } | |
| 229 } | |
| 230 } | |
| 231 while ( Out_next( msgId, s ) ); | |
| 232 } | |
| 233 del_DynStr( s ); | |
| 234 } | |
| 235 | |
| 236 Bool | |
| 237 Fetch_init( const char *serv ) | |
| 238 { | |
| 239 if ( ! connectToServ( serv ) ) | |
| 240 return FALSE; | |
| 241 Utl_cpyStr( fetch.serv, serv ); | |
| 242 fetch.ready = TRUE; | |
| 243 return TRUE; | |
| 244 } | |
| 245 | |
| 246 void | |
| 247 Fetch_close() | |
| 248 { | |
| 249 Client_disconnect(); | |
| 250 fetch.ready = FALSE; | |
| 251 Log_inf( "Fetch from '%s' finished", fetch.serv ); | |
| 252 } |
