]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/TimeData.cc
2 * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 28 Access Control */
12 #include "acl/Checklist.h"
13 #include "acl/TimeData.h"
18 ACLTimeData::ACLTimeData () : weekbits (0), start (0), stop (0), next (NULL
) {}
20 ACLTimeData::ACLTimeData(ACLTimeData
const &old
) : weekbits(old
.weekbits
), start (old
.start
), stop (old
.stop
), next (NULL
)
23 next
= (ACLTimeData
*)old
.next
->clone();
27 ACLTimeData::operator=(ACLTimeData
const &old
)
29 weekbits
= old
.weekbits
;
35 next
= (ACLTimeData
*)old
.next
->clone();
40 ACLTimeData::~ACLTimeData()
47 ACLTimeData::match(time_t when
)
49 static time_t last_when
= 0;
54 if (when
!= last_when
) {
56 memcpy(&tm
, localtime(&when
), sizeof(struct tm
));
59 t
= (time_t) (tm
.tm_hour
* 60 + tm
.tm_min
);
60 ACLTimeData
*data
= this;
63 debugs(28, 3, "aclMatchTime: checking " << t
<< " in " <<
64 data
->start
<< "-" << data
->stop
<< ", weekbits=" <<
65 std::hex
<< data
->weekbits
);
67 if (t
>= data
->start
&& t
<= data
->stop
&& (data
->weekbits
& (1 << tm
.tm_wday
)))
77 ACLTimeData::dump() const
80 const ACLTimeData
*t
= this;
84 s
.Printf("%c%c%c%c%c%c%c %02d:%02d-%02d:%02d",
85 t
->weekbits
& ACL_SUNDAY
? 'S' : '-',
86 t
->weekbits
& ACL_MONDAY
? 'M' : '-',
87 t
->weekbits
& ACL_TUESDAY
? 'T' : '-',
88 t
->weekbits
& ACL_WEDNESDAY
? 'W' : '-',
89 t
->weekbits
& ACL_THURSDAY
? 'H' : '-',
90 t
->weekbits
& ACL_FRIDAY
? 'F' : '-',
91 t
->weekbits
& ACL_SATURDAY
? 'A' : '-',
92 t
->start
/ 60, t
->start
% 60, t
->stop
/ 60, t
->stop
% 60);
104 long parsed_weekbits
= 0;
106 for (Tail
= &next
; *Tail
; Tail
= &((*Tail
)->next
));
107 ACLTimeData
*q
= NULL
;
113 while ((t
= strtokFile())) {
114 if (*t
< '0' || *t
> '9') {
115 /* assume its day-of-week spec */
121 parsed_weekbits
|= ACL_SUNDAY
;
125 parsed_weekbits
|= ACL_MONDAY
;
129 parsed_weekbits
|= ACL_TUESDAY
;
133 parsed_weekbits
|= ACL_WEDNESDAY
;
137 parsed_weekbits
|= ACL_THURSDAY
;
141 parsed_weekbits
|= ACL_FRIDAY
;
145 parsed_weekbits
|= ACL_SATURDAY
;
149 parsed_weekbits
|= ACL_WEEKDAYS
;
153 /* ignore placeholder */
157 debugs(28, DBG_CRITICAL
, "" << cfg_filename
<< " line " << config_lineno
<<
158 ": " << config_input_line
);
159 debugs(28, DBG_CRITICAL
, "aclParseTimeSpec: Bad Day '" << *t
<< "'" );
164 /* assume its time-of-day spec */
166 if ((sscanf(t
, "%d:%d-%d:%d", &h1
, &m1
, &h2
, &m2
) < 4) || (!((h1
>= 0 && h1
< 24) && ((h2
>= 0 && h2
< 24) || (h2
== 24 && m2
== 0)) && (m1
>= 0 && m1
< 60) && (m2
>= 0 && m2
< 60)))) {
167 debugs(28, DBG_CRITICAL
, "aclParseTimeSpec: Bad time range '" << t
<< "'");
176 if ((parsed_weekbits
== 0) && (start
== 0) && (stop
== 0))
181 q
->start
= h1
* 60 + m1
;
183 q
->stop
= h2
* 60 + m2
;
185 q
->weekbits
= parsed_weekbits
;
189 if (q
->start
> q
->stop
) {
190 debugs(28, DBG_CRITICAL
, "aclParseTimeSpec: Reversed time range");
199 if (q
->weekbits
== 0)
200 q
->weekbits
= ACL_ALLWEEK
;
209 if (parsed_weekbits
) {
213 q
->start
= 0 * 60 + 0;
215 q
->stop
= 24 * 60 + 0;
217 q
->weekbits
= parsed_weekbits
;
225 ACLTimeData::empty() const
231 ACLTimeData::clone() const
233 return new ACLTimeData(*this);