v3-4-ctdb: Bump ctdb vendor patch level to 17
[obnox/samba-ctdb.git] / source3 / lib / file_id.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    file_id structure handling
5
6    Copyright (C) Andrew Tridgell 2007
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include "includes.h"
23
24 /*
25   generate a file_id from a stat structure
26  */
27 struct file_id vfs_file_id_from_sbuf(connection_struct *conn, const SMB_STRUCT_STAT *sbuf)
28 {
29         return SMB_VFS_FILE_ID_CREATE(conn, sbuf);
30 }
31
32 /*
33   return True if two file_id structures are equal
34  */
35 bool file_id_equal(const struct file_id *id1, const struct file_id *id2)
36 {
37         return id1->inode == id2->inode && id1->devid == id2->devid &&
38             id1->extid == id2->extid;
39 }
40
41 /*
42   a static string for a file_id structure
43  */
44 const char *file_id_string_tos(const struct file_id *id)
45 {
46         char *result = talloc_asprintf(talloc_tos(), "%llx:%llx:%llx",
47                                        (unsigned long long)id->devid, 
48                                        (unsigned long long)id->inode,
49                                        (unsigned long long)id->extid);
50         SMB_ASSERT(result != NULL);
51         return result;
52 }
53
54 /*
55   push a 16 byte version of a file id into a buffer.  This ignores the extid
56   and is needed when dev/inodes are stored in persistent storage (tdbs).
57  */
58 void push_file_id_16(char *buf, const struct file_id *id)
59 {
60         SIVAL(buf,  0, id->devid&0xFFFFFFFF);
61         SIVAL(buf,  4, id->devid>>32);
62         SIVAL(buf,  8, id->inode&0xFFFFFFFF);
63         SIVAL(buf, 12, id->inode>>32);
64 }
65
66 /*
67   push a 24 byte version of a file id into a buffer
68  */
69 void push_file_id_24(char *buf, const struct file_id *id)
70 {
71         SIVAL(buf,  0, id->devid&0xFFFFFFFF);
72         SIVAL(buf,  4, id->devid>>32);
73         SIVAL(buf,  8, id->inode&0xFFFFFFFF);
74         SIVAL(buf, 12, id->inode>>32);
75         SIVAL(buf, 16, id->extid&0xFFFFFFFF);
76         SIVAL(buf, 20, id->extid>>32);
77 }
78
79 /*
80   pull a 24 byte version of a file id from a buffer
81  */
82 void pull_file_id_24(char *buf, struct file_id *id)
83 {
84         ZERO_STRUCTP(id);
85         id->devid  = IVAL(buf,  0);
86         id->devid |= ((uint64_t)IVAL(buf,4))<<32;
87         id->inode  = IVAL(buf,  8);
88         id->inode |= ((uint64_t)IVAL(buf,12))<<32;
89         id->extid  = IVAL(buf,  16);
90         id->extid |= ((uint64_t)IVAL(buf,20))<<32;
91 }