added exclude-list support
[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
44   // TODO: acl? time?
45 }
46
47 // return 'true' iff both files are the same one
48 static bool
49 compareDeUnify(struct stat const *lhs, struct stat const *rhs)
50 {
51   return (lhs->st_dev ==rhs->st_dev  &&
52           lhs->st_ino ==rhs->st_ino);
53 }
54
55 // =====  The 'doit' functions   ===========
56
57
58 static bool
59 unifyTest(char const *src, char const *dst)
60 {
61 #if 0
62   WRITE_MSG(1, "unifying '");
63   WRITE_STR(1, src);
64   WRITE_MSG(1, "' -> '");
65   WRITE_STR(1, dst);
66   WRITE_STR(1, "'\n");
67 #endif
68   
69   return true;
70 }
71
72
73 static struct Operations        op_unify_test = {
74   .compare = compareUnify,
75   .doit    = unifyTest
76 };
77
78 static struct Operations        op_deunify_test = {
79   .compare = compareDeUnify,
80   .doit    = unifyTest
81 };
82   
83 static struct Operations        op_unify_notest = {
84   .compare = compareUnify,
85   .doit    = unifyTest
86 };
87
88 static struct Operations        op_deunify_notest = {
89   .compare = compareDeUnify,
90   .doit    = unifyTest
91 };
92
93 // ======
94
95 void
96 Operations_init(struct Operations *op, OperationType type, bool is_test)
97 {
98   switch (type) {
99     case opUNIFY        :
100       if (is_test) *op = op_unify_test;
101       else         *op = op_unify_notest;
102       break;
103
104     case opDEUNIFY      :
105       if (is_test) *op = op_deunify_test;
106       else         *op = op_deunify_notest;
107       break;
108
109     default             :
110       abort();
111   }
112 }