1:
2: /**
3: * \file time.c
4: *
5: * Time-stamp: "2011-03-06 11:52:23 bkorb"
6: *
7: * This file is part of AutoOpts, a companion to AutoGen.
8: * AutoOpts is free software.
9: * AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved
10: *
11: * AutoOpts is available under any one of two licenses. The license
12: * in use must be one of these two and the choice is under the control
13: * of the user of the license.
14: *
15: * The GNU Lesser General Public License, version 3 or later
16: * See the files "COPYING.lgplv3" and "COPYING.gplv3"
17: *
18: * The Modified Berkeley Software Distribution License
19: * See the file "COPYING.mbsd"
20: *
21: * These files have the following md5sums:
22: *
23: * 43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3
24: * 06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3
25: * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
26: */
27:
28: /*=export_func optionTimeVal
29: * private:
30: *
31: * what: process an option with a time duration.
32: * arg: + tOptions* + pOpts + program options descriptor +
33: * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
34: *
35: * doc:
36: * Decipher a time duration value.
37: =*/
38: void
39: optionTimeVal(tOptions * pOpts, tOptDesc * pOD)
40: {
41: time_t val;
42:
43: if ((pOD->fOptState & OPTST_RESET) != 0)
44: return;
45:
46: val = parse_duration(pOD->optArg.argString);
47: if (val == BAD_TIME) {
48: fprintf(stderr, zNotDuration, pOpts->pzProgName, pOD->optArg.argString);
49: if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
50: (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
51: }
52:
53: if (pOD->fOptState & OPTST_ALLOC_ARG) {
54: AGFREE(pOD->optArg.argString);
55: pOD->fOptState &= ~OPTST_ALLOC_ARG;
56: }
57:
58: pOD->optArg.argInt = val;
59: }
60:
61: /*=export_func optionTimeDate
62: * private:
63: *
64: * what: process an option with a time and date.
65: * arg: + tOptions* + pOpts + program options descriptor +
66: * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
67: *
68: * doc:
69: * Decipher a time and date value.
70: =*/
71: void
72: optionTimeDate(tOptions * pOpts, tOptDesc * pOD)
73: {
74: #if defined(HAVE_GETDATE_R) && defined(HAVE_PUTENV)
75: if ((! HAS_pzPkgDataDir(pOpts)) || (pOpts->pzPkgDataDir == NULL))
76: goto default_action;
77:
78: /*
79: * Export the DATEMSK environment variable. getdate_r() uses it to
80: * find the file with the strptime formats. If we cannot find the file
81: * we need ($PKGDATADIR/datemsk), then fall back to just a time duration.
82: */
83: {
84: static char * envptr = NULL;
85:
86: if (envptr == NULL) {
87: static char const fmt[] = "DATEMSK=%s/datemsk";
88: envptr = AGALOC(sizeof(fmt) + strlen(pOpts->pzPkgDataDir), fmt);
89: sprintf(envptr, fmt, pOpts->pzPkgDataDir);
90:
91: putenv(envptr);
92: }
93:
94: if (access(envptr+8, R_OK) != 0)
95: goto default_action;
96: }
97:
98: /*
99: * Convert the date to a time since the epoch and stash it in a long int.
100: */
101: {
102: struct tm stm;
103: time_t tm;
104:
105: if (getdate_r(pOD->optArg.argString, &stm) != 0) {
106: fprintf(stderr, zNotDate, pOpts->pzProgName,
107: pOD->optArg.argString);
108: if ((pOpts->fOptSet & OPTPROC_ERRSTOP) != 0)
109: (*(pOpts->pUsageProc))(pOpts, EXIT_FAILURE);
110: return;
111: }
112:
113: tm = mktime(&stm);
114:
115: if (pOD->fOptState & OPTST_ALLOC_ARG) {
116: AGFREE(pOD->optArg.argString);
117: pOD->fOptState &= ~OPTST_ALLOC_ARG;
118: }
119:
120: pOD->optArg.argInt = tm;
121: }
122: return;
123:
124: default_action:
125:
126: #endif
127: optionTimeVal(pOpts, pOD);
128: if (pOD->optArg.argInt != BAD_TIME)
129: pOD->optArg.argInt += (unsigned long)time(NULL);
130: }
131: /*
132: * Local Variables:
133: * mode: C
134: * c-file-style: "stroustrup"
135: * indent-tabs-mode: nil
136: * End:
137: * end of autoopts/time.c */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>