Changes by: antona
Update of /cvsroot/linux-ntfs/linux-ntfs/ntfstools
In directory usw-pr-cvs1:/tmp/cvs-serv18654/ntfstools
Modified Files:
mkntfs.c
Log Message:
New API for compressing run lists into mapping pairs arrays and adapt mkntfs to that API. Addition of ntfs_walk_attrs().
Index: mkntfs.c
===================================================================
RCS file: /cvsroot/linux-ntfs/linux-ntfs/ntfstools/mkntfs.c,v
retrieving revision 1.76
retrieving revision 1.77
diff -U2 -r1.76 -r1.77
--- mkntfs.c 3 Jul 2002 21:56:01 -0000 1.76
+++ mkntfs.c 6 Jul 2002 20:07:59 -0000 1.77
@@ -829,149 +829,4 @@
}
-/*
- * Return the number of bytes required to store @n unambiguously as
- * a signed number.
- */
-__inline__ int get_min_bytes_width(const long long n)
-{
- long long l = n;
- int i;
- s8 j;
-
- i = 0;
- do {
- l >>= 8;
- i++;
- } while (l != 0LL && l != -1LL);
- j = (n >> 8 * (i - 1)) & 0xff;
- /* If the sign bit is wrong, we need one more byte. */
- if ((n < 0LL && j >= 0) || (n > 0LL && j < 0))
- i++;
-// printf("min_bytes_width(0x%Lx) = %i\n", n, i);
- return i;
-}
-
-/*
- * Return >= 0 on success with the result being the mapping pairs size or
- * <0 on error with the value being errno. If @rl is NULL return 0.
- */
-int get_size_for_mapping_pairs(const run_list *rl)
-{
- int i;
- LCN prev_lcn;
- /* Terminator byte. */
- int rls = 1;
-
- if (!rl)
- return 0;
- prev_lcn = 0LL;
- for (i = 0; rl[i].length; i++, prev_lcn = rl[i].lcn) {
- /* Header byte + length. */
- rls += 1 + get_min_bytes_width(rl[i].length);
- /*
- * LCN change - If LCN is -1 and we are on NTFS 3.0+,
- * don't store it at all, i.e. need zero space.
- * If on NTFS 1.2-, OTOH, store it as usual.
- */
- if (rl[i].lcn == -1LL && vol->major_ver >= 3)
- continue;
- rls += get_min_bytes_width(rl[i].lcn - prev_lcn);
- }
-// printf("size for mapping pairs = %i\n", rls);
- return rls;
-}
-
-/*
- * Store minimal number of bytes of @n required to identify @n unambiguously
- * as a signed number in @dest, taking care not to exceed @dest_max, the
- * maximum position within @dest to which we are allowed to write.
- *
- * Return the number of bytes written or -1 if @dest is overflowed.
- */
-__inline__ int write_min_bytes(char *dest, const char *dest_max,
- const long long n)
-{
- long long l = n;
- int i;
- s8 j;
-
-// printf("n = l = 0x%Lx\n", l);
-// printf("dest = %x\n", dest);
-// printf("dest_max = %x\n", dest_max);
- i = 0;
- do {
- if (dest > dest_max)
- return -1;
- *dest++ = l & 0xffLL;
-// printf("writing byte 0x%x\n", *(dest - 1));
- l >>= 8;
-// printf("dest = %x\n", dest);
-// printf("l = 0x%x\n", l);
- i++;
- } while (l != 0LL && l != -1LL);
- j = (n >> 8 * (i - 1)) & 0xff;
- /* If the sign bit is wrong, we need one more byte. */
- if (n < 0LL && j >= 0) {
- i++;
- *dest = (char)-1;
-// printf("writing extra byte 0x%x\n", *dest);
- } else if (n > 0LL && j < 0) {
- i++;
- *dest = (char)0;
-// printf("writing extra byte 0x%x\n", *dest);
- }
-// printf("wrote %i bytes\n", i);
- return i;
-}
-
-/*
- * Create the mapping pairs array from the run list @rl and save the array in
- * @dest. @dest_len is the size of @dest and should have been obtained
- * previously by calling get_size_for_mapping_pairs(@rl).
- *
- * Return 0 on success or -1 on error. If @rl is NULL return 0.
- */
-int build_mapping_pairs(char *dest, const int dest_len, const run_list *rl)
-{
- int i;
- s8 len_len, lcn_len;
- char *dest_max;
- LCN prev_lcn;
-
- if (!rl)
- return 0;
- prev_lcn = 0LL;
- dest_max = dest + dest_len - 1;
- for (i = 0; dest < dest_max && rl[i].length;
- i++, prev_lcn = rl[i].lcn) {
- /* Write length. */
- len_len = write_min_bytes(dest + 1, dest_max, rl[i].length);
- /*
- * Write LCN change. - If LCN is -1 and we are on NTFS 3.0+,
- * don't store it at all, i.e. need zero space.
- * If on NTFS 1.2-, OTOH, store it as usual.
- */
- if (rl[i].lcn == -1LL && vol->major_ver >= 3)
- lcn_len = 0;
- else
- lcn_len = write_min_bytes(dest + 1 + len_len, dest_max,
- rl[i].lcn - prev_lcn);
- if (len_len < 0 || lcn_len < 0)
- goto err_ret;
- /* Update header byte. */
- *dest = lcn_len << 4 | len_len;
- /* Position ourselves at next mapping pairs array element. */
- dest += 1 + len_len + lcn_len;
- }
- /* Terminator byte. */
- *dest = 0;
- return 0;
-err_ret:
- Eprintf("build_mapping_pairs failed due to overflow of destination "
- "buffer, len_len = %Li, lcn_len = %Li\n", len_len,
- lcn_len);
- return -1;
-}
-
/**
* make_room_for_attribute - make room for an attribute inside an mft record
@@ -1235,7 +1090,13 @@
} else {
hdr_size = 64;
- if (val_len)
- mpa_size = get_size_for_mapping_pairs(rl);
- else
+ if (val_len) {
+ mpa_size = ntfs_get_size_for_mapping_pairs(vol, rl);
+ if (mpa_size < 0) {
+ err = -errno;
+ Eprintf("Failed to get size for mapping "
+ "pairs.\n");
+ goto err_out;
+ }
+ } else
mpa_size = 0;
}
@@ -1316,5 +1177,5 @@
Eprintf("Error writing non-resident attribute value."
"\n");
- err = build_mapping_pairs((char*)a + hdr_size +
+ err = ntfs_build_mapping_pairs(vol, (s8*)a + hdr_size +
((name_len + 7) & ~7), mpa_size, rl);
}
@@ -1421,7 +1282,13 @@
} else {
hdr_size = 64;
- if (val_len)
- mpa_size = get_size_for_mapping_pairs(rl);
- else
+ if (val_len) {
+ mpa_size = ntfs_get_size_for_mapping_pairs(vol, rl);
+ if (mpa_size < 0) {
+ err = -errno;
+ Eprintf("Failed to get size for mapping "
+ "pairs.\n");
+ goto err_out;
+ }
+ } else
mpa_size = 0;
}
@@ -1496,5 +1363,5 @@
Eprintf("Error writing non-resident attribute value."
"\n");
- err = build_mapping_pairs((char*)a + hdr_size +
+ err = ntfs_build_mapping_pairs(vol, (s8*)a + hdr_size +
((name_len + 7) & ~7), mpa_size, rl);
}
|