1/*
2 * Copyright 2011, J��r��me Duval, korli@users.berlios.de.
3 * Copyright 2014 Haiku, Inc. All rights reserved.
4 *
5 * Distributed under the terms of the MIT License.
6 *
7 * Authors:
8 *		J��r��me Duval, korli@users.berlios.de
9 *		John Scipione, jscipione@gmail.com
10 */
11
12
13#include "Utility.h"
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <string.h>
18
19#include <Errors.h>
20
21#include "convertutf.h"
22
23
24status_t
25get_volume_name(struct exfat_entry* entry, char* name, size_t length)
26{
27	if (entry == NULL || name == NULL)
28		return B_BAD_VALUE;
29
30	if (entry->type == EXFAT_ENTRY_TYPE_NOT_IN_USE)
31		strlcpy(name, "", length);
32	else if (entry->type == EXFAT_ENTRY_TYPE_LABEL) {
33		ssize_t utf8Length = utf16le_to_utf8(entry->volume_label.name,
34			entry->volume_label.length, name, length);
35		if (utf8Length < 0)
36			return (status_t)utf8Length;
37	} else
38		return B_NAME_NOT_FOUND;
39
40	return B_OK;
41}
42
43
44void
45get_default_volume_name(off_t partitionSize, char* name, size_t length)
46{
47	off_t divisor = 1ULL << 40;
48	char unit = 'T';
49	if (partitionSize < divisor) {
50		divisor = 1UL << 30;
51		unit = 'G';
52		if (partitionSize < divisor) {
53			divisor = 1UL << 20;
54			unit = 'M';
55		}
56	}
57
58	double size = double((10 * partitionSize + divisor - 1) / divisor);
59		// %g in the kernel does not support precision...
60
61	snprintf(name, length, "%g%ciB ExFAT Volume", size / 10, unit);
62}
63