Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / port / touch.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: touch.c /main/3 1995/11/01 18:20:46 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46
47 /* : : generated by proto : : */
48
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__      "C"
53 #else
54 #define __MANGLE__
55 #endif
56 #define __STDARG__
57 #define __PROTO__(x)    x
58 #define __OTORP__(x)
59 #define __PARAM__(n,o)  n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
62 #define const
63 #endif
64 #define signed
65 #define void            int
66 #define volatile
67 #define __V_            char
68 #else
69 #define __V_            void
70 #endif
71 #else
72 #define __PROTO__(x)    ()
73 #define __OTORP__(x)    x
74 #define __PARAM__(n,o)  o
75 #define __MANGLE__
76 #define __V_            char
77 #define const
78 #define signed
79 #define void            int
80 #define volatile
81 #endif
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__      ...
84 #else
85 #define __VARARG__
86 #endif
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a)       va_start(p,a)
89 #else
90 #define __VA_START__(p,a)       va_start(p)
91 #endif
92 #endif
93 #if defined(__STDPP__directive) && defined(__STDPP__hide)
94 __STDPP__directive pragma pp:hide utime
95 #else
96 #define utime           ______utime
97 #endif
98
99 #include <ast.h>
100 #include <ls.h>
101 #include <times.h>
102 #include <error.h>
103
104 #if _hdr_utime && _lib_utime
105 #include <utime.h>
106 #endif
107
108 #if defined(__STDPP__directive) && defined(__STDPP__hide)
109 __STDPP__directive pragma pp:nohide utime
110 #else
111 #undef  utime
112 #endif
113
114 #if _lib_utime
115 #if _hdr_utime
116 extern __MANGLE__ int   utime __PROTO__((const char*, const struct utimbuf*));
117 #else
118 extern __MANGLE__ int   utime __PROTO__((const char*, const time_t*));
119 #endif
120 #endif
121
122 int
123 touch __PARAM__((const char* file, time_t atime, time_t mtime, int force), (file, atime, mtime, force)) __OTORP__(const char* file; time_t atime; time_t mtime; int force;){
124         int             n;
125         int             fd;
126         int             oerrno = errno;
127         int             mode;
128 #if _lib_utime
129         time_t          now;
130         struct stat     st;
131 #if _hdr_utime
132         struct utimbuf  ut;
133 #else
134         time_t          ut[2];
135 #endif
136
137         if (force >= 0)
138         {
139                 if (atime == (time_t)(-1) || mtime == (time_t)(-1))
140                 {
141                         if (stat(file, &st)) st.st_atime = st.st_mtime = 0;
142                         if (atime == (time_t)(-1)) atime = st.st_atime;
143                         if (mtime == (time_t)(-1)) mtime = st.st_mtime;
144                 }
145                 if (!atime || !mtime)
146 #if _hdr_utime && _lib_utime_now
147                 if (atime || mtime)
148 #endif
149                 {
150                         time(&now);
151                         if (!atime) atime = now;
152                         if (!mtime) mtime = now;
153                 }
154         }
155 #if _hdr_utime
156         ut.actime = atime;
157         ut.modtime = mtime;
158 #if _lib_utime_now
159         n = utime(file, (force < 0 || atime || mtime) ? &ut : (struct utimbuf*)0);
160 #else
161         n = utime(file, &ut);
162 #endif
163 #else
164         ut[0] = atime;
165         ut[1] = mtime;
166         n = utime(file, ut);
167 #endif
168         if (n)
169 #else
170         if (mtime)
171         {
172                 /*
173                  * NOTE: the emulation allows atime to change
174                  *       for mtime only requests
175                  */
176
177                 errno = EINVAL;
178                 return(-1);
179         }
180 #endif
181         {
182 #if _lib_utime
183                 if (errno == ENOENT || errno == EPERM)
184 #else
185
186                 if (access(file, F_OK))
187 #endif
188                 {
189                         if (!force) return(-1);
190                         umask(mode = umask(0));
191                         mode = (~mode) & (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
192                         if ((fd = creat(file, mode)) < 0) return(-1);
193                         close(fd);
194                         errno = oerrno;
195 #if _lib_utime
196 #if _hdr_utime
197 #if _lib_utime_now
198                         return((force < 0 || atime || mtime) ? utime(file, &ut) : 0);
199 #else
200                         return(0);
201 #endif
202 #else
203                         return((atime != now || mtime != now) ? utime(file, ut) : 0);
204 #endif
205 #else
206                         return(0);
207 #endif
208                 }
209 #if !_hdr_utime || !_lib_utime
210 #if _lib_utime
211                 if (atime == now && mtime == now && (fd = open(file, 2)) >= 0)
212 #else
213                 if ((fd = open(file, 2)) >= 0)
214 #endif
215                 {
216                         char    c;
217
218                         if (read(fd, &c, 1) == 1)
219                         {
220                                 if (lseek(fd, 0L, 0) == 0L && write(fd, &c, 1) == 1)
221                                 {
222                                         errno = oerrno;
223                                         n = 0;
224                                 }
225                                 close(fd);
226                         }
227                         else
228                         {
229                                 close(fd);
230                                 umask(mode = umask(0));
231                                 mode = (~mode) & (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
232                                 if ((fd = creat(file, mode)) >= 0)
233                                 {
234                                         close(fd);
235                                         errno = oerrno;
236                                         n = 0;
237                                 }
238                         }
239                 }
240 #endif
241         }
242         return(n);
243 }