]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/TimeData.cc
74bf5ad54818bb16214d5a8c59d7347861fd816f
2 * Copyright (C) 1996-2017 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"
15 #include "ConfigParser.h"
19 ACLTimeData::ACLTimeData () : weekbits (0), start (0), stop (0), next (NULL
) {}
21 ACLTimeData::ACLTimeData(ACLTimeData
const &old
) : weekbits(old
.weekbits
), start (old
.start
), stop (old
.stop
), next (NULL
)
24 next
= (ACLTimeData
*)old
.next
->clone();
28 ACLTimeData::operator=(ACLTimeData
const &old
)
30 weekbits
= old
.weekbits
;
36 next
= (ACLTimeData
*)old
.next
->clone();
41 ACLTimeData::~ACLTimeData()
48 ACLTimeData::match(time_t when
)
50 static time_t last_when
= 0;
55 if (when
!= last_when
) {
57 memcpy(&tm
, localtime(&when
), sizeof(struct tm
));
60 t
= (time_t) (tm
.tm_hour
* 60 + tm
.tm_min
);
61 ACLTimeData
*data
= this;
64 debugs(28, 3, "aclMatchTime: checking " << t
<< " in " <<
65 data
->start
<< "-" << data
->stop
<< ", weekbits=" <<
66 std::hex
<< data
->weekbits
);
68 if (t
>= data
->start
&& t
<= data
->stop
&& (data
->weekbits
& (1 << tm
.tm_wday
)))
78 ACLTimeData::dump() const
81 const ACLTimeData
*t
= this;
85 s
.Printf("%c%c%c%c%c%c%c %02d:%02d-%02d:%02d",
86 t
->weekbits
& ACL_SUNDAY
? 'S' : '-',
87 t
->weekbits
& ACL_MONDAY
? 'M' : '-',
88 t
->weekbits
& ACL_TUESDAY
? 'T' : '-',
89 t
->weekbits
& ACL_WEDNESDAY
? 'W' : '-',
90 t
->weekbits
& ACL_THURSDAY
? 'H' : '-',
91 t
->weekbits
& ACL_FRIDAY
? 'F' : '-',
92 t
->weekbits
& ACL_SATURDAY
? 'A' : '-',
93 t
->start
/ 60, t
->start
% 60, t
->stop
/ 60, t
->stop
% 60);
105 long parsed_weekbits
= 0;
107 for (Tail
= &next
; *Tail
; Tail
= &((*Tail
)->next
));
108 ACLTimeData
*q
= NULL
;
112 while (char *t
= ConfigParser::strtokFile()) {
113 if (*t
< '0' || *t
> '9') {
114 /* assume its day-of-week spec */
120 parsed_weekbits
|= ACL_SUNDAY
;
124 parsed_weekbits
|= ACL_MONDAY
;
128 parsed_weekbits
|= ACL_TUESDAY
;
132 parsed_weekbits
|= ACL_WEDNESDAY
;
136 parsed_weekbits
|= ACL_THURSDAY
;
140 parsed_weekbits
|= ACL_FRIDAY
;
144 parsed_weekbits
|= ACL_SATURDAY
;
148 parsed_weekbits
|= ACL_WEEKDAYS
;
152 /* ignore placeholder */
156 debugs(28, DBG_CRITICAL
, "" << cfg_filename
<< " line " << config_lineno
<<
157 ": " << config_input_line
);
158 debugs(28, DBG_CRITICAL
, "aclParseTimeSpec: Bad Day '" << *t
<< "'" );
163 /* assume its time-of-day spec */
165 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)))) {
166 debugs(28, DBG_CRITICAL
, "aclParseTimeSpec: Bad time range '" << t
<< "'");
175 if ((parsed_weekbits
== 0) && (start
== 0) && (stop
== 0))
180 q
->start
= h1
* 60 + m1
;
182 q
->stop
= h2
* 60 + m2
;
184 q
->weekbits
= parsed_weekbits
;
188 if (q
->start
> q
->stop
) {
189 debugs(28, DBG_CRITICAL
, "aclParseTimeSpec: Reversed time range");
198 if (q
->weekbits
== 0)
199 q
->weekbits
= ACL_ALLWEEK
;
208 if (parsed_weekbits
) {
212 q
->start
= 0 * 60 + 0;
214 q
->stop
= 24 * 60 + 0;
216 q
->weekbits
= parsed_weekbits
;
224 ACLTimeData::empty() const
230 ACLTimeData::clone() const
232 return new ACLTimeData(*this);