initial checkin
[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   WRITE_MSG(1, "unifying '");
62   WRITE_STR(1, src);
63   WRITE_MSG(1, "' -> '");
64   WRITE_STR(1, dst);
65   WRITE_STR(1, "'\n");
66
67   return true;
68 }
69
70
71 static struct Operations        op_unify_test = {
72   .compare = compareUnify,
73   .doit    = unifyTest
74 };
75
76 static struct Operations        op_deunify_test = {
77   .compare = compareDeUnify,
78   .doit    = unifyTest
79 };
80   
81 static struct Operations        op_unify_notest = {
82   .compare = compareUnify,
83   .doit    = unifyTest
84 };
85
86 static struct Operations        op_deunify_notest = {
87   .compare = compareDeUnify,
88   .doit    = unifyTest
89 };
90
91 // ======
92
93 void
94 Operations_init(struct Operations *op, OperationType type, bool is_test)
95 {
96   switch (type) {
97     case opUNIFY        :
98       if (is_test) *op = op_unify_test;
99       else         *op = op_unify_notest;
100       break;
101
102     case opDEUNIFY      :
103       if (is_test) *op = op_deunify_test;
104       else         *op = op_deunify_notest;
105       break;
106
107     default             :
108       abort();
109   }
110 }