1/*
2** Copyright 2004, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3** Distributed under the terms of the MIT License.
4*/
5
6
7#include <fs_info.h>
8
9#include <errno.h>
10#include <fcntl.h>
11#include <stdio.h>
12#include <stdlib.h>
13
14#include <errno_private.h>
15#include <syscalls.h>
16#include <syscall_utils.h>
17
18
19dev_t
20dev_for_path(const char *path)
21{
22	struct stat stat;
23	int status = _kern_read_stat(-1, path, true, &stat, sizeof(struct stat));
24	if (status == B_OK)
25		return stat.st_dev;
26
27	RETURN_AND_SET_ERRNO(status);
28}
29
30
31dev_t
32next_dev(int32 *_cookie)
33{
34	return _kern_next_device(_cookie);
35		// For some reason, this one returns its error code directly
36}
37
38
39int
40fs_stat_dev(dev_t device, fs_info *info)
41{
42	status_t status = _kern_read_fs_info(device, info);
43
44	if (info != NULL) {
45		if (info->volume_name[0] == 0) {
46			// Give a default name to unnamed volumes
47			off_t divisor = 1ULL << 40;
48			off_t diskSize = info->total_blocks * info->block_size;
49
50			char unit = 'T';
51			if (diskSize < divisor) {
52				divisor = 1UL << 30;
53				unit = 'G';
54				if (diskSize < divisor) {
55					divisor = 1UL << 20;
56					unit = 'M';
57				}
58			}
59
60			double size = double((10 * diskSize + divisor - 1) / divisor);
61
62			sprintf(info->volume_name, "%g %ciB %s volume", size / 10, unit, info->fsh_name);
63		}
64	}
65
66	RETURN_AND_SET_ERRNO(status);
67}
68
69
70