xref: /titanic_41/usr/src/lib/libast/common/tm/tmxtouch.c (revision 7c500f1b365962a44422512b5c00083faa05a79e)
1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2009 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                  Common Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *            http://www.opensource.org/licenses/cpl1.0.txt             *
11 *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
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
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