1 /*-
2 * Copyright (c) 1988, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)util.c 8.4 (Berkeley) 04/02/94";
10 #endif /* not lint */
11
12 #include <sys/types.h>
13
14 #include <ctype.h>
15 #include <pwd.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include <time.h>
20 #include <tzfile.h>
21 #include <unistd.h>
22
23 #include "chpass.h"
24 #include "pathnames.h"
25
26 static int dmsize[] =
27 { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
28 static char *months[] =
29 { "January", "February", "March", "April", "May", "June",
30 "July", "August", "September", "October", "November",
31 "December", NULL };
32
33 char *
ttoa(tval)34 ttoa(tval)
35 time_t tval;
36 {
37 struct tm *tp;
38 static char tbuf[50];
39
40 if (tval) {
41 tp = localtime(&tval);
42 (void)sprintf(tbuf, "%s %d, %d", months[tp->tm_mon],
43 tp->tm_mday, tp->tm_year + TM_YEAR_BASE);
44 }
45 else
46 *tbuf = '\0';
47 return (tbuf);
48 }
49
50 int
atot(p,store)51 atot(p, store)
52 char *p;
53 time_t *store;
54 {
55 static struct tm *lt;
56 char *t, **mp;
57 time_t tval;
58 int day, month, year;
59
60 if (!*p) {
61 *store = 0;
62 return (0);
63 }
64 if (!lt) {
65 unsetenv("TZ");
66 (void)time(&tval);
67 lt = localtime(&tval);
68 }
69 if (!(t = strtok(p, " \t")))
70 goto bad;
71 for (mp = months;; ++mp) {
72 if (!*mp)
73 goto bad;
74 if (!strncasecmp(*mp, t, 3)) {
75 month = mp - months + 1;
76 break;
77 }
78 }
79 if (!(t = strtok((char *)NULL, " \t,")) || !isdigit(*t))
80 goto bad;
81 day = atoi(t);
82 if (!(t = strtok((char *)NULL, " \t,")) || !isdigit(*t))
83 goto bad;
84 year = atoi(t);
85 if (day < 1 || day > 31 || month < 1 || month > 12 || !year)
86 goto bad;
87 if (year < 100)
88 year += TM_YEAR_BASE;
89 if (year <= EPOCH_YEAR)
90 bad: return (1);
91 tval = isleap(year) && month > 2;
92 for (--year; year >= EPOCH_YEAR; --year)
93 tval += isleap(year) ?
94 DAYSPERLYEAR : DAYSPERNYEAR;
95 while (--month)
96 tval += dmsize[month];
97 tval += day;
98 tval = tval * HOURSPERDAY * MINSPERHOUR * SECSPERMIN;
99 tval -= lt->tm_gmtoff;
100 *store = tval;
101 return (0);
102 }
103
104 char *
ok_shell(name)105 ok_shell(name)
106 char *name;
107 {
108 char *p, *sh;
109
110 setusershell();
111 while (sh = getusershell()) {
112 if (!strcmp(name, sh))
113 return (name);
114 /* allow just shell name, but use "real" path */
115 if ((p = strrchr(sh, '/')) && strcmp(name, p + 1) == 0)
116 return (sh);
117 }
118 return (NULL);
119 }
120