Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/ses/common.h
39534 views
1
/*-
2
* Copyright (C) 2021 Axcient, Inc. All rights reserved.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
6
* are met:
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
12
*
13
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23
* SUCH DAMAGE.
24
*/
25
26
typedef bool(*ses_cb)(const char *devname, int fd);
27
28
// Run a test function on every available ses device
29
static void
30
for_each_ses_dev(ses_cb cb, int oflags)
31
{
32
glob_t g;
33
int r;
34
unsigned i;
35
36
g.gl_pathc = 0;
37
g.gl_pathv = NULL;
38
g.gl_offs = 0;
39
40
r = glob("/dev/ses*", GLOB_NOCHECK | GLOB_NOSORT, NULL, &g);
41
ATF_REQUIRE_EQ(r, 0);
42
if (g.gl_matchc == 0)
43
return;
44
45
for(i = 0; i < g.gl_matchc; i++) {
46
int fd;
47
48
fd = open(g.gl_pathv[i], oflags);
49
ATF_REQUIRE(fd >= 0);
50
cb(g.gl_pathv[i], fd);
51
close(fd);
52
}
53
54
globfree(&g);
55
}
56
57
static bool
58
has_ses(void)
59
{
60
glob_t g;
61
int r;
62
63
r = glob("/dev/ses*", GLOB_NOCHECK | GLOB_NOSORT, NULL, &g);
64
ATF_REQUIRE_EQ(r, 0);
65
66
return (g.gl_matchc != 0);
67
}
68
69