/* Copyright (c) 1996,1997 Ruslan R. Laishev (@RRL) */ #include "nntp.h" int nntp_expire_group( WorkerContext *, GrpKey *, time_t ); /* *-------------------------------------------------------------------------------- */ int nntp_expire ( WorkerContext *Wctxp ) { GrpKey *gkeyp = &Wctxp->bufp[0]; char *bufp = &Wctxp->MsgBuff[0]; int flag = 0; time_t gt,mt,t; time(&t); gt = t - (nntp_conf.GrpDay*24*60*60); mt = t - (nntp_conf.MsgPurgeDay*24*60*60); NNTP_LOGT(Wctxp,LOGD,"Group Exrpiration = %s", cvt_vms_to_rfc(gt,bufp,nntp_conf.LocalTZ)); NNTP_LOGT(Wctxp,LOGD,"Messages Expiration = %s", cvt_vms_to_rfc(mt,bufp,nntp_conf.LocalTZ)); while ( GrpDBget_seq (&Wctxp->Grprab,gkeyp,flag++) ) { /* * If group is not empty - purge messages */ if ( gkeyp->First || gkeyp->Last ) { if ( !GrpDBget (&Wctxp->Grprab,gkeyp->GrpName,gkeyp,1) ) { NNTP_LOGT(Wctxp,LOGF,"'%.*s' info-Not Getted", GrpName$_len,gkeyp->GrpName); return -1; } if ( nntp_expire_group (Wctxp, gkeyp,mt ) ) { if ( !GrpDBput(&Wctxp->Grprab,gkeyp,gkeyp) ) NNTP_LOGT(Wctxp,LOGF,"Update GrpDB."); } } /* * if group is empty - clear suck flag */ if ( !gkeyp->SuckFlag || (gt < (max(gkeyp->DateUp,gkeyp->DateCr))) ) continue; gkeyp->SuckFlag = 0; /* * */ NNTP_LOGT(Wctxp,LOGI,"Switch group to passive %.*s", GrpName$_len,gkeyp->GrpName); /* * */ if ( !GrpDBput(&Wctxp->Grprab,gkeyp,gkeyp) ) NNTP_LOGT(Wctxp,LOGF,"Update GrpDB."); } return 0; } /* *-------------------------------------------------------------------------------- */ int nntp_expire_group( WorkerContext *Wctxp, GrpKey *gkeyp, time_t ct ) { MsgKey *mkeyp = &Wctxp->MsgBuff[0]; int n; long Purged = 0; long Skiped = 0; NNTP_LOGT(Wctxp,LOGI,"Start purging %11lu|%11lu|%c|%c|%.*s", gkeyp->First,gkeyp->Last, gkeyp->PostFlag, (gkeyp->SuckFlag?'y':' '), GrpName$_len,gkeyp->GrpName); for (n = gkeyp->First;n < gkeyp->Last;) { if ( !MsgDBget_byNum (&Wctxp->Msgrab, gkeyp->GrpName, n, mkeyp, MSGBUFFSZ) ) { NNTP_LOGT(Wctxp,LOGE,"%.*s, ARTICLE #%u-Not Found", GrpName$_len,gkeyp->GrpName,n); Skiped++; } if ( mkeyp->Date > ct ) break; if ( MsgDBdel (&Wctxp->Msgrab) ) { NNTP_LOGT(Wctxp,LOGF,"%.*s, ARTICLE #%u %.*s-Not Deleted", GrpName$_len,gkeyp->GrpName, n, MsgId$_len,mkeyp->MsgId); break; } NNTP_LOGT(Wctxp,LOGW,"%.*s, ARTICLE #%u %.*s-Deleted", GrpName$_len,gkeyp->GrpName, n, MsgId$_len,mkeyp->MsgId); Purged++; gkeyp->First = ++n; } NNTP_LOGT(Wctxp,LOGD,"End purging %11lu|%11lu|%c|%c|%.*s", gkeyp->First,gkeyp->Last, gkeyp->PostFlag, (gkeyp->SuckFlag?'y':' '), GrpName$_len,gkeyp->GrpName); return (Purged + Skiped); }