3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; version 2 of the License.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 #include "wrappers-io.h"
20 #include <sys/types.h>
24 doitUnify(char const *src, char const *dst)
26 size_t l = strlen(dst);
27 char tmpfile[l + sizeof(".XXXXXX")];
32 // at first, set the ILI flags on 'src'
33 fd_src = open(src, O_RDONLY);
38 if (vc_X_set_ext2flags(fd_src,
39 VC_IMMUTABLE_FILE_FL|VC_IMMUTABLE_LINK_FL, 0)==-1) {
40 perror("vc_X_set_ext2flags()");
46 // now, create a temporary filename
47 memcpy(tmpfile, dst, l);
48 memcpy(tmpfile+l, ".XXXXXX", 8);
49 fd = mkstemp(tmpfile);
57 // and rename the old file to this name
58 if (rename(dst, tmpfile)==-1) {
63 // now, link the src-file to dst
64 if (link(src, dst)==-1) {
68 if (rename(tmpfile, dst)==-1) {
69 perror("FATAL error in rename()");
84 doitDeUnify(char const UNUSED *src, char const *dst)
86 size_t l = strlen(dst);
87 char tmpfile[l + sizeof(".XXXXXX")];
92 fd_src = open(dst, O_RDONLY);
98 if (fstat(fd_src, &st)==-1) {
104 memcpy(tmpfile, dst, l);
105 memcpy(tmpfile+l, ".XXXXXX", 8);
106 fd_tmp = mkstemp(tmpfile);
114 if (fchown(fd_tmp, st.st_uid, st.st_gid)==-1 ||
115 fchmod(fd_tmp, st.st_mode)==-1) {
116 perror("fchown()/fchmod()");
124 ssize_t len = read(fd_src, buf, sizeof buf);
131 if (!WwriteAll(fd_tmp, buf, len)) goto err;
134 if (close(fd_src)==-1) {
138 if (close(fd_tmp)==-1) {
143 utm.actime = st.st_atime;
144 utm.modtime = st.st_mtime;
147 if (utime(tmpfile, &utm)==-1) {
152 if (unlink(dst)==-1) {
158 if (rename(tmpfile, dst)==-1) {
159 perror("FATAL error in rename()");
169 if (tmpfile[0]) unlink(tmpfile);