2 * Copyright (c) 1996 by
3 * David Nugent <davidn@blaze.net.au>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, is permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice immediately at the beginning of the file, without modification,
11 * this list of conditions, and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. This work was done expressly for inclusion into FreeBSD. Other use
16 * is permitted provided this notation is included.
17 * 4. Absolutely no warranty of function or purpose is made by the authors.
18 * 5. Modifications may be freely made to this file providing the above
21 * Login period parsing and comparison functions.
24 #include <sys/cdefs.h>
25 __FBSDID("$FreeBSD$");
27 #include <sys/types.h>
29 #include <login_cap.h>
41 { "su", 2, LTM_SUN
}, { "mo", 2, LTM_MON
}, { "tu", 2, LTM_TUE
},
42 { "we", 2, LTM_WED
}, { "th", 2, LTM_THU
}, { "fr", 2, LTM_FRI
},
43 { "sa", 2, LTM_SAT
}, { "any",3, LTM_ANY
}, { "all",3, LTM_ANY
},
44 { "wk", 2, LTM_WK
}, { "wd", 2, LTM_WD
}, { NULL
, 0, 0 }
48 parse_time(char * ptr
, u_short
* t
)
52 for (val
= 0; *ptr
&& isdigit(*ptr
); ptr
++)
53 val
= (u_short
)(val
* 10 + (*ptr
- '0'));
55 *t
= (u_short
)((val
/ 100) * 60 + (val
% 100));
62 parse_lt(const char * str
)
66 memset(&t
, 0, sizeof t
);
68 if (str
&& *str
&& strcmp(str
, "Never") != 0 && strcmp(str
, "None") != 0) {
74 /* Make local copy and force lowercase to simplify parsing */
75 p
= strncpy(buf
, str
, sizeof buf
);
76 buf
[sizeof buf
- 1] = '\0';
77 for (i
= 0; buf
[i
]; i
++)
78 buf
[i
] = (char)tolower(buf
[i
]);
83 while (dws
[i
].dw
&& strncmp(p
, dws
[i
].dw
, dws
[i
].cn
) != 0)
85 if (dws
[i
].dw
== NULL
)
87 m
.lt_dow
|= dws
[i
].fl
;
91 if (m
.lt_dow
== LTM_NONE
) /* No (valid) prefix, assume any */
95 p
= parse_time(p
, &m
.lt_start
);
99 p
= parse_time(++p
, &m
.lt_end
);
110 in_ltm(const login_time_t
* ltm
, struct tm
* tt
, time_t * ends
)
115 /* First, examine the day of the week */
116 if ((u_char
)(0x01 << tt
->tm_wday
) & ltm
->lt_dow
) {
117 /* Convert `current' time to minute of the day */
118 u_short now
= (u_short
)((tt
->tm_hour
* 60) + tt
->tm_min
);
122 if (now
>= ltm
->lt_start
&& now
< ltm
->lt_end
) {
125 /* If requested, return ending time for this period */
126 tt
->tm_hour
= (int)(ltm
->lt_end
/ 60);
127 tt
->tm_min
= (int)(ltm
->lt_end
% 60);
138 in_lt(const login_time_t
* ltm
, time_t * t
)
140 return in_ltm(ltm
, localtime(t
), t
);
144 in_ltms(const login_time_t
* ltm
, struct tm
* tm
, time_t * t
)
148 while (i
< LC_MAXTIMES
&& ltm
[i
].lt_dow
!= LTM_NONE
) {
149 if (in_ltm(ltm
+ i
, tm
, t
))
157 in_lts(const login_time_t
* ltm
, time_t * t
)
159 return in_ltms(ltm
, localtime(t
), t
);