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.
23 * $FreeBSD: src/lib/libutil/login_times.c,v 1.7 1999/08/28 00:05:48 peter Exp $
24 * $DragonFly: src/lib/libutil/login_times.c,v 1.3 2005/03/04 05:31:11 cpressey Exp $
27 #include <sys/types.h>
34 #include "login_cap.h"
43 { "su", 2, LTM_SUN
}, { "mo", 2, LTM_MON
}, { "tu", 2, LTM_TUE
},
44 { "we", 2, LTM_WED
}, { "th", 2, LTM_THU
}, { "fr", 2, LTM_FRI
},
45 { "sa", 2, LTM_SAT
}, { "any",3, LTM_ANY
}, { "all",3, LTM_ANY
},
46 { "wk", 2, LTM_WK
}, { "wd", 2, LTM_WD
}, { NULL
, 0, 0 }
50 parse_time(char * ptr
, u_short
* t
)
54 for (val
= 0; *ptr
&& isdigit(*ptr
); ptr
++)
55 val
= (u_short
)(val
* 10 + (*ptr
- '0'));
57 *t
= (u_short
)((val
/ 100) * 60 + (val
% 100));
64 parse_lt(const char * str
)
68 memset(&t
, 0, sizeof t
);
70 if (str
&& *str
&& strcmp(str
, "Never") != 0 && strcmp(str
, "None") != 0) {
76 /* Make local copy and force lowercase to simplify parsing */
77 p
= strncpy(buf
, str
, sizeof buf
);
78 buf
[sizeof buf
- 1] = '\0';
79 for (i
= 0; buf
[i
]; i
++)
80 buf
[i
] = (char)tolower(buf
[i
]);
85 while (dws
[i
].dw
&& strncmp(p
, dws
[i
].dw
, dws
[i
].cn
) != 0)
87 if (dws
[i
].dw
== NULL
)
89 m
.lt_dow
|= dws
[i
].fl
;
93 if (m
.lt_dow
== LTM_NONE
) /* No (valid) prefix, assume any */
97 p
= parse_time(p
, &m
.lt_start
);
101 p
= parse_time(++p
, &m
.lt_end
);
112 in_ltm(const login_time_t
* ltm
, struct tm
* tt
, time_t * ends
)
117 /* First, examine the day of the week */
118 if ((u_char
)(0x01 << tt
->tm_wday
) & ltm
->lt_dow
) {
119 /* Convert `current' time to minute of the day */
120 u_short now
= (u_short
)((tt
->tm_hour
* 60) + tt
->tm_min
);
124 if (now
>= ltm
->lt_start
&& now
< ltm
->lt_end
) {
127 /* If requested, return ending time for this period */
128 tt
->tm_hour
= (int)(ltm
->lt_end
/ 60);
129 tt
->tm_min
= (int)(ltm
->lt_end
% 60);
140 in_lt(const login_time_t
* ltm
, time_t * t
)
142 return in_ltm(ltm
, localtime(t
), t
);
146 in_ltms(const login_time_t
* ltm
, struct tm
* tm
, time_t * t
)
150 while (i
< LC_MAXTIMES
&& ltm
[i
].lt_dow
!= LTM_NONE
) {
151 if (in_ltm(ltm
+ i
, tm
, t
))
159 in_lts(const login_time_t
* ltm
, time_t * t
)
161 return in_ltms(ltm
, localtime(t
), t
);