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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <finfo.h>
include <error.h>
include <time.h>
# TOUCH -- Change file access and modification times, creating an empty
# file if necessary. File times may come from the current system time,
# a user-specified string, or a reference file.
procedure t_touch()
pointer list
char fname[SZ_FNAME], time[SZ_FNAME]
char ref_file[SZ_PATHNAME]
char at_str[SZ_TIME], mt_str[SZ_TIME]
bool create, atime, mtime, verbose
long ref[LEN_FINFO]
long t_atime, t_mtime, ltime
long clktime()
int clpopni(), clgfil()
int finfo(), dtm_ltime()
bool clgetb()
errchk touch
begin
# Initialize.
call aclrc (time, SZ_FNAME)
call aclrc (ref_file, SZ_PATHNAME)
# Process the parameters.
list = clpopni ("files")
create = clgetb ("create")
atime = clgetb ("atime")
mtime = clgetb ("mtime")
verbose = clgetb ("verbose")
call clgstr ("time", time, SZ_FNAME)
# Check for error conditions.
if (!atime && !mtime) {
call eprintf (
"ERROR: Must specify at least one of 'atime' or 'mtime'.\n")
call clpcls (list)
return
}
# Get the time to be set.
if (time[1] == EOS) {
# No 'time' param, look for a reference file to use.
call clgstr ("ref_file", ref_file, SZ_PATHNAME)
if (ref_file[1] == EOS) {
# No 'ref_file' param, use the current system time.
t_atime = clktime (long(0))
t_mtime = t_atime
if (verbose) {
call cnvtime (t_atime, at_str, SZ_TIME)
call printf ("Modifying to system time: %s\n\n")
call pargstr (at_str)
}
} else {
# Open the reference file and use those times.
if (finfo (ref_file, ref) == ERR) {
call eprintf ("Error opening reference file: '%s'\n")
call pargstr (ref_file)
return
}
t_atime = FI_ATIME(ref)
t_mtime = FI_MTIME(ref)
if (verbose) {
call cnvtime (t_atime, at_str, SZ_TIME)
call cnvtime (t_mtime, mt_str, SZ_TIME)
call printf ("Modifying to reference time: ")
call printf ("%s (atime)\n%30t%s (mtime)\n\n")
call pargstr (at_str)
call pargstr (mt_str)
}
}
} else {
# Parse the time parameter to get the modification time.
if (dtm_ltime (time, ltime) == ERR) {
if (ltime < 0)
call eprintf ("Invalid time string: '%s'\n")
else
call eprintf ("Error parsing time string: '%s'\n")
call pargstr (time)
return
}
t_atime = ltime
t_mtime = ltime
if (verbose) {
call cnvtime (t_atime, at_str, SZ_TIME)
call printf ("Modifying to user-specified time: %s\n\n")
call pargstr (at_str)
}
}
# Now apply the atime/mtime params to update only what's needed.
if (!atime) t_atime = NULL
if (!mtime) t_mtime = NULL
# Process the list of input files.
while (clgfil (list, fname, SZ_FNAME) != EOF) {
iferr (call touch (fname, create, t_atime, t_mtime, verbose))
;
}
# Clean up and close the list.
call clpcls (list)
end
# TOUCH -- Touch a file to modify the times.
procedure touch (fname, create, atime, mtime, verbose)
char fname[ARB] #i file name to touch
bool create #i create file if necessary?
long atime, mtime #i access and modify time
bool verbose #i verbose output?
char dir[SZ_PATHNAME], ip
char vfn[SZ_PATHNAME]
int fd
int access(), open(), futime()
begin
if (verbose) {
call printf ("%s: ")
call pargstr (fname)
}
# Check first it the file exists.
if (access (fname, 0, 0) == NO) {
if (create) {
call fnldir (fname, vfn, SZ_PATHNAME)
call fpathname (vfn, dir, SZ_PATHNAME)
if (access (dir, READ_WRITE, 0) == NO) {
for (ip=1; dir[ip] != '!'; ip=ip+1)
;
call eprintf ("Error: Cannot open directory '%s'\n")
call pargstr (dir[ip+1])
call erract (EA_ERROR)
return;
}
# Create a new empty file.
iferr (fd = open (fname, NEW_FILE, TEXT_FILE)) {
call eprintf ("Error: Cannot touch file '%s'\n")
call pargstr (fname)
call erract (EA_ERROR)
return;
}
call close (fd)
if (verbose) call printf ("(created) ")
} else {
if (verbose) call printf ("(not created)\n")
return
}
}
# Update the times.
if (futime (fname, atime, mtime) == ERR)
call eprintf ("Error processing file\n")
else if (verbose) {
call printf ("(updated %s%s%s)\n")
if (atime > 0)
call pargstr ("atime")
else
call pargstr ("")
if (atime > 0 && mtime > 0)
call pargstr ("/")
else
call pargstr ("")
if (mtime > 0)
call pargstr ("mtime")
else
call pargstr ("")
}
end
|