/* Copyright (c) 1996, 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.MsgOld*24*60*60); while ( GrpDBget_seq (&Wctxp->Grprab,gkeyp,flag++) ) { NNTP_LOGT(Wctxp,LOGD,"%11lu|%11lu|%c|%c|%.*s", gkeyp->First,gkeyp->Last, gkeyp->PostFlag, (gkeyp->SuckFlag?'y':' '), GrpName$_len,gkeyp->GrpName); NNTP_LOGT(Wctxp,LOGD,"DateCr = %s", cvt_vms_to_rfc(gkeyp->DateCr,bufp,nntp_conf.LocalTZ)); NNTP_LOGT(Wctxp,LOGD,"DateUp = %s", cvt_vms_to_rfc(gkeyp->DateUp,bufp,nntp_conf.LocalTZ)); /* * 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 ) ) continue; } /* * if group is empty - clear suck flag */ if ( gkeyp->SuckFlag && (gt < (max(gkeyp->DateUp,gkeyp->DateCr))) ) continue; gkeyp->SuckFlag = 0; /* * */ NNTP_LOGT(Wctxp,LOGD,"%11lu|%11lu|%c|%c|%.*s", gkeyp->First,gkeyp->Last, gkeyp->PostFlag, (gkeyp->SuckFlag?'y':' '), GrpName$_len,gkeyp->GrpName); NNTP_LOGT(Wctxp,LOGD,"DateCr = %s", cvt_vms_to_rfc(gkeyp->DateCr,bufp,nntp_conf.LocalTZ)); NNTP_LOGT(Wctxp,LOGD,"DateUp = %s", cvt_vms_to_rfc(gkeyp->DateUp,bufp,nntp_conf.LocalTZ)); /* * */ 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 = gkeyp->First; while ( MsgDBget_byNum (&Wctxp->Msgrab, gkeyp->GrpName, n, mkeyp, sizeof(MsgKey)) ) { if ( mkeyp->Date > ct ) break; if ( MsgDBdel (&Wctxp->Msgrab) ) { NNTP_LOGT(Wctxp,LOGF,"%.*s, ARTICLE #%d %.*s-Not Deleted", GrpName$_len,gkeyp->GrpName, n, MsgId$_len,mkeyp->MsgId); break; } NNTP_LOGT(Wctxp,LOGF,"%.*s, ARTICLE #%d %.*s-Deleted", GrpName$_len,gkeyp->GrpName, n, MsgId$_len,mkeyp->MsgId); n++; gkeyp->First = n; } return 0; }