compareUnify(): check mtime too
[util-vserver.git] / util-vserver / src / vunify-operations.c
1 // $Id$    --*- c -*--
2
3 // Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
4 //  
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.
8 //  
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.
13 //  
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.
17
18
19 #ifdef HAVE_CONFIG_H
20 #  include <config.h>
21 #endif
22
23 #include "vunify-operations.h"
24 #include "util.h"
25
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <stdlib.h>
29
30
31 // ======   The compare functions   =========
32
33 // return 'true' iff both files are different and unifyable 
34 static bool
35 compareUnify(struct stat const *lhs, struct stat const *rhs)
36 {
37   return (lhs->st_dev  ==rhs->st_dev  &&
38           lhs->st_ino  !=rhs->st_ino  &&
39           lhs->st_mode ==rhs->st_mode &&
40           lhs->st_uid  ==rhs->st_uid  &&
41           lhs->st_gid  ==rhs->st_gid  &&
42           lhs->st_size ==rhs->st_size &&
43           lhs->st_mtime==rhs->st_mtime);
44
45   // TODO: acl? time?
46 }
47
48 // return 'true' iff both files are the same one
49 static bool
50 compareDeUnify(struct stat const *lhs, struct stat const *rhs)
51 {
52   return (lhs->st_dev ==rhs->st_dev  &&
53           lhs->st_ino ==rhs->st_ino);
54 }
55
56 // =====  The 'doit' functions   ===========
57
58
59 static bool
60 unifyTest(char const *src, char const *dst)
61 {
62 #if 0
63   WRITE_MSG(1, "unifying '");
64   WRITE_STR(1, src);
65   WRITE_MSG(1, "' -> '");
66   WRITE_STR(1, dst);
67   WRITE_STR(1, "'\n");
68 #endif
69   
70   return true;
71 }
72
73
74 static struct Operations        op_unify_test = {
75   .compare = compareUnify,
76   .doit    = unifyTest
77 };
78
79 static struct Operations        op_deunify_test = {
80   .compare = compareDeUnify,
81   .doit    = unifyTest
82 };
83   
84 static struct Operations        op_unify_notest = {
85   .compare = compareUnify,
86   .doit    = unifyTest
87 };
88
89 static struct Operations        op_deunify_notest = {
90   .compare = compareDeUnify,
91   .doit    = unifyTest
92 };
93
94 // ======
95
96 void
97 Operations_init(struct Operations *op, OperationType type, bool is_test)
98 {
99   switch (type) {
100     case opUNIFY        :
101       if (is_test) *op = op_unify_test;
102       else         *op = op_unify_notest;
103       break;
104
105     case opDEUNIFY      :
106       if (is_test) *op = op_deunify_test;
107       else         *op = op_deunify_notest;
108       break;
109
110     default             :
111       abort();
112   }
113 }