summaryrefslogtreecommitdiff
path: root/source3/lib/file_id.c
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2007-05-29 09:30:34 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:22:52 -0500
commite8156439f24137b5418baad20a7f00f6949cfe29 (patch)
treeb2d6a876be7a2d7b763402e33e1653899430d48d /source3/lib/file_id.c
parentba0bce2c6f7298840e0d223a5f170b777b8c9d64 (diff)
downloadsamba-e8156439f24137b5418baad20a7f00f6949cfe29.tar.gz
samba-e8156439f24137b5418baad20a7f00f6949cfe29.tar.bz2
samba-e8156439f24137b5418baad20a7f00f6949cfe29.zip
r23183: Check in a change made by Tridge:
This replaces the internal explicit dev/ino file id representation by a "struct file_id". This is necessary as cluster file systems and NFS don't necessarily assign the same device number to the shared file system. With this structure in place we can now easily add different schemes to map a file to a unique 64-bit device node. Jeremy, you might note that I did not change the external interface of smb_share_modes.c. Volker (This used to be commit 9b10dbbd5de8813fc15ebbb6be9b18010ffe8139)
Diffstat (limited to 'source3/lib/file_id.c')
-rw-r--r--source3/lib/file_id.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/source3/lib/file_id.c b/source3/lib/file_id.c
new file mode 100644
index 0000000000..335c1829fb
--- /dev/null
+++ b/source3/lib/file_id.c
@@ -0,0 +1,102 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ file_id structure handling
+
+ Copyright (C) Andrew Tridgell 2007
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+/*
+ return a file_id which gives a unique ID for a file given the device and
+ inode numbers
+ */
+static struct file_id file_id_create(SMB_DEV_T dev, SMB_INO_T inode)
+{
+ struct file_id key;
+ /* the ZERO_STRUCT ensures padding doesn't break using the key as a
+ * blob */
+ ZERO_STRUCT(key);
+ key.devid = dev;
+ key.inode = inode;
+ return key;
+}
+
+/*
+ generate a file_id from a stat structure
+ */
+struct file_id file_id_sbuf(const SMB_STRUCT_STAT *sbuf)
+{
+ return file_id_create(sbuf->st_dev, sbuf->st_ino);
+}
+
+
+/*
+ return True if two file_id structures are equal
+ */
+BOOL file_id_equal(const struct file_id *id1, const struct file_id *id2)
+{
+ return id1->inode == id2->inode && id1->devid == id2->devid;
+}
+
+/*
+ a static string for a file_id structure
+ */
+const char *file_id_static_string(const struct file_id *id)
+{
+ static char buf[32];
+ snprintf(buf, sizeof(buf), "%llx:%llx",
+ (unsigned long long)id->devid,
+ (unsigned long long)id->inode);
+ return buf;
+}
+
+/*
+ a 2nd static string for a file_id structure so we can print 2 at once
+ */
+const char *file_id_static_string2(const struct file_id *id)
+{
+ static char buf[32];
+ snprintf(buf, sizeof(buf), "%llx:%llx",
+ (unsigned long long)id->devid,
+ (unsigned long long)id->inode);
+ return buf;
+}
+
+/*
+ push a 16 byte version of a file id into a buffer
+ */
+void push_file_id_16(char *buf, const struct file_id *id)
+{
+ SIVAL(buf, 0, id->devid&0xFFFFFFFF);
+ SIVAL(buf, 4, id->devid>>32);
+ SIVAL(buf, 8, id->inode&0xFFFFFFFF);
+ SIVAL(buf, 12, id->inode>>32);
+}
+
+/*
+ pul a 16 byte version of a file id from a buffer
+ */
+void pull_file_id_16(char *buf, struct file_id *id)
+{
+ ZERO_STRUCTP(id);
+ id->devid = IVAL(buf, 0);
+ id->devid |= ((uint64_t)IVAL(buf,4))<<32;
+ id->inode = IVAL(buf, 8);
+ id->inode |= ((uint64_t)IVAL(buf,12))<<32;
+}