linux/fs/ntfs/collate.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * collate.c - NTFS kernel collation handling.  Part of the Linux-NTFS project.
   4 *
   5 * Copyright (c) 2004 Anton Altaparmakov
   6 */
   7
   8#include "collate.h"
   9#include "debug.h"
  10#include "ntfs.h"
  11
  12static int ntfs_collate_binary(ntfs_volume *vol,
  13                const void *data1, const int data1_len,
  14                const void *data2, const int data2_len)
  15{
  16        int rc;
  17
  18        ntfs_debug("Entering.");
  19        rc = memcmp(data1, data2, min(data1_len, data2_len));
  20        if (!rc && (data1_len != data2_len)) {
  21                if (data1_len < data2_len)
  22                        rc = -1;
  23                else
  24                        rc = 1;
  25        }
  26        ntfs_debug("Done, returning %i", rc);
  27        return rc;
  28}
  29
  30static int ntfs_collate_ntofs_ulong(ntfs_volume *vol,
  31                const void *data1, const int data1_len,
  32                const void *data2, const int data2_len)
  33{
  34        int rc;
  35        u32 d1, d2;
  36
  37        ntfs_debug("Entering.");
  38        // FIXME:  We don't really want to bug here.
  39        BUG_ON(data1_len != data2_len);
  40        BUG_ON(data1_len != 4);
  41        d1 = le32_to_cpup(data1);
  42        d2 = le32_to_cpup(data2);
  43        if (d1 < d2)
  44                rc = -1;
  45        else {
  46                if (d1 == d2)
  47                        rc = 0;
  48                else
  49                        rc = 1;
  50        }
  51        ntfs_debug("Done, returning %i", rc);
  52        return rc;
  53}
  54
  55typedef int (*ntfs_collate_func_t)(ntfs_volume *, const void *, const int,
  56                const void *, const int);
  57
  58static ntfs_collate_func_t ntfs_do_collate0x0[3] = {
  59        ntfs_collate_binary,
  60        NULL/*ntfs_collate_file_name*/,
  61        NULL/*ntfs_collate_unicode_string*/,
  62};
  63
  64static ntfs_collate_func_t ntfs_do_collate0x1[4] = {
  65        ntfs_collate_ntofs_ulong,
  66        NULL/*ntfs_collate_ntofs_sid*/,
  67        NULL/*ntfs_collate_ntofs_security_hash*/,
  68        NULL/*ntfs_collate_ntofs_ulongs*/,
  69};
  70
  71/**
  72 * ntfs_collate - collate two data items using a specified collation rule
  73 * @vol:        ntfs volume to which the data items belong
  74 * @cr:         collation rule to use when comparing the items
  75 * @data1:      first data item to collate
  76 * @data1_len:  length in bytes of @data1
  77 * @data2:      second data item to collate
  78 * @data2_len:  length in bytes of @data2
  79 *
  80 * Collate the two data items @data1 and @data2 using the collation rule @cr
  81 * and return -1, 0, ir 1 if @data1 is found, respectively, to collate before,
  82 * to match, or to collate after @data2.
  83 *
  84 * For speed we use the collation rule @cr as an index into two tables of
  85 * function pointers to call the appropriate collation function.
  86 */
  87int ntfs_collate(ntfs_volume *vol, COLLATION_RULE cr,
  88                const void *data1, const int data1_len,
  89                const void *data2, const int data2_len) {
  90        int i;
  91
  92        ntfs_debug("Entering.");
  93        /*
  94         * FIXME:  At the moment we only support COLLATION_BINARY and
  95         * COLLATION_NTOFS_ULONG, so we BUG() for everything else for now.
  96         */
  97        BUG_ON(cr != COLLATION_BINARY && cr != COLLATION_NTOFS_ULONG);
  98        i = le32_to_cpu(cr);
  99        BUG_ON(i < 0);
 100        if (i <= 0x02)
 101                return ntfs_do_collate0x0[i](vol, data1, data1_len,
 102                                data2, data2_len);
 103        BUG_ON(i < 0x10);
 104        i -= 0x10;
 105        if (likely(i <= 3))
 106                return ntfs_do_collate0x1[i](vol, data1, data1_len,
 107                                data2, data2_len);
 108        BUG();
 109        return 0;
 110}
 111