⛏️ index : haiku.git

/*
 * Copyright 2011, JΓ©rΓ΄me Duval, korli@users.berlios.de.
 * Copyright 2014 Haiku, Inc. All rights reserved.
 *
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		JΓ©rΓ΄me Duval, korli@users.berlios.de
 *		John Scipione, jscipione@gmail.com
 */


#include "Utility.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <Errors.h>

#include <util/convertutf.h>


status_t
get_volume_name(struct exfat_entry* entry, char* name, size_t length)
{
	if (entry == NULL || name == NULL)
		return B_BAD_VALUE;

	if (entry->type == EXFAT_ENTRY_TYPE_NOT_IN_USE)
		strlcpy(name, "", length);
	else if (entry->type == EXFAT_ENTRY_TYPE_LABEL) {
		ssize_t utf8Length = utf16le_to_utf8(entry->volume_label.name,
			entry->volume_label.length, name, length);
		if (utf8Length < 0)
			return (status_t)utf8Length;
	} else
		return B_NAME_NOT_FOUND;

	return B_OK;
}


void
get_default_volume_name(off_t partitionSize, char* name, size_t length)
{
	off_t divisor = 1ULL << 40;
	char unit = 'T';
	if (partitionSize < divisor) {
		divisor = 1UL << 30;
		unit = 'G';
		if (partitionSize < divisor) {
			divisor = 1UL << 20;
			unit = 'M';
		}
	}

	double size = double((10 * partitionSize + divisor - 1) / divisor);
		// %g in the kernel does not support precision...

	snprintf(name, length, "%g%ciB ExFAT Volume", size / 10, unit);
}