xref: /haiku/src/system/libroot/os/fs_query.cpp (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /*
2  * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <fs_query.h>
8 
9 #include <dirent.h>
10 #include <errno.h>
11 #include <fcntl.h>
12 #include <stdlib.h>
13 #include <string.h>
14 
15 #include <dirent_private.h>
16 #include <errno_private.h>
17 #include <syscalls.h>
18 #include <syscall_utils.h>
19 
20 
21 static DIR *
22 open_query_etc(dev_t device, const char *query,
23 	uint32 flags, port_id port, int32 token)
24 {
25 	if (device < 0 || query == NULL || query[0] == '\0') {
26 		__set_errno(B_BAD_VALUE);
27 		return NULL;
28 	}
29 
30 	// open
31 	int fd = _kern_open_query(device, query, strlen(query), flags, port, token);
32 	if (fd < 0) {
33 		__set_errno(fd);
34 		return NULL;
35 	}
36 
37 	// allocate the DIR structure
38 	DIR *dir = __create_dir_struct(fd);
39 	if (dir == NULL) {
40 		_kern_close(fd);
41 		return NULL;
42 	}
43 
44 	return dir;
45 }
46 
47 
48 DIR *
49 fs_open_query(dev_t device, const char *query, uint32 flags)
50 {
51 	return open_query_etc(device, query, flags, -1, -1);
52 }
53 
54 
55 DIR *
56 fs_open_live_query(dev_t device, const char *query,
57 	uint32 flags, port_id port, int32 token)
58 {
59 	// check parameters
60 	if (port < 0) {
61 		__set_errno(B_BAD_VALUE);
62 		return NULL;
63 	}
64 
65 	return open_query_etc(device, query, flags | B_LIVE_QUERY, port, token);
66 }
67 
68 
69 int
70 fs_close_query(DIR *dir)
71 {
72 	return closedir(dir);
73 }
74 
75 
76 struct dirent *
77 fs_read_query(DIR *dir)
78 {
79 	return readdir(dir);
80 }
81 
82 
83 status_t
84 get_path_for_dirent(struct dirent *dent, char *buffer, size_t length)
85 {
86 	if (dent == NULL || buffer == NULL)
87 		return B_BAD_VALUE;
88 
89 	return _kern_entry_ref_to_path(dent->d_pdev, dent->d_pino, dent->d_name,
90 		buffer, length);
91 }
92 
93