releasing version 0.9.6-1
[sven/exfat-utils.git] / mkfs / uct.c
1 /*
2         uct.c (09.11.10)
3         Upper Case Table creation code.
4
5         Copyright (C) 2009, 2010  Andrew Nayenko
6
7         This program is free software: you can redistribute it and/or modify
8         it under the terms of the GNU General Public License as published by
9         the Free Software Foundation, either version 3 of the License, or
10         (at your option) any later version.
11
12         This program is distributed in the hope that it will be useful,
13         but WITHOUT ANY WARRANTY; without even the implied warranty of
14         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15         GNU General Public License for more details.
16
17         You should have received a copy of the GNU General Public License
18         along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include <unistd.h>
22 #include <errno.h>
23 #include "mkexfat.h"
24 #include "uctc.h"
25
26 off_t uct_alignment(void)
27 {
28         return CLUSTER_SIZE(sb);
29 }
30
31 off_t uct_size(void)
32 {
33         return sizeof(upcase_table);
34 }
35
36 static le32_t uct_checksum(void)
37 {
38         size_t i;
39         uint32_t sum = 0;
40
41         for (i = 0; i < sizeof(upcase_table); i++)
42                 sum = ((sum << 31) | (sum >> 1)) + upcase_table[i];
43         return cpu_to_le32(sum);
44 }
45
46 int uct_write(off_t base, int fd)
47 {
48         if (write(fd, upcase_table, sizeof(upcase_table)) == -1)
49                 return errno;
50         upcase_entry.checksum = uct_checksum();
51         upcase_entry.start_cluster = cpu_to_le32(OFFSET_TO_CLUSTER(base));
52         upcase_entry.size = cpu_to_le64(sizeof(upcase_table));
53         return 0;
54 }