home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / SLAX 6.0.8 / slax-6.0.8.iso / slax / base / 006-devel.lzm / usr / include / ntfs-3g / index.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-10-26  |  4.7 KB  |  129 lines

  1. /*
  2.  * index.h - Defines for NTFS index handling.  Originated from the Linux-NTFS project.
  3.  *
  4.  * Copyright (c) 2004 Anton Altaparmakov
  5.  * Copyright (c) 2004-2005 Richard Russon
  6.  * Copyright (c) 2005 Yura Pakhuchiy
  7.  * Copyright (c) 2006-2008 Szabolcs Szakacsits
  8.  *
  9.  * This program/include file is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License as published
  11.  * by the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program/include file is distributed in the hope that it will be
  15.  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  16.  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program (in the main directory of the NTFS-3G
  21.  * distribution in the file COPYING); if not, write to the Free Software
  22.  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24.  
  25. #ifndef _NTFS_INDEX_H
  26. #define _NTFS_INDEX_H
  27.  
  28. #include "attrib.h"
  29. #include "types.h"
  30. #include "layout.h"
  31. #include "inode.h"
  32. #include "mft.h"
  33.  
  34. #define  VCN_INDEX_ROOT_PARENT  ((VCN)-2)
  35.  
  36. #define  MAX_PARENT_VCN        32
  37.  
  38. /**
  39.  * struct ntfs_index_context -
  40.  * @ni:            inode containing the @entry described by this context
  41.  * @name:        name of the index described by this context
  42.  * @name_len:        length of the index name
  43.  * @entry:        index entry (points into @ir or @ia)
  44.  * @data:        index entry data (points into @entry)
  45.  * @data_len:        length in bytes of @data
  46.  * @is_in_root:        TRUE if @entry is in @ir or FALSE if it is in @ia
  47.  * @ir:            index root if @is_in_root or NULL otherwise
  48.  * @actx:        attribute search context if in root or NULL otherwise
  49.  * @ia:            index block if @is_in_root is FALSE or NULL otherwise
  50.  * @ia_na:        opened INDEX_ALLOCATION attribute
  51.  * @parent_pos:        parent entries' positions in the index block
  52.  * @parent_vcn:        entry's parent node or VCN_INDEX_ROOT_PARENT
  53.  * @new_vcn:            new VCN if we need to create a new index block
  54.  * @median:        move to the parent if splitting index blocks
  55.  * @ib_dirty:        TRUE if index block was changed
  56.  * @block_size:        index block size
  57.  * @vcn_size_bits:    VCN size bits for this index block
  58.  *
  59.  * @ni is the inode this context belongs to.
  60.  *
  61.  * @entry is the index entry described by this context.  @data and @data_len
  62.  * are the index entry data and its length in bytes, respectively.  @data
  63.  * simply points into @entry.  This is probably what the user is interested in.
  64.  *
  65.  * If @is_in_root is TRUE, @entry is in the index root attribute @ir described
  66.  * by the attribute search context @actx and inode @ni.  @ia and
  67.  * @ib_dirty are undefined in this case.
  68.  *
  69.  * If @is_in_root is FALSE, @entry is in the index allocation attribute and @ia
  70.  * point to the index allocation block and VCN where it's placed,
  71.  * respectively. @ir and @actx are NULL in this case. @ia_na is opened
  72.  * INDEX_ALLOCATION attribute. @ib_dirty is TRUE if index block was changed and
  73.  * FALSE otherwise.
  74.  *
  75.  * To obtain a context call ntfs_index_ctx_get().
  76.  *
  77.  * When finished with the @entry and its @data, call ntfs_index_ctx_put() to
  78.  * free the context and other associated resources.
  79.  *
  80.  * If the index entry was modified, call ntfs_index_entry_mark_dirty() before
  81.  * the call to ntfs_index_ctx_put() to ensure that the changes are written
  82.  * to disk.
  83.  */
  84. typedef struct {
  85.     ntfs_inode *ni;
  86.     ntfschar *name;
  87.     u32 name_len;
  88.     INDEX_ENTRY *entry;
  89.     void *data;
  90.     u16 data_len;
  91.     COLLATION_RULES cr;
  92.     BOOL is_in_root;
  93.     INDEX_ROOT *ir;
  94.     ntfs_attr_search_ctx *actx;
  95.     INDEX_BLOCK *ib;
  96.     ntfs_attr *ia_na;
  97.     int parent_pos[MAX_PARENT_VCN];  /* parent entries' positions */
  98.     VCN parent_vcn[MAX_PARENT_VCN]; /* entry's parent nodes */
  99.     int pindex;         /* maximum it's the number of the parent nodes  */
  100.     BOOL ib_dirty;
  101.     u32 block_size;
  102.     u8 vcn_size_bits;
  103. } ntfs_index_context;
  104.  
  105. extern ntfs_index_context *ntfs_index_ctx_get(ntfs_inode *ni,
  106.                         ntfschar *name, u32 name_len);
  107. extern void ntfs_index_ctx_put(ntfs_index_context *ictx);
  108. extern void ntfs_index_ctx_reinit(ntfs_index_context *ictx);
  109.  
  110. extern int ntfs_index_lookup(const void *key, const int key_len,
  111.         ntfs_index_context *ictx);
  112.  
  113. extern int ntfs_index_add_filename(ntfs_inode *ni, FILE_NAME_ATTR *fn,
  114.         MFT_REF mref);
  115. extern int ntfs_index_remove(ntfs_inode *ni, const void *key, const int keylen);
  116.  
  117. extern INDEX_ROOT *ntfs_index_root_get(ntfs_inode *ni, ATTR_RECORD *attr);
  118.  
  119. extern VCN ntfs_ie_get_vcn(INDEX_ENTRY *ie);
  120.  
  121. extern void ntfs_index_entry_mark_dirty(ntfs_index_context *ictx);
  122.  
  123. extern char *ntfs_ie_filename_get(INDEX_ENTRY *ie);
  124. extern void ntfs_ie_filename_dump(INDEX_ENTRY *ie);
  125. extern void ntfs_ih_filename_dump(INDEX_HEADER *ih);
  126.  
  127. #endif /* _NTFS_INDEX_H */
  128.  
  129.