Mercurial > noffle
comparison src/fetch.c @ 464:d9035d08fe51 noffle
[svn] * src/fetch.c: Log failed posting that we can't mail back to the sender
or where sending fails to <Noffle spool>/failed.posting.
author | bears |
---|---|
date | Wed, 23 Jul 2003 10:32:25 +0100 |
parents | 39d9c19ffba4 |
children | 614a3177b15c |
comparison
equal
deleted
inserted
replaced
463:95697d7c97a1 | 464:d9035d08fe51 |
---|---|
1 /* | 1 /* |
2 fetch.c | 2 fetch.c |
3 | 3 |
4 $Id: fetch.c 415 2003-01-10 22:40:18Z bears $ | 4 $Id: fetch.c 609 2003-07-23 09:32:25Z 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 |
294 Lock_closeDatabases(); | 294 Lock_closeDatabases(); |
295 return res; | 295 return res; |
296 } | 296 } |
297 | 297 |
298 static void | 298 static void |
299 saveArticleInFailedPostings( const char *msgId, const char *article ) | |
300 { | |
301 | |
302 Utl_writeFile( Cfg_spoolDir(), "failed.posting", msgId, article ); | |
303 } | |
304 | |
305 static void | |
299 returnArticleToSender( const char *sender, const char *reason, | 306 returnArticleToSender( const char *sender, const char *reason, |
300 const char *article ) | 307 const char *msgId, const char *article ) |
301 { | 308 { |
302 int ret; | 309 int ret; |
303 Str cmd; | 310 Str cmd; |
304 FILE *f; | 311 FILE *f; |
305 SignalHandler lastHandler; | 312 SignalHandler lastHandler; |
307 Log_err( "Return article to '%s' by mail", sender ); | 314 Log_err( "Return article to '%s' by mail", sender ); |
308 snprintf( cmd, MAXCHAR, "%s -t -oi", SENDMAILPROG); | 315 snprintf( cmd, MAXCHAR, "%s -t -oi", SENDMAILPROG); |
309 lastHandler = signal( SIGPIPE, SIG_IGN ); | 316 lastHandler = signal( SIGPIPE, SIG_IGN ); |
310 f = popen( cmd, "w" ); | 317 f = popen( cmd, "w" ); |
311 if ( f == NULL ) | 318 if ( f == NULL ) |
319 { | |
312 Log_err( "Invocation of '%s' failed (%s)", cmd, strerror( errno ) ); | 320 Log_err( "Invocation of '%s' failed (%s)", cmd, strerror( errno ) ); |
321 saveArticleInFailedPostings( msgId, article ); | |
322 } | |
313 else | 323 else |
314 { | 324 { |
315 fprintf( f, | 325 fprintf( f, |
316 "To: %s\n" | 326 "To: %s\n" |
317 "Subject: [ NOFFLE: Posting failed ]\n" | 327 "Subject: [ NOFFLE: Posting failed ]\n" |
329 ".\n", | 339 ".\n", |
330 sender, | 340 sender, |
331 reason, article ); | 341 reason, article ); |
332 ret = pclose( f ); | 342 ret = pclose( f ); |
333 if ( ret != EXIT_SUCCESS ) | 343 if ( ret != EXIT_SUCCESS ) |
344 { | |
334 Log_err( "'%s' exit value %d", cmd, ret ); | 345 Log_err( "'%s' exit value %d", cmd, ret ); |
346 saveArticleInFailedPostings( msgId, article ); | |
347 } | |
335 signal( SIGPIPE, lastHandler ); | 348 signal( SIGPIPE, lastHandler ); |
336 } | 349 } |
337 } | 350 } |
338 | 351 |
339 Bool | 352 Bool |
370 && ! Prt_searchHeader( txt, "REPLY-TO", sender ) | 383 && ! Prt_searchHeader( txt, "REPLY-TO", sender ) |
371 && ! Prt_searchHeader( txt, "SENDER", sender ) | 384 && ! Prt_searchHeader( txt, "SENDER", sender ) |
372 && ! Prt_searchHeader( txt, "X-NOFFLE-X-SENDER", | 385 && ! Prt_searchHeader( txt, "X-NOFFLE-X-SENDER", |
373 sender ) /* see server.c */ | 386 sender ) /* see server.c */ |
374 && ! Prt_searchHeader( txt, "FROM", sender ) ) | 387 && ! Prt_searchHeader( txt, "FROM", sender ) ) |
388 { | |
375 Log_err( "Article %s has no From/Sender/X-Sender field", | 389 Log_err( "Article %s has no From/Sender/X-Sender field", |
376 msgId ); | 390 msgId ); |
391 saveArticleInFailedPostings( msgId, txt ); | |
392 } | |
377 else | 393 else |
378 returnArticleToSender( sender, errStr, txt ); | 394 returnArticleToSender( sender, errStr, msgId, txt ); |
379 } | 395 } |
380 } | 396 } |
381 while ( Out_next( msgId, s ) ); | 397 while ( Out_next( msgId, s ) ); |
382 } | 398 } |
383 del_DynStr( s ); | 399 del_DynStr( s ); |