root/source3/lib/file_id.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. vfs_file_id_from_sbuf
  2. file_id_equal
  3. file_id_string_tos
  4. push_file_id_16
  5. push_file_id_24
  6. pull_file_id_24

   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)
     /* [<][>][^][v][top][bottom][index][help] */
  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)
     /* [<][>][^][v][top][bottom][index][help] */
  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)
     /* [<][>][^][v][top][bottom][index][help] */
  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)
     /* [<][>][^][v][top][bottom][index][help] */
  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)
     /* [<][>][^][v][top][bottom][index][help] */
  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)
     /* [<][>][^][v][top][bottom][index][help] */
  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 }

/* [<][>][^][v][top][bottom][index][help] */