aboutsummaryrefslogtreecommitdiff
path: root/unix/os/zfutim.c
blob: 4c074f27e9e15e49b3987f686aa44a80e349255d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
 */

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifdef SYSV
#include <time.h>
#else
#include <sys/time.h>
#include <sys/timeb.h>
#endif
#include <utime.h>

#define	import_kernel
#define	import_knames
#define import_spp
#include <iraf.h>

#define SECONDS_1970_TO_1980    315532800L


/* ZFUTIM -- Set the file access/modification times.  Times are set in
 * in units of seconds since 00:00:00 01-Jan-80, local time, as returned
 * by ZFINFO.  A NULL time value will not modify the field.
 */
int
ZFUTIM (
  PKCHAR  *fname,
  XLONG	  *atime,
  XLONG	  *mtime,
  XINT	  *status
)
{
	struct	stat osfile;
	struct	utimbuf time;
	int	offset = 0;
	int	stat(), utime();

	extern  int ZGMTCO ();


	/* Get UNIX file info.
	 */
	if (stat ((char *)fname, &osfile) == ERR) {
	    *status = XERR;
	    return (XERR);
	}

	/* Get the timezone offset.  Correct for daylight savings time,
	 * if in effect.
	 */
	ZGMTCO (&offset);
	offset += SECONDS_1970_TO_1980;

	/* Set file access times.  If time is NULL use the current value.
	 */
	time.actime  = ((*atime == 0) ? osfile.st_atime : (*atime+offset));
	time.modtime = ((*mtime == 0) ? osfile.st_mtime : (*mtime+offset));

	if (utime ((char *)fname, &time) == ERR) {
	    *status = XERR;
	    return (XERR);
	}
	*status = XOK;

	return (*status);
}