1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2011 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Eclipse Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.eclipse.org/org/documents/epl-v10.html *
11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 #pragma prototyped
23 /*
24 * Glenn Fowler
25 * AT&T Research
26 *
27 * Time_t conversion support
28 */
29
30 #include <tmx.h>
31 #include <tv.h>
32
33 /*
34 * touch path <atime,mtime,ctime>
35 * (flags&PATH_TOUCH_VERBATIM) treats times verbatim, otherwise:
36 * Time_t==0 current time
37 * Time_t==TMX_NOTIME retains path value
38 */
39
40 int
tmxtouch(const char * path,Time_t at,Time_t mt,Time_t ct,int flags)41 tmxtouch(const char* path, Time_t at, Time_t mt, Time_t ct, int flags)
42 {
43 Tv_t av;
44 Tv_t mv;
45 Tv_t cv;
46 Tv_t* ap;
47 Tv_t* mp;
48 Tv_t* cp;
49
50 if (at == TMX_NOTIME && !(flags & PATH_TOUCH_VERBATIM))
51 ap = TV_TOUCH_RETAIN;
52 else if (!at && !(flags & PATH_TOUCH_VERBATIM))
53 ap = 0;
54 else
55 {
56 av.tv_sec = tmxsec(at);
57 av.tv_nsec = tmxnsec(at);
58 ap = &av;
59 }
60 if (mt == TMX_NOTIME && !(flags & PATH_TOUCH_VERBATIM))
61 mp = TV_TOUCH_RETAIN;
62 else if (!mt && !(flags & PATH_TOUCH_VERBATIM))
63 mp = 0;
64 else
65 {
66 mv.tv_sec = tmxsec(mt);
67 mv.tv_nsec = tmxnsec(mt);
68 mp = &mv;
69 }
70 if (ct == TMX_NOTIME && !(flags & PATH_TOUCH_VERBATIM))
71 cp = TV_TOUCH_RETAIN;
72 else if (!ct && !(flags & PATH_TOUCH_VERBATIM))
73 cp = 0;
74 else
75 {
76 cv.tv_sec = tmxsec(ct);
77 cv.tv_nsec = tmxnsec(ct);
78 cp = &cv;
79 }
80 return tvtouch(path, ap, mp, cp, flags & 1);
81 }
82