view src/control.c @ 279:49b452b667a6 noffle

[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every hour of clock time, regardless of the time the calculated was based on. This is potentially dangerous at daylight saving changes. So instead use the cached last result only when the new request is to be based on a time in the same hour as the cached result. * src/util.c: Replace the alternate Utl_mktimeGMT() implementation used when timegm() is not available. The previous version, as suggested by the glibc timegm() man page, used setenv() and unsetenv() for changing the environment. These aren't POSIX function, and the POSIX putenv() (a) is tricky to manage if the same var is being constantly update and memory isn't to leak, and (b) provides no way to remove an environment entry. So change to an implementation Wget uses. This should compile on not glibc systems - the previous version failed to build on Solaris.
author bears
date Sun, 17 Nov 2002 15:18:19 +0000
parents ffb1848a39db
children 01755687c565
line wrap: on
line source

/*
  control.c

  $Id: control.c 342 2001-12-09 12:31:57Z bears $
*/

#if HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include "common.h"
#include "content.h"
#include "control.h"
#include "database.h"
#include "group.h"
#include "itemlist.h"
#include "log.h"
#include "outgoing.h"
#include "portable.h"

int
Ctrl_cancel( const char *msgId )
{
    ItemList *refs;
    const char *ref;
    Str server;
    Bool seen = FALSE;
    int res = CANCEL_OK;
    Bool removeFromDb = TRUE;

    /* See if in outgoing and zap if so. */
    if ( Out_find( msgId, server ) )
    {
	Out_remove( server, msgId );
	Log_inf( "'%s' cancelled from outgoing queue for '%s'.\n",
		 msgId, server );
	seen = TRUE;
    }

    if ( ! Db_contains( msgId ) )
    {
	Log_inf( "Cancel: '%s' not in database.", msgId );
	return seen ? CANCEL_OK : CANCEL_NO_SUCH_MSG;
    }

    /*
      Retrieve the Xrefs, remove from each group and then
      remove from the database.
     */
    refs = new_Itl( Db_xref( msgId ), " " );
    for( ref = Itl_first( refs ); ref != NULL; ref = Itl_next( refs ) )
    {
	Str grp;
	int no;

	if ( sscanf( ref, "%s:%d", grp, &no ) != 2 )
	    break;
	
	if ( Grp_exists( grp ) )
	{
	    Cont_read( grp );
	    Cont_delete( no );
            /*
             * If we don't manage to remove the overview, leave the message
             * in the main database to avoid confusion. Yes, the message
             * will not be cancelled properly for this group but we don't
             * signal this to the calling routine.
             */
	    if ( Cont_write() )
                Log_dbg( LOG_DBG_CONTROL,
                         "Removed '%s' from group '%s'.",
                         msgId, grp );
            else
                removeFromDb = FALSE;

	    if ( ! Grp_local( grp ) && ! seen )
		res = CANCEL_NEEDS_MSG;
	}
	else
	{
	    Log_inf( "Group '%s' in Xref for '%s' not found.", grp, msgId );
	}
    }
    del_Itl( refs );
    if ( removeFromDb )
        Db_delete( msgId );
    Log_inf( "Message '%s' cancelled.", msgId );
    return res;
}