diff options
Diffstat (limited to 'usr/src/lib/libast/common/tm/tmxtouch.c')
-rw-r--r-- | usr/src/lib/libast/common/tm/tmxtouch.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/tm/tmxtouch.c b/usr/src/lib/libast/common/tm/tmxtouch.c new file mode 100644 index 0000000000..67d84fecd2 --- /dev/null +++ b/usr/src/lib/libast/common/tm/tmxtouch.c @@ -0,0 +1,81 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2007 AT&T Knowledge Ventures * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Knowledge Ventures * +* * +* A copy of the License is available at * +* http://www.opensource.org/licenses/cpl1.0.txt * +* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* Phong Vo <kpv@research.att.com> * +* * +***********************************************************************/ +#pragma prototyped +/* + * Glenn Fowler + * AT&T Research + * + * Time_t conversion support + */ + +#include <tmx.h> +#include <tv.h> + +/* + * touch path <atime,mtime,ctime> + * (flags&PATH_TOUCH_VERBATIM) treats times verbatim, otherwise: + * Time_t==0 current time + * Time_t==TMX_NOTIME retains path value + */ + +int +tmxtouch(const char* path, Time_t at, Time_t mt, Time_t ct, int flags) +{ + Tv_t av; + Tv_t mv; + Tv_t cv; + Tv_t* ap; + Tv_t* mp; + Tv_t* cp; + + if (at == TMX_NOTIME && !(flags & PATH_TOUCH_VERBATIM)) + ap = TV_TOUCH_RETAIN; + else if (!at && !(flags & PATH_TOUCH_VERBATIM)) + ap = 0; + else + { + av.tv_sec = tmxsec(at); + av.tv_nsec = tmxnsec(at); + ap = &av; + } + if (mt == TMX_NOTIME && !(flags & PATH_TOUCH_VERBATIM)) + mp = TV_TOUCH_RETAIN; + else if (!mt && !(flags & PATH_TOUCH_VERBATIM)) + mp = 0; + else + { + mv.tv_sec = tmxsec(mt); + mv.tv_nsec = tmxnsec(mt); + mp = &mv; + } + if (ct == TMX_NOTIME && !(flags & PATH_TOUCH_VERBATIM)) + cp = TV_TOUCH_RETAIN; + else if (!ct && !(flags & PATH_TOUCH_VERBATIM)) + cp = 0; + else + { + cv.tv_sec = tmxsec(ct); + cv.tv_nsec = tmxnsec(ct); + cp = &cv; + } + return tvtouch(path, ap, mp, cp, flags & 1); +} |