static inline tmrec_t* parse_time_def(char *time_str) { tmrec_p time_rec; char *p,*s; p = time_str; time_rec = 0; /* time_rec = (tmrec_t*)shm_malloc(sizeof(tmrec_t)); */ time_rec = tmrec_new(SHM_ALLOC); if (time_rec==0) { LM_ERR("no more shm mem\n"); goto error; } /* memset( time_rec, 0, sizeof(tmrec_t)); */ /* empty definition? */ if ( time_str==0 || *time_str==0 ) goto done; load_TR_value( p, s, time_rec, tr_parse_dtstart, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_duration, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_freq, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_until, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_interval, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_byday, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_bymday, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_byyday, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_byweekno, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_bymonth, parse_error, done); /* success */ done: return time_rec; parse_error: LM_ERR("parse error in <%s> around position %i\n", time_str, (int)(long)(p-time_str)); error: if (time_rec) tmrec_free( time_rec ); return 0; }
/** * * return values: 1 - match -1 - otherwise */ int check_time_rec(struct sip_msg *msg, str *time_str) { tmrec_p time_rec = 0; char *p, *s; ac_tm_t att; p = time_str->s; LM_INFO("Parsing : %.*s\n", time_str->len, time_str->s); time_rec = tmrec_new(SHM_ALLOC); if (time_rec==0) { LM_ERR("no more shm mem\n"); goto error; } load_TR_value( p, s, time_rec, tr_parse_dtstart, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_dtend, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_duration, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_freq, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_until, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_interval, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_byday, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_bymday, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_byyday, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_byweekno, parse_error, done); load_TR_value( p, s, time_rec, tr_parse_bymonth, parse_error, done); /* success */ LM_DBG("Time rec created\n"); done: /* shortcut: if there is no dstart, timerec is valid */ if (time_rec->dtstart==0) return 1; memset( &att, 0, sizeof(att)); /* set current time */ if ( ac_tm_set_time( &att, time(0) ) ) return -1; /* does the recv_time match the specified interval? */ if (check_tmrec( time_rec, &att, 0)!=0) return -1; return 1; parse_error: LM_ERR("parse error in <%s> around position %i\n", time_str->s, (int)(long)(p-time_str->s)); error: if (time_rec) tmrec_free( time_rec ); return -1; }